Comment obtenir le nom de fichier du tampon actuel dans emacs?

19

L'une des principales fonctionnalités qui me manquent à propos de Vim, c'est qu'il enregistre toujours le nom du fichier actuel dans le %tampon ( plus d'informations ). Cela permet de lancer facilement des commandes comme:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Je voudrais avoir des fonctionnalités similaires sous emacs(version 24, si cela fait une différence), à ​​savoir avoir un moyen facile d'insérer le nom du fichier ouvert dans le tampon actuel.

Exemples de ce que je veux faire

Ici, je décris quelques cas d'utilisation de base pour mieux expliquer quand je ressens le besoin d'un tel raccourci

  1. Compiler: lorsque j'entre dans M-x compileemacs, il me demande une commande de compilation. Je voudrais entrer gcc (current-buffer)facilement.

  2. Charger le fichier: Lorsque je modifie mon fichier .emacs, je voudrais le charger immédiatement pour tester les modifications. La façon dont je le fais est M-x load-filepuis j'épelle toujours le nom . e m a c s. J'aimerais avoir un raccourci.

  3. Lancer des processus externes: j'ai donné du -shcomme exemple, seulement pour illustrer que je veux que le raccourci soit également disponible lorsque j'exécute des commandes shell avecM-!

Ce que j'ai trouvé jusqu'à présent

  • Cette question ici sur U&L. Les réponses données montrent essentiellement où trouver le nom de fichier d'un tampon afin que l'on puisse l'ajouter au kill-ring. Ce n'est pas exactement ce que je recherche, je ne veux pas avoir à tuer manuellement le nom de fichier avant de l'utiliser. (De plus, les solutions décrites dans les deux réponses ne semblent pas fonctionner aussi bien dans mes emacs et nécessitent des touches supplémentaires, ce qui les rend un peu pénibles).

EDIT : Un peu sans rapport, j'ai découvert pourquoi ces solutions ne fonctionnent pas. J'ai activé IDO, pour le meilleur ou pour le pire.

  • La (current-buffer)fonction décrite dans le manuel renvoie le nom du fichier dans le tampon actuel, mais nulle part dans les exemples que j'ai donnés ci-dessus, j'évalue le code elisp. Existe-t-il un moyen d'insérer le résultat de l'évaluation de cette fonction dans un (mini) tampon et de le lier de cette façon à un raccourci?

Ai-je tort de penser de cette façon?

J'apprends actuellement à utiliser emacs (cela fait en fait quelques mois) après des années d'utilisation de Vim. Je veux éviter un piège prévisible utilisant-emacs-in-a-Vim-way . Si vous pensez que ce que je demande n'est pas très émacieux , et qu'il devrait y avoir une meilleure façon (plus propre?) De le faire, veuillez le mentionner dans vos réponses.

rahmu
la source
À propos du nom de fichier, dans .emacs, indiquez (global-set-key (kbd "C-i") buffer-file-name)si vous souhaitez que ce soit Ctrl + I. À propos de .emacs, M-x load-file RETfait ce que vous voulez; vous n'avez pas besoin d'écrire quoi que ce soit.
Emanuel Berg
2
Ce flux de travail ne fonctionne pas très bien avec Emacs, car toutes les invites sur la ligne inférieure de la fenêtre sont dans un tampon dans Emacs (appelé un mini-tampon). Donc, si vous exécutez (buffer-file-name)pendant que vous tapez le mini-tampon, vous obtenez nil, car (current-buffer)c'est le mini-tampon. Vous pouvez également changer de tampon lorsque vous êtes dans le mini-tampon, il est donc difficile de savoir quel tampon est ce que vous pensez du tampon actuel au moment où le tampon actuel, comme Emacs le voit, est le mini-tampon.
Gilles 'SO- arrête d'être méchant'

Réponses:

11

Vous pouvez mettre une fonction comme suit dans votre .emacs et la lier à n'importe quelle touche que vous aimez.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Voir aussi cette question , elle semble être similaire.

easyb
la source
4

Une légère variante de la réponse de @ easyb consiste à copier le chemin vers votre kill ring au lieu de le placer dans votre tampon (utile pour les fichiers en lecture seule):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
user338519
la source