Die Funktion zum Anzeigen des vollständigen Pfads der aktuellen Datei im Minipuffer

98

Ich muss den vollständigen Pfad der Datei abrufen, die ich mit Emacs bearbeite.

  • Gibt es dafür eine Funktion?
  • Wenn nicht, was wäre die Elisp-Funktion, um das zu bekommen?
  • Wie kann ich das Ergebnis (Pfadname) in eine Zwischenablage kopieren, damit ich es wiederverwenden kann?

Ich benutze Mac OS X und Aqumacs.

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

HINZUGEFÜGT

(defun show-file-name ()
  "Zeigen Sie den vollständigen Pfaddateinamen im Minibuffer an."
  (interaktiv)
  (Nachricht (Pufferdateiname))
  (kill-new (Datei-Truename Puffer-Dateiname))
)
(global-set-key "\ C-cz" 'show-file-name)

Wenn ich die beiden Antworten kombiniere, kann ich bekommen, was ich will. Danke für die Antworten. Und noch ein paar Fragen.

  • Wofür ist (Dateiname)?
  • Kann ich den Pfadnamen in die Zwischenablage des Systems (OS) kopieren, nicht in den Kill Ring, damit ich die Informationen mit den anderen Apps verwenden kann?
prosseek
quelle

Antworten:

91

Es ist die integrierte Funktion buffer-file-name, die Ihnen den vollständigen Pfad Ihrer Datei gibt.

Am besten lassen Sie in Ihrem Emacs-Fenster immer Ihren Systemnamen und den vollständigen Pfad des Puffers anzeigen, den 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 so 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
Jérôme Radix
quelle
7
In Emacs 24 buffer-file-nameist eine Variable
Kaserne
5
... aber auch noch eine Funktion
Phils
16
Wenn es eine Funktion ist, warum erscheint sie dann nicht in M-x?
Asmeurer
8
asmeurer - weil es nicht interaktiv ist
Ben Fitzgerald
2
@Talespin_Kit Ja, absolut. Elisp ist ein "lisp-2" im Gegensatz zu einem "lisp-1", was bedeutet, dass es zwei unabhängige Namensräume (Variablen und Funktionen) gibt. Jedes Symbol hat daher einen "Funktionssteckplatz" und einen "Werteschlitz", und auf welchen Steckplatz zugegriffen wird, hängt vom Kontext ab. In der Praxis gibt es viele Beispiele (z. B. ist jeder Nebenmodusname sowohl eine Funktion als auch eine Variable). Dies ist auch der Grund, warum Sie ähnliche funcallFunktionen verwenden müssen, um eine Funktion aufzurufen, die als Wert einer Variablen gespeichert ist foo, da Sie bei (foo)Verwendung den Funktionsbereich von foound nicht den Wertbereich verwenden würden.
Phils
73

Wenn Sie nur den Dateipfad des aktuellen Puffers anzeigen möchten, können Sie dies tun, um die Antwort von Jérôme Radix auszuleihen M-: buffer-file-name.

Alternativ können Sie (buffer-file-name)den Puffer irgendwo eingeben und C-x C-ein der schließenden Klammer ausführen (dies funktioniert in jedem Modus, nicht nur im Lisp-Modus).

asmeurer
quelle
3
Danke, dachte ich , die buffer-file-nameals eine Funktion, aber es erscheint nicht in M-x, sondern erscheint in M-:wie emacs evales ich den Befehl ausführen kann, dank Ihrer Antwort :)
PeterZD
6
Ja, führt M-xnur interaktive Funktionen aus, während M-:alle Elisp-Funktionen ausgeführt werden.
Asmeurer
40

Mein Trick besteht darin C-x C-f, eine Datei zu öffnen, um den Minibuff mit dem aktuellen Dateipfad zu füllen und C-gzu beenden. Schneller als M-: buffer-file-nameaber weitaus hässlicher als alle anderen Methoden.

Julien Palard
quelle
Ich mache das auch Es ist nicht so hardcore emacs-y, aber wenn mir nur der Pfad zur aktuellen Datei wichtig ist, funktioniert es.
andrunix
Wenn Sie eine Datei öffnen, z. B. A, und dann zu einer anderen Datei springen, z. B. B, z. B. mit einer Sprungfunktion zur Definition eines Plugins, zeigt diese Methode den Pfad von A, nicht von B! Daher bietet diese Antwort nicht immer das, was das OP verlangt.
Abhishek Anand
4
Cx Cv zeigt Ihnen nicht nur den aktuellen Pfad, sondern auch den Namen der aktuellen Datei
kuzzooroo
@kuzzooroo, das für Benutzer ohne Ido-Modus geeignet ist (Der Name wird in Cx Cf angezeigt, wenn Sie den Ido-Modus verwenden).
Julien Palard
16

Die direkte Umsetzung Ihrer Wünsche 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))))

Trotzdem finde ich es unglaublich nützlich, den vollständigen Pfad des Minibuffers abrufen zu können, und das verwende ich:

(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 wenn ich es dann in der Zwischenablage haben möchte, töte ich einfach die Zeile ( C-a C-k). Aber wir könnten den Truenamen im obigen Befehl leicht in die Zwischenablage kopieren. Ändern Sie einfach die letzte Zeile in:

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

Der neue Teil ist der Aufruf, bei 'kill-newdem die Zeichenfolge in den Kill-Ring eingefügt wird.

Trey Jackson
quelle
Können Sie erläutern, wie diese Einstellungen verwendet werden? Und was bedeutet "\ Cr"?
Modellbauer
Keine Ursache. Ich habe es herausgefunden. Ich denke, es ist nützlich, wenn ich mich im Ido-Modus befinde und auf eine Datei zeige. Dann drücke ich einfach Cr, um den vollständigen Pfad dieser Datei zu erhalten. In der Tat nützlich. Ich weiß jedoch immer noch nicht, warum ich \ C anstelle von C verwende.
Modellierer
11

Keine zusätzliche Funktion erforderlich, nur

M-! pwd
thanhpk
quelle
Dies kann zwar funktionieren, funktioniert jedoch nicht auf Windows-Systemen und berücksichtigt nicht die Tatsache, dass sich das aktuelle Arbeitsverzeichnis von emacs vom Verzeichnis der aktuellen Pufferdatei unterscheiden kann. Sie können dies selbst sehen, indem Sie eine Datei mit besuchen C-x C-f, ausführen M-! pwd, M-x cdein anderes Verzeichnis auswählen und dann M-! pwderneut ausführen .
Josaphatv
3

Ich habe den folgenden Code bereits seit langer Zeit in Gebrauch. Es kopiert den vollständigen Dateipfad zum Kill Ring, wenn ich die mittlere Maustaste auf den Puffernamen in der Moduszeile drücke. Es kopiert nur den Puffernamen in den Kill-Ring, wenn ich Shift-Mouse-2 auf den Puffernamen in der Moduszeile drücke.

(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)))
Tobias
quelle
3

C-x C-d, auch aufrufbar über M-x list-directory, zeigt Ihnen das Verzeichnis für Ihre aktuelle Datei an, und Sie müssen nur die Eingabetaste drücken, um den Minibuffer zu löschen. Weitere Details finden Sie hier .

MLev
quelle
Meine Lieblingsantwort, einfach, schnell und einfach!
Ticktock
2

C-x C-b zeigt eine Liste der Puffer und gegebenenfalls den Dateipfad für jeden Puffer an.

David
quelle
2

C-u C-x C-b listet Puffer auf, die gerade Dateien besuchen.

memeplex
quelle
1

Kann ich den Pfadnamen in die Zwischenablage des Systems (OS) kopieren, nicht in den Kill Ring, damit ich die Informationen mit den anderen Apps verwenden kann?

Sie können, wenn Sie zu etwas wie xclip (Linux), pbcopy (Mac), putclip (Cygwin) berappen.

Ich persönlich verwende Wrapper-Skripte cund pzum Kopieren bzw. Einfügen, wobei die erste Lesung von der Standardeingabe erfolgt, die letztere in die Standardausgabe. Auf diese Weise funktioniert dies auf allen meinen Entwicklungsplattformen:

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

Ich finde das zuverlässiger und konfigurierbarer als die Unterstützung der Emacs-Zwischenablage. Zum Beispiel ckopiert mein Befehl die Eingabe in alle 3 Zwischenablagen unter Linux (primär, sekundär, Zwischenablage), sodass ich sie entweder mit Strg-V oder mit der mittleren Maustaste einfügen kann.

Barry Kelly
quelle
Das sollte funktionieren, aber für mich nicht. (Ubuntu 14.04.1.) Das heißt, date | xclipund xclip filebeide funktionieren wie angekündigt (Speichern des Datums oder des Inhalts der Datei in der Primärdatei), wenn sie in die Shell eingegeben werden. Aber wenn ich einen dieser Befehle nach M-! in emacs (und hit return) passiert nichts; Der Cursor bleibt im Minibuffer, als würde er mehr Eingaben erwarten. und wenn ich unterbreche, um die Kontrolle wiederzugewinnen, wurde nichts in der Primärdatenbank gespeichert.
Silvio Levy
OK, Ihre Idee funktioniert gut mit xsel anstelle von xclip: (shell-command (format "echo '%s' | xsel -i" buffer-file-name))- und wenn sie in einen interaktiven Befehl umgewandelt wird (wie in der am besten bewerteten Antwort von @JeromeRadix oben vorgeschlagen), ist dies ein GROSSER GEWINN! Vielen Dank!
Silvio Levy
0

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>

In Anlehnung an Trey Jackson habe ich mir Folgendes ausgedacht:

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

Weitere Informationen finden Sie vor Ort

DJJ
quelle