Wie erhalte ich den Dateinamen des aktuellen Puffers in Emacs?


19

Eines der Hauptmerkmale, die ich an Vim vermisse, ist, dass der Dateiname der aktuellen Datei immer im %Puffer gespeichert wird ( weitere Informationen ). Dies ermöglicht das einfache Starten von Befehlen wie:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Ich hätte gerne eine ähnliche Funktionalität unter emacs(Version 24, wenn das einen Unterschied macht), nämlich eine einfache Möglichkeit, den Namen der geöffneten Datei in den aktuellen Puffer einzufügen.

Beispiele für das, was ich tun möchte

Hier beschreibe ich einige grundlegende Anwendungsfälle, um besser zu erklären, wann ich das Bedürfnis nach einer solchen Verknüpfung habe

  1. Kompilieren: Wenn ich M-x compileemacs eingebe, werde ich nach einem Kompilierbefehl gefragt. Ich möchte gcc (current-buffer)einfach eintreten .

  2. Datei laden: Wenn ich meine .emacs-Datei bearbeite, möchte ich sie sofort laden, um die Änderungen zu testen. So wie ich es mache, M-x load-fileschreibe ich immer den Namen . e m a c s. Ich hätte gerne eine Verknüpfung.

  3. Starten von externen Prozessen: Ich habe du -shals Beispiel angegeben, um zu veranschaulichen, dass die Verknüpfung auch verfügbar sein soll, wenn ich Shell-Befehle mit ausführeM-!

Was ich bisher gefunden habe

  • Diese Frage hier auf U & L. Die Antworten zeigen im Grunde genommen, wo sich der Dateiname eines Puffers befindet, damit man ihn zum Kill-Ring hinzufügen kann. Es ist nicht genau das, wonach ich suche. Ich möchte den Dateinamen nicht manuell löschen müssen, bevor ich ihn verwenden möchte. (Auch die in beiden Antworten beschriebenen Lösungen scheinen in meinem Emacs nicht so reibungslos zu funktionieren und erfordern zusätzliche Tastenanschläge, was sie ein wenig nervt.)

EDIT : Ein bisschen verwandt, indem ich herausgefunden habe, warum diese Lösungen nicht funktionieren. Ich habe IDO aktiviert, egal ob gut oder schlecht.

  • Die im Handbuch beschriebene(current-buffer) Funktion gibt den Namen der Datei im aktuellen Puffer zurück, aber nirgendwo in den Beispielen, die ich oben angegeben habe, bewerte ich den Elisp-Code. Gibt es eine Möglichkeit, das Ergebnis der Auswertung dieser Funktion in einen (Mini-) Puffer einzufügen und auf diese Weise an eine Verknüpfung zu binden?

Bin ich falsch, so zu denken?

Ich lerne gerade, Emacs zu benutzen (es sind tatsächlich ein paar Monate vergangen), nachdem ich Vim jahrelang benutzt habe. Ich möchte eine vorhersehbare Verwendung von Emacs-in-a-Vim-Way- Falle vermeiden . Wenn Sie das Gefühl haben, dass das, wonach ich frage, nicht sehr emacs-y ist und es einen besseren (saubereren?) Weg geben sollte, erwähnen Sie dies bitte in Ihren Antworten.


Über den Dateinamen, in .emacs, setzen (global-set-key (kbd "C-i") buffer-file-name)Sie , wenn Sie möchten, dass es Strg + I ist. Über .emacs, M-x load-file RETmacht was Sie wollen; du musst nichts schreiben.
Emanuel Berg

2
Dieser Workflow passt nicht sehr gut zu Emacs, da sich alle Eingabeaufforderungen in der unteren Zeile des Fensters in einem Puffer in Emacs befinden (der als Minibuffer bezeichnet wird). Wenn Sie also ausführen, (buffer-file-name)während Sie den Minibuffer eingeben, erhalten Sie nil, weil (current-buffer)es sich um den Minibuffer handelt. Sie können auch im Minipuffer zwischen Puffern wechseln. Daher ist es schwierig zu verfolgen, welcher Puffer Ihrer Meinung nach der aktuelle Puffer ist, wenn der aktuelle Puffer, wie Emacs ihn sieht, der Minipuffer ist.
Gilles 'SO- hör auf böse zu sein'

Antworten:


11

Sie können eine Funktion wie folgt in Ihre .emacs einfügen und sie an einen beliebigen Schlüssel binden.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Siehe auch diese Frage , es scheint ähnlich zu sein.


4

Eine leichte Variante der Antwort von @ easyb ist, den Pfad zu Ihrem Kill Ring zu kopieren, anstatt ihn in Ihren Puffer zu legen (nützlich für schreibgeschützte Dateien):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.