web-dev-qa-db-fra.com

La fonction pour afficher le chemin complet du fichier actuel dans un mini tampon

Je dois obtenir le chemin complet du fichier que je modifie avec emacs.

  • Y a-t-il une fonction pour cela?
  • Si non, quelle serait la fonction elisp pour l'obtenir?
  • Comment puis-je copier le résultat (nom du chemin) dans un presse-papiers afin de pouvoir le réutiliser?

J'utilise Mac OS X et Aqumacs. 

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

AJOUTÉE

 (defun show-file-name () 
 "Affiche le nom complet du fichier de chemin d'accès dans le mini-tampon." 
 (interactif) 
 (message (nom-fichier-tampon)) .__ ( kill-new (nom_fichier_fichier_fichier)) 
) 
 (clé_globale "\ C-cz" 'nom-fichier-show) 

En combinant les deux réponses que j'ai obtenues, je pourrais obtenir ce que je veux. Merci pour les réponses. Et quelques questions supplémentaires.

  • Qu'est-ce que pour (nom de fichier)?
  • Puis-je copier le nom du chemin d'accès dans le presse-papiers du système (OS), et non pas l'anneau de mise à mort, afin de pouvoir utiliser les informations avec les autres applications?
85
prosseek

C'est la fonction intégrée buffer-file-name qui vous donne le chemin complet de votre fichier.

La meilleure chose à faire est que votre fenêtre emacs affiche toujours le nom de votre système et le chemin complet du tampon en cours d'édition:

(setq frame-title-format
      (list (format "%s %%S: %%j " (system-name))
        '(buffer-file-name "%f" (dired-directory dired-directory "%b"))))

Vous pouvez aussi faire quelque chose comme ça:

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want
79
Jérôme Radix

Pour reprendre la réponse de Jérôme Radix, si vous voulez juste voir rapidement le chemin du fichier du tampon actuel, vous pouvez faire M-: buffer-file-name

59
asmeurer

Mon astuce consiste à faire un C-x C-f comme ouvrir un fichier, il pré-remplira le mini-jeu avec le chemin du fichier actuel, C-g pour quitter. Plus rapide que M-: buffer-file-name mais beaucoup plus laid que toutes les autres méthodes.

36
Julien Palard

L’implémentation directe de ce que vous voulez est:

(defun copy-full-path-to-kill-ring ()
  "copy buffer's full path to kill ring"
  (interactive)
  (when buffer-file-name
    (kill-new (file-truename buffer-file-name))))

Cela dit, je trouve extrêmement utile de pouvoir obtenir le chemin complet de ce qui se trouve dans le mini-tampon, et voici ce que j’utilise:

(define-key minibuffer-local-completion-map "\C-r" 'resolve-sym-link)
(defun resolve-sym-link ()
  "Try to resolve symbolic links into true paths."
  (interactive)
  (beginning-of-line)
  (let* ((file (buffer-substring (point)
                                 (save-excursion (end-of-line) (point))))
         (file-dir (file-name-directory file))
         (file-true-dir (file-truename file-dir))
         (file-name (file-name-nondirectory file)))
    (delete-region (point) (save-excursion (end-of-line) (point)))
    (insert (concat file-true-dir file-name))))

Et puis si je le veux dans le presse-papier, je tue la ligne (C-a C-k). Mais nous pourrions facilement copier le nom réel dans le presse-papier dans la commande ci-dessus, il suffit de changer la dernière ligne pour être:

(insert (kill-new (concat file-true-dir file-name)))))

La nouvelle partie est l'appel à 'kill-new qui place la chaîne dans le kill-ring.

15
Trey Jackson

Pas besoin de fonction supplémentaire, juste

M-! pwd
6
thanhpk

Le code suivant est déjà utilisé depuis longtemps . Il copie le chemin d'accès complet du fichier à l'anneau de mise à mort lorsque j'appuie sur le bouton central de la souris sur le nom du tampon dans le mode-line Il copie simplement le nom du tampon dans l'anneau lorsque je presse Maj-souris-2 sur le nom du tampon dans la ligne de mode.

(defun copy-buffer-file-name (event &optional bufName)
  "Copy buffer file name to kill ring.
If no file is associated with buffer just get buffer name.
"
  (interactive "eP")
  (save-selected-window
    (message "bufName: %S" bufName)
    (select-window (posn-window (event-start event)))
    (let ((name (or (unless bufName (buffer-file-name)) (buffer-name))))
      (message "Saved file name \"%s\" in killring." name)
      (kill-new name)
      name)))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-2] 'copy-buffer-file-name)
(define-key mode-line-buffer-identification-keymap [mode-line S-mouse-2] '(lambda (e) (interactive "e") (copy-buffer-file-name e 't)))
3
Tobias

C-x C-d, également appelable via M-x list-directory, vous montrera le répertoire de votre fichier actuel et il vous suffira d'appuyer sur la touche "Entrée" pour vider le mini-tampon. Des détails supplémentaires sont disponibles ici .

2
MLev

Puis-je copier le nom du chemin d'accès dans le presse-papiers du système (OS), et non pas l'anneau de mise à mort, afin de pouvoir utiliser les informations avec les autres applications?

Vous pouvez le faire si vous utilisez quelque chose comme xclip (Linux), pbcopy (Mac), putclip (Cygwin).

Personnellement, j'utilise les scripts d'emballage c et p pour copier et coller, respectivement, la première lecture de l'entrée standard, cette dernière en écriture sur la sortie standard. De cette façon, cela fonctionne sur toutes mes plateformes de développement:

(Shell-command (format "echo '%s' | c" buffer-file-name))

Je trouve cela plus fiable et configurable que d'utiliser le support du presse-papier d'Emacs. Par exemple, ma commande c copie les entrées dans les 3 presse-papiers de Linux (primaire, secondaire, presse-papiers), afin que je puisse les coller avec un clic droit ou intermédiaire.

1
Barry Kelly

C-x C-b affiche une liste des tampons et le chemin du fichier pour chaque tampon, le cas échéant.

1
David

copy-buffer-file-name-as-kill de [0] fait exactement ce dont vous avez besoin, je pense. Il a également la possibilité de copier uniquement le nom du répertoire ou le nom du fichier.

[0] http://www.emacswiki.org/emacs/download/buffer-extension.el

0
dolzenko

C-u C-x C-b liste les tampons des fichiers actuellement en visite. 

0
memeplex

Le moyen le plus simple et serait 

(buffer-name)<(C-x)(C-e)> for the file name to appear in the echo area

(buffer-name)<(C-u)(C-x)(C-e)> would print the location <here>

Empruntant à Trey Jackson

(defun buffer-kill-path ()
  "copy buffer's full path to kill ring"
  (interactive)
  (kill-new (buffer-file-name)))

Vous pouvez trouver plus d'informations sur site

0
DJJ