it-swarm.com.de

Die Funktion, um den vollständigen Pfad der aktuellen Datei im Minipuffer anzuzeigen

Ich muss den vollständigen Pfad der Datei erhalten, 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 verwende Mac OS X und Aqumacs. 

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

HINZUGEFÜGT

 (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.

  • Was ist für (Dateiname)?
  • 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?
85
prosseek

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
79
Jérôme Radix

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. 

59
asmeurer

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.

36
Julien Palard

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.

15
Trey Jackson

Keine Notwendigkeit für zusätzliche Funktionen, nur

M-! pwd
6
thanhpk

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

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 .

2
MLev

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.

1
Barry Kelly

C-x C-b zeigt eine Liste von Puffern und ggf. den Dateipfad für jeden Puffer.

1
David

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

0
dolzenko

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

0
memeplex

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

0
DJJ