Je dois obtenir le chemin complet du fichier que je modifie avec emacs.
J'utilise Mac OS X et Aqumacs.
(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
(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.
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
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
.
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.
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.
Pas besoin de fonction supplémentaire, juste
M-! pwd
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)))
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 .
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.
C-x C-b
affiche une liste des tampons et le chemin du fichier pour chaque tampon, le cas échéant.
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
C-u C-x C-b
liste les tampons des fichiers actuellement en visite.
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