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

19

Uma das principais características que sinto falta do Vim é que ele sempre salva o nome do arquivo atual no %buffer ( mais informações ). Isso permite iniciar 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 fizer 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, descrevo alguns casos de uso básicos para explicar melhor quando sinto a necessidade de um atalho.

  1. Compilar: Ao entrar no M-x compileemacs, solicito um comando de compilação. Eu gostaria de entrar gcc (current-buffer)facilmente.

  2. Carregar arquivo: ao editar meu arquivo .emacs, gostaria de carregá-lo imediatamente para testar as alterações. O jeito que eu faço é M-x load-filee sempre soletro o nome . e m a c s. Eu gostaria de ter um atalho.

  3. Iniciar processos externos: dei du -shcomo exemplo, apenas para ilustrar que desejo que o atalho também esteja disponível quando eu executar comandos shell comM-!

O que eu encontrei até agora

  • Esta pergunta aqui em U&L. As respostas dadas estão basicamente mostrando onde encontrar o nome do arquivo de um buffer para que você possa adicioná-lo ao kill-ring. Não é exatamente o que estou procurando, não quero matar manualmente o nome do arquivo antes de usá-lo. (As soluções descritas nas duas respostas também parecem não funcionar tão bem no meu emacs e exigem pressionamentos de teclas adicionais, o que os torna um pouco problemáticos).

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

  • A (current-buffer)função 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 dessa função em um (mini) buffer e vinculá-lo a um atalho?

Estou errado em pensar assim?

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

rahmu
fonte
Sobre o nome do arquivo, em .emacs, coloque (global-set-key (kbd "C-i") buffer-file-name)se você quiser que seja Ctrl + I. Sobre .emacs, M-x load-file RETfaz o que você deseja; você não precisa escrever nada.
Emanuel Berg
2
Esse fluxo de trabalho não combina muito bem com o Emacs, porque todos os prompts na linha inferior da janela estão em um buffer no Emacs (chamado minibuffer). Portanto, se você executar (buffer-file-name)enquanto digita o minibuffer, obtém nil, porque (current-buffer)é o minibuffer. Você também pode alternar os buffers no minibuffer, por isso é difícil acompanhar qual buffer é o que você acha do buffer atual no momento em que o buffer atual, como o Emacs vê, é o minibuffer.
Gilles 'SO- stop be evil'

Respostas:

11

Você pode colocar uma função como segue em seu .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.

easyb
fonte
4

Uma pequena variação na resposta do @ easyb é copiar o caminho para o seu anel de morte em vez de colocá-lo no 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)))))
user338519
fonte