Como obter o nome do arquivo do buffer atual no emacs?

18

Uma das principais características que sinto falta sobre o Vim, é que ele sempre salva o nome do arquivo atual no % buffer ( mais informações . Isso permite lançar comandos facilmente como:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Eu gostaria de ter uma funcionalidade semelhante em emacs (versão 24, se isso faz alguma diferença), ou seja, ter uma maneira fácil de inserir o nome do arquivo aberto no buffer atual.

Exemplos do que eu quero fazer

Aqui eu descrevo alguns casos básicos de uso para explicar melhor quando sinto a necessidade de tal atalho

  1. Compile: Quando eu digito M-x compile emacs me pede um comando de compilação. Gostaria de inserir gcc (current-buffer) facilmente.

  2. Load-file: quando estou editando meu arquivo .emacs, gostaria de carregá-lo imediatamente para testar as alterações. A maneira que eu faço é M-x load-file e então eu sempre soletro o nome . e m a < kbd> c s . Eu gostaria de ter um atalho.

  3. Lançar processos externos: Eu dei du -sh como exemplo, apenas para ilustrar que eu quero que o atalho também esteja disponível quando eu executar os comandos do shell com M-!

O que eu encontrei até agora

  • Esta questão aqui em U & L. As respostas dadas são basicamente mostrando onde encontrar o nome do arquivo de um buffer, então pode-se adicioná-lo ao kill-ring. Não é exatamente o que estou procurando, não quero ter que matar manualmente o nome do arquivo antes de usá-lo. (Também soluções descritas em ambas as respostas não parecem funcionar tão bem no meu emacs e exigem pressionamentos de teclas adicionais, tornando-os um pouco de dor).

EDITAR : Um pouco não relacionado, descobri por que essas soluções não funcionam. Eu tenho IDO ativado, para melhor ou pior.

  • A função (current-buffer) descrita no manual retorna o nome do arquivo no buffer atual, mas em nenhum lugar nos exemplos que dei acima, estou avaliando o código elisp. Existe uma maneira de inserir o resultado da avaliação desta função em um (mini) buffer e ligando este caminho a um atalho?

Estou errado em pensar assim?

Atualmente, estou aprendendo a usar o emacs (já faz alguns meses) depois de anos de uso do Vim. Eu quero evitar uma armadilha previsível usando o emacs-in-a-Vim-way . Se você acha que o que eu estou pedindo não é muito emacs-y , e deve haver uma maneira melhor (mais limpa?) De fazê-lo, por favor, mencione-o em suas respostas.

    
por rahmu 09.08.2012 / 11:30

2 respostas

10

Você pode colocar uma função como segue em seus .emacs e vinculá-la a qualquer tecla que desejar.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Veja também esta pergunta , parece ser semelhante.

    
por 13.08.2012 / 14:58
4

Uma ligeira variante na resposta do @ easyb é copiar o caminho para o seu kill ring em vez de colocá-lo em seu buffer (útil para arquivos somente leitura):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
    
por 17.11.2015 / 20:24