Ich muss den vollständigen Pfad der Datei erhalten, die ich mit Emacs bearbeite.
Ich verwende Mac OS X und Aqumacs.
(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
(defun show-Dateiname () "Zeigt den vollständigen Pfaddateinamen im Minibuffer an." (interaktiv) (Nachricht (Name der Pufferdatei)). kill-new (Dateiname Buffer-Dateiname)) ) (global-set-key "\ C-cz" 'Show-Dateiname)
Durch die Kombination der beiden Antworten konnte ich bekommen, was ich wollte. Danke für die Antworten. Und noch ein paar Fragen.
Es ist die integrierte Funktion buffer-file-name
, die Ihnen den vollständigen Pfad Ihrer Datei angibt.
Am besten ist es, wenn Sie in Ihrem Emacs-Fenster immer Ihren Systemnamen und den vollständigen Pfad des gerade bearbeiteten Puffers anzeigen:
(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
Um sich die Antwort von Jérôme Radix zu leihen, wenn Sie nur den Dateipfad des aktuellen Puffers sehen möchten, können Sie M-: buffer-file-name
tun.
Mein Trick ist es, eine C-x C-f
-Methode zum Öffnen einer Datei zu erstellen. Dabei wird der Minibuff mit dem aktuellen Dateipfad C-g
gefüllt, um ihn zu beenden. Schneller als M-: buffer-file-name
, aber weitaus hässlicher als andere Methoden.
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 zu dem zu erhalten, was sich im Minipuffer befindet, 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 wenn ich es dann in die Zwischenablage will, töte ich einfach die Zeile (C-a C-k). Wir können den Truenamen aber problemlos 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 von 'kill-new
, der die Zeichenfolge in den Kill-Ring einfügt.
Keine Notwendigkeit für zusätzliche Funktionen, nur
M-! pwd
Ich habe den folgenden Code schon lange im Einsatz ... __: Er kopiert den vollständigen Dateipfad in den Kill-Ring, wenn ich die mittlere Maustaste auf den Puffernamen in der Moduszeile drücke. Es kopiert nur den Namen des Puffers in den Kill-Ring, wenn ich Shift-Mouse-2 auf den Namen des Puffers 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)))
C-x C-d
, auch über M-x list-directory
aufrufbar, zeigt 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 .
Kann ich den Pfadnamen in die Zwischenablage von System (OS) kopieren, nicht in den Kill-Ring, damit ich die Informationen mit den anderen Apps verwenden kann?
Sie können, wenn Sie auf etwas wie xclip (Linux), pbcopy (Mac), putclip (Cygwin) Shell.
Ich persönlich benutze die Wrapper-Skripte c
und p
für das Kopieren und Einfügen. Beim ersten Lesen der Standardeingabe wird die letzte Ausgabe in die Standardausgabe geschrieben. So funktioniert das auf allen meinen Entwicklungsplattformen:
(Shell-command (format "echo '%s' | c" buffer-file-name))
Ich finde das zuverlässiger und konfigurierbar als mit der Emacs-Zwischenablage. Beispielsweise kopiert mein Befehl c
die Eingabe in alle 3 Zwischenablagen unter Linux (primäre, sekundäre, Zwischenablage), sodass ich sie entweder mit Strg-V oder mit dem mittleren Klick einfügen kann.
C-x C-b
zeigt eine Liste von Puffern und ggf. den Dateipfad für jeden Puffer.
copy-buffer-file-name-as-kill
von [0] macht genau das, was Sie brauchen, denke ich. Es hat auch die Möglichkeit, nur den Verzeichnisnamen oder nur den Dateinamen zu kopieren.
[0] http://www.emacswiki.org/emacs/download/buffer-extension.el
C-u C-x C-b
listet die Puffer auf, die aktuell Dateien besuchen.
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>
Ich habe mir Trey Jackson geliehen.
(defun buffer-kill-path ()
"copy buffer's full path to kill ring"
(interactive)
(kill-new (buffer-file-name)))
Weitere Informationen finden Sie auf site