Mettez le nom du fichier actuel dans le mini-tampon

12

Comment puis-je insérer le nom de fichier du tampon de fichiers actif dans une commande?

Lorsque j'appelle une commande qui a besoin d'un nom de fichier, je le fais souvent à partir d'un tampon de fichiers et je veux le nom de ce fichier tout en tapant la commande dans le mini- tampon .

Je cherche une hypothétique C-xque je peux taper lors de la formation d'une ligne de commande dans le mini-tampon.

Donc, si le tampon actuel est un fichier nommé Lorem Ipsum.txt, je tape ceci:

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

le M-xgrepRETprésente un mini-tampon demandant la grepcommande. En réponse, j'ai tapé l'argument du motif regex ( 'foo') et inséré l'argument du nom de fichier ( C-x). Ce mini-tampon finira par:

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

Quelle commande existante obtient le nom de fichier du tampon de fichier actuel comme celui-ci? Quelle est sa liaison de clé par défaut?

gros nez
la source
3
Je suis surpris que personne ne soit mentionné M-n. Cela ne fonctionne pas partout, mais fonctionne dans de nombreux endroits. De plus, comme vous êtes en train de vous réjouir, vous aimerez peut-être lgrep et rgrep, qui sont un peu plus interactifs, je pense.
Malabarba

Réponses:

18

Quelle commande existante obtient le nom de fichier du tampon de fichier actuel comme celui-ci?

Malheureusement, il n'y a pas de commande prête à l'emploi pour cela, mais nous pouvons en créer une comme suit:

(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)))))

La magie réside dans la fonction de fenêtre sélectionnée du mini-tampon ; il fait la bonne chose en choisissant le dernier tampon avant l'activation du mini-tampon. Sinon, utiliser uniquement le nom du fichier tampon ne nous donnera pas le nom de fichier dans le mini -tampon . Fait intéressant, la même fonction peut être utilisée dans un tampon ordinaire ou un mini-tampon pour insérer le nom du fichier. Aucun traitement spécial n'est nécessaire.

Quelle est sa liaison de clé par défaut?

Il n'y en a pas, mais vous pouvez en choisir un qui vous convient et l'affecter comme suit:

(global-set-key (kbd "C-c f") 'name-of-the-file)

Placez les lignes de code lisp ci-dessus dans votre fichier init.el.

Cela fonctionne dans la plupart des cas triviaux, mais il est difficile de prédire quels conflits il pourrait avoir avec les modes que vous avez actifs lors de l'appel de cette fonction.

Que faire si le tampon ne visite pas un nom de fichier valide, tel que le tampon de travail? Ensuite, cette erreur est affichée dans la zone d'écho:

name-of-the-file: Wrong type argument: char-or-string-p, nil

Choisir un tampon valide avec un nom de fichier correct avant d'appeler le raccourci évitera de telles erreurs.

Il existe plusieurs autres solutions comme ci-dessus, mais elles diffèrent principalement dans la façon dont elles gèrent les exceptions ou les remplacements pour tout conflit. Par exemple, certains utilisent des hooks de mode pour rendre cette fonction disponible uniquement dans certains modes.

Utilisateur Emacs
la source
Pour que cela fonctionne, je pense qu'il faut enable-recursive-minibuffers.
Dieter.Wilhelm
Si la commande n'est censée être utilisée que dans le (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function mini-tampon , la liaison suivante peut être utilisée à la place nom-du-tampon` auquel je suis lié C-c bqui insère le nom du tampon actuel.
Dov Grobgeld
2

Lorsque vous utilisez dired-xle raccourci clavier C-x C-jest lié à dired-jump. Donc, à partir de votre tampon de fichiers, vous vous retrouvez sur la ligne droite et pouvez copier son nom de fichier avec w. Et puis vous pouvez le coller dans le mini tampon.

Une autre possibilité pour alléger la saisie du nom de fichier est l'achèvement standard du mini-tampon Emacs. Il suffit de taper les premiers caractères de votre nom de fichier, puis TAB.

Dieter.Wilhelm
la source
1
Vous pouvez copier le nom du fichier sur la ligne Dired actuelle simplement en utilisant w(commande dired-copy-filename-as-kill).
Drew
-1

La question demande une commande Emacs existante pour ce faire.

Comme indiqué précédemment:

Malheureusement, il n'y a pas de commande toute faite pour cela

qui se révèle être la réponse à cette question.

gros nez
la source
Il existe des moyens d'atténuer votre cas d'utilisation et d'autres ont suggéré des solutions de codage sur mesure, donc je pense que votre affirmation n'est pas correcte. Vous n'avez pas demandé spécifiquement pour un hors-the-box de façon Emacs!
Dieter.Wilhelm
J'ai demandé spécifiquement une commande existante à cet effet, alors oui, cette réponse est correcte.
bignose