Also habe ich diese Frage zu Verzeichnisverknüpfungen in einer Shell gestellt. Die Idee ist, dass ich in der Lage sein möchte, eine Datei beispielsweise /home/Documents/foo
durch Eingabe zu öffnen C-x C-f ~foo/file
.
Gibt es also eine Möglichkeit, die "benannten Verzeichnisse" von zsh im Emacs-Puffer zu emulieren?
Übrigens befinden sich die Verknüpfungsdefinitionen, die ich verwenden möchte, bereits in meiner .zshrc. Wenn es eine Lösung gibt, die sie direkt liest, erhält sie Bonuspunkte.
Antworten:
Die Emacs-Komponente, die für die Erweiterung der
~
Dateinamen verantwortlich ist, istexpand-file-name
. Leider ist es in C geschrieben, und tief in seinem Darm befindet sich Code, der davon ausgeht, dass es sich~
um einen Benutzernamen handelt. Glücklicherweise bietet Emacs eine generische Methode zum Hinzufügen eines Wrappers um Funktionen, sodass Sie tun können, was Sie möchten, wenn es Ihnen nichts ausmacht, einen Teil der Logik in der integrierten Funktion zu wiederholen.Hier ist ein völlig ungetesteter Code, der Sie zum Laufen bringen sollte. Weitere Informationen finden Sie im Emacs Lisp-Handbuch unter „Beratung zu Emacs Lisp-Funktionen“. Die Grundidee ist, dass
defadvice
Code hinzugefügt wird, der vor dem eigentlichen Code von ausgeführt werden sollexpand-file-name
. Bitte signalisieren Sie die Fehler, die ich unweigerlich in Kommentaren gemacht habe (ob Sie wissen, wie man sie behebt oder nicht).Ich lasse das Parsen der Verknüpfungen
.zshrc
zum Ausfüllenexpand-file-name-custom-tilde-alist
(oder welcher Technik auch immer Sie wählen, um die Aliase synchron zu halten) als Übung.quelle
(defun my/add-to-tilde-alist (hash) (let* ((tilde:dir (split-string hash "=")) (tilde (car tilde:dir)) (dir (cadr tilde:dir))) (push (cons tilde dir) expand-file-name-custom-tilde-alist))) (mapc #'my/add-to-tilde-alist (split-string (with-output-to-string (call-process "zsh" nil standard-output nil "-ic" "hash -d")) "\n" t))
Einfach
$foo
statt~foo
im Minibuffer verwenden. Emacs wirdfoo
als Name einer Umgebungsvariablen behandelt und deren Wert verwendet.quelle