Die Funktion aktuelle Datei zu zeigen, ist vollständiger Pfad in Mini-Puffer
Frage
Ich brauche den vollständigen Pfad der Datei zu erhalten, dass ich mit Emacs bin die Bearbeitung.
- Gibt es eine Funktion für das?
- Wenn nicht, was die elisp Funktion bekommen, dass sein würde?
- Wie kann ich das Ergebnis (Pfadname) kopieren in die Zwischenablage, so dass ich sie wiederverwenden können?
Ich verwende Mac OS X und Aqumacs.
(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
ADDED
(defun show-file-name () "Show the full path file name in the minibuffer." (interactive) (message (buffer-file-name)) (kill-new (file-truename buffer-file-name)) ) (global-set-key "\C-cz" 'show-file-name)
Die Kombination der beiden Antworten, die ich bekam, konnte ich bekommen, was ich will. Danke für die Antworten. Und noch ein paar Fragen.
- Was ist für (Datei-truename)?
- Kann ich die Pfadnamen im System kopieren (O) 's Zwischenablage, nicht der Kill-Ring so, dass ich die Informationen mit den anderen Anwendungen verwenden kann?
Lösung
Es ist die eingebaute Funktion buffer-file-name
, dass Sie den vollständigen Pfad der Datei gibt.
Das Beste, was zu tun ist, Ihre Emacs-Fenster müssen immer Ihre System-Namen zeigen und der vollständige Pfad des Puffer sind Sie gerade bearbeiten:
(setq frame-title-format
(list (format "%s %%S: %%j " (system-name))
'(buffer-file-name "%f" (dired-directory dired-directory "%b"))))
Sie können auch etwas tun:
(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
Andere Tipps
Um von Jérôme Radix Antwort zu leihen, wenn Sie nur schnell den Dateipfad des aktuellen Puffers wollen, um zu sehen, Sie M-: buffer-file-name
tun können.
Mein Trick ist, ein C-x C-f
zu tun, wie eine Datei zu öffnen, es wil die minibuff mit dem aktuellen Dateipfad prefill, C-g
zu beenden. Schneller als M-: buffer-file-name
aber weit weit hässliche als andere Methoden.
Die direkte Umsetzung von dem, was Sie wollen, ist:
(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))))
sagte, finde ich es unglaublich nützlich Lage sein, den vollständigen Pfad zu bekommen, was in dem Minipuffer ist, und das ist, was ich benutze:
(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))))
Und dann, wenn ich es in die Zwischenablage will, muss ich töten nur die Linie ( C-C-k ). Aber wir können die truename in die Zwischenablage in dem obigen Befehl leicht zu kopieren, nur die letzte Zeile ändern zu sein:
(insert (kill-new (concat file-true-dir file-name)))))
Der neue Teil ist der Aufruf 'kill-new
, die die Zeichenfolge im Kill-Ring bringt.
Keine Notwendigkeit für zusätzliche Funktion, nur
M-! pwd
Ich habe den folgenden Code bereits für eine lange Zeit. Er kopiert der vollständige Dateipfad zu dem Kill-Ring, wenn ich mit der mittleren Maustaste auf den Puffernamen in der Mode-Linie drücken. Er kopiert nur die Puffer-Namen den Kill-Ring, wenn ich Shift-Maus-2 auf dem Puffer-Namen in der Mode-Linie drücken.
(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
, auch über M-x list-directory
aufrufbar, zeigen Sie das Verzeichnis für die aktuelle Datei, und Sie nur die „Enter“ Taste drücken müssen den Minipuffer zu löschen. Weitere Informationen finden Sie hier .
Kann ich kopieren Sie die Pfadnamen-System (OS) 's Zwischenablage, nicht der Kill-Ring so, dass ich die Informationen mit den anderen Anwendungen verwenden kann?
Sie können, wenn Sie berappen, um so etwas wie xclip (Linux), pbcopy (Mac), putclip (Cygwin).
Ich persönlich Wrapper-Skripten c
und p
für die Kopie verwenden und jeweils einfügen, die erste Lesung von der Standardeingabe, letztere Schreiben an der Standardausgabe. Auf diese Weise funktioniert dies auf alle meine Entwicklungsplattformen:
(shell-command (format "echo '%s' | c" buffer-file-name))
Das finde ich zuverlässiger und konfigurierbar als die Emacs-Zwischenablage-Unterstützung. Zum Beispiel meiner c
Befehl kopiert die Eingabe in alle 3 Zwischenböden auf Linux (primär, sekundär, Zwischenablage), so dass ich mit beide Strg-V oder Mittelklick einfügen kann.
C-x C-b
zeigt eine Liste von Puffern und der Dateipfad für jeden Puffer, wo anwendbar.
C-u C-x C-b
Listen Puffer besuchen zur Zeit Dateien.
Der einfachste Weg, und wäre
(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>
Ausleihe von Trey Jackson Ich kam mit dieser:
(defun buffer-kill-path ()
"copy buffer's full path to kill ring"
(interactive)
(kill-new (buffer-file-name)))
Sie finden weitere Informationen finden Sie auf Website
copy-buffer-file-name-as-kill
von [0] tut genau das, was Sie brauchen, denke ich. Es hat auch die Möglichkeit, nur Verzeichnisnamen zu kopieren, oder einfach nur Dateinamen.
[0] http://www.emacswiki.org/emacs/download /buffer-extension.el