Qual comando existente obtém o nome do arquivo do buffer de arquivo atual como este?
Infelizmente, não existe um comando pronto para isso, mas podemos fazer um da seguinte maneira:
(defun name-of-the-file ()
"Gets the name of the file the current buffer is based on."
(interactive)
(insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))
A mágica está na função de janela selecionada pelo minibuffer ; ele faz a coisa certa escolhendo o último buffer antes de o minibuffer ser ativado. Caso contrário, usar apenas o nome do arquivo de buffer não nos colocará o nome do arquivo no minibuffer. Curiosamente, a mesma função pode ser usada em um buffer ou minibuffer regular para inserir o nome do arquivo. Nenhum tratamento especial é necessário.
Qual é a sua ligação de chave padrão?
Não há nenhum, mas você pode escolher um conveniente e atribuí-lo da seguinte forma:
(global-set-key (kbd "C-c f") 'name-of-the-file)
Coloque as linhas de código lisp acima no seu arquivo init.el.
Isso funciona na maioria dos casos triviais, mas difícil de prever quais conflitos podem ter com os modos que você estiver ativo ao invocar essa função.
E se o buffer não estiver visitando um nome de arquivo válido, como o buffer temporário? Então este erro é mostrado na área de eco:
name-of-the-file: Wrong type argument: char-or-string-p, nil
Escolher um buffer válido com um nome de arquivo adequado antes de chamar o atalho evitará esses erros.
Existem várias outras soluções, como as acima, mas diferem principalmente na maneira como lidam com exceções ou substituições para qualquer conflito. Por exemplo, alguns empregam ganchos de modo para disponibilizar esta função apenas em certos modos.
M-n
. Não funciona em todos os lugares, mas funciona em muitos lugares. Além disso, como você está grepping, você pode gostar de lgrep e rgrep, que são um pouco mais interativos, eu acho.