Preciso obter o caminho completo do arquivo que estou editando com o emacs.
- Existe uma função para isso?
- Se não, qual seria a função elisp para conseguir isso?
- Como posso copiar o resultado (nome do caminho) para uma área de transferência para poder reutilizá-lo?
Estou usando Mac OS X e Aqumacs.
(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
ADICIONADO
(defun show-file-name () "Mostra o caminho completo do nome do arquivo no minibuffer." (interativo) (mensagem (nome do arquivo-buffer)) (kill-new (file-truename buffer-file-name)) ) (global-set-key "\ C-cz" 'show-file-name)
Combinando as duas respostas que obtive, posso conseguir o que quero. Obrigado pelas respostas. E mais algumas perguntas.
- Para que serve (file-truename)?
- Posso copiar o nome do caminho para a área de transferência do sistema (SO), não para o kill ring, para que eu possa usar as informações com os outros aplicativos?
buffer-file-name
é uma variávelM-x
?funcall
para chamar uma função que é armazenada como o valor de uma variávelfoo
, porque se você usasse,(foo)
estaria usando o slot de função defoo
em vez do slot de valor.Pegando emprestado a resposta de Jérôme Radix, se você apenas deseja ver rapidamente o caminho do arquivo do buffer atual, pode fazer
M-: buffer-file-name
.Como alternativa, digite
(buffer-file-name)
o buffer em algum lugar e executeC-x C-e
no parêntese de fechamento (isso funcionará em qualquer modo, não apenas no modo lisp).fonte
buffer-file-name
como uma função, mas não aparece emM-x
, mas apareceM-:
comoemacs eval
, lá posso executar o comando, graças a sua resposta :)M-x
executa apenas funções interativas, enquantoM-:
executa qualquer função elisp.Meu truque é fazer um
C-x C-f
like para abrir um arquivo, preenche o minibuff com o caminho do arquivo atual,C-g
para sair. Mais rápido,M-: buffer-file-name
mas muito mais feio do que qualquer outro método.fonte
A implementação direta do que você deseja é:
Dito isso, acho extremamente útil ser capaz de obter o caminho completo do que está no minibuffer, e é isso que eu uso:
E então se eu quiser na área de transferência, eu simplesmente mato a linha ( C-a C-k). Mas poderíamos facilmente copiar o nome verdadeiro para a área de transferência no comando acima, basta alterar a última linha para ser:
A nova parte é a chamada
'kill-new
que coloca a corda no ringue de morte.fonte
Não há necessidade de função extra, apenas
fonte
C-x C-f
, executandoM-! pwd
,M-x cd
selecionando um diretório diferente e executandoM-! pwd
novamente.Eu tenho o seguinte código já em uso há muito tempo. Ele copia o caminho completo do arquivo para o kill ring quando pressiono o botão do meio do mouse no nome do buffer na linha de modo. Ele copia apenas o nome do buffer para o kill-ring quando pressiono shift-mouse-2 no nome do buffer na linha de modo.
fonte
C-x C-d
, também chamada viaM-x list-directory
, mostrará o diretório do seu arquivo atual, e você só precisa pressionar a tecla "Enter" para limpar o minibuffer. Detalhes adicionais estão disponíveis aqui .fonte
C-x C-b
mostra uma lista de buffers e o caminho do arquivo para cada buffer, quando aplicável.fonte
C-u C-x C-b
lista os buffers que estão visitando os arquivos.fonte
Você pode se você pagar algo como xclip (Linux), pbcopy (Mac), putclip (Cygwin).
Eu pessoalmente uso scripts de wrapper
c
ep
para copiar e colar respectivamente, a primeira leitura da entrada padrão, a última gravando na saída padrão. Dessa forma, isso funciona em todas as minhas plataformas de desenvolvimento:Acho isso mais confiável e configurável do que usar o suporte da área de transferência do Emacs. Por exemplo, meu
c
comando copia a entrada para todas as 3 pranchetas no Linux (primária, secundária, área de transferência), para que eu possa colar com Ctrl-V ou clique com o botão do meio.fonte
date | xclip
exclip file
ambos funcionam conforme anunciado (armazenando a data ou o conteúdo do arquivo no primário) se digitados no shell. Mas se eu digitar qualquer um desses comandos após M-! no emacs (e pressione return) nada acontece; o cursor permanece no minibuffer como se esperasse mais entrada; e se eu interromper para recuperar o controle, nada foi armazenado no primário.(shell-command (format "echo '%s' | xsel -i" buffer-file-name))
- e quando transformada em um comando interativo (como sugerido na resposta mais votada por @JeromeRadix acima), esta é uma GRANDE VITÓRIA! Obrigado!A maneira mais simples e seria
Pegando emprestado de Trey Jackson, eu vim com isso:
Você pode encontrar mais informações no site
fonte
copy-buffer-file-name-as-kill
de [0] faz exatamente o que você precisa, eu acho. Também tem a opção de copiar apenas o nome do diretório ou apenas o nome do arquivo.[0] http://www.emacswiki.org/emacs/download/buffer-extension.el
fonte