Coloque o nome do arquivo atual no minibuffer

12

Como posso inserir o nome do arquivo do buffer de arquivo ativo em um comando?

Quando invoco um comando que precisa de um nome de arquivo, geralmente o faço a partir de um buffer de arquivo e quero o nome desse arquivo enquanto digito o comando no minibuffer.

Estou procurando uma hipótese C-xque possa digitar durante a formação de uma linha de comando no minibuffer.

Portanto, se o buffer atual for um arquivo nomeado Lorem Ipsum.txt, digite-o:

M-x grep RET 'foo' SPC C-x … RET

o M-xgrepRETapresenta um minibuffer solicitando o grepcomando. Em resposta, digitei o argumento padrão regex ( 'foo') e inseri o argumento filename ( C-x). Esse minibuffer acabará como:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

Qual comando existente obtém o nome do arquivo do buffer de arquivo atual como este? Qual é a sua ligação de chave padrão?

nariz grande
fonte
3
Estou surpreso que ninguém tenha mencionado 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.
Malabarba 9/09/15

Respostas:

18

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.

Usuário Emacs
fonte
Para que isso funcione, acho que é preciso enable-recursive-minibuffers.
precisa saber é o seguinte
Se o comando deve ser usado apenas no minibuffer, a seguinte ligação pode ser usada em vez do (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function nome do buffer` ao qual eu liguei e C-c bque insere o nome atual do buffer.
Dov Grobgeld
2

Ao usar dired-xo atalho do teclado, C-x C-jé vinculado dired-jump. Portanto, a partir do seu buffer de arquivo, você acaba na linha direcional direita e pode copiar seu nome de arquivo com w. E então você pode colá-lo no mini buffer.

Outra possibilidade para aliviar a digitação do nome do arquivo é a conclusão padrão do mini-buffer Emacs. Basta digitar os primeiros caracteres do seu nome de arquivo e, em seguida, TAB.

Dieter.Wilhelm
fonte
1
Você pode copiar o nome do arquivo na linha Dired atual apenas usando w(comando dired-copy-filename-as-kill).
Tirou
-1

A pergunta pede um comando existente do Emacs para fazer isso.

Como dito anteriormente:

Infelizmente, não existe um comando pronto para isso

que acaba por ser a resposta para esta pergunta.

nariz grande
fonte
Existem maneiras de aliviar o seu caso de uso e outras sugeriram soluções de codificação personalizadas, então acho que sua afirmação não está correta. Você não pediu especificamente para um out-of-the-box maneira Emacs'!
precisa saber é o seguinte
Eu pedi especificamente um comando existente para esse fim, portanto, sim, esta resposta está correta.
precisa saber é