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.
Compilar: Ao entrar no
M-x compile
emacs, solicito um comando de compilação. Eu gostaria de entrargcc (current-buffer)
facilmente.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-file
e sempre soletro o nome . e m a c s. Eu gostaria de ter um atalho.Iniciar processos externos: dei
du -sh
como 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.
(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.
(global-set-key (kbd "C-i") buffer-file-name)
se você quiser que seja Ctrl + I. Sobre .emacs,M-x load-file RET
faz o que você deseja; você não precisa escrever nada.