Verzeichnisverknüpfungen im Emacs-Puffer

8

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/foodurch 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.

Seamus
quelle
Vielleicht ist dies keine Unix SE-Frage und ich sollte mein Glück auf SU versuchen?
Seamus
Diese Frage ist nicht unix-spezifisch (sogar bis zum zsh-Teil: Es gibt einen zsh-Port für Windows oder zumindest für Cygwin), daher sollte sie auf SU sein. Aber jetzt ist es hier, also habe ich es hier beantwortet.
Gilles 'SO - hör auf böse zu sein'

Antworten:

8

Die Emacs-Komponente, die für die Erweiterung der ~Dateinamen verantwortlich ist, ist expand-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 defadviceCode hinzugefügt wird, der vor dem eigentlichen Code von ausgeführt werden soll expand-file-name. Bitte signalisieren Sie die Fehler, die ich unweigerlich in Kommentaren gemacht habe (ob Sie wissen, wie man sie behebt oder nicht).

(defvar expand-file-name-custom-tilde-alist
  '(("foo" . "/home/Documents/foo")))

(defadvice expand-file-name (before expand-file-name-custom-tilde
                             (name &optional default-directory)
                             activate compile)
  "User-defined expansions for ~NAME in file names."
  (save-match-data
    (when (string-match "\\`\\(\\(.*/\\)?~\\([^:/]+\\)\\)/" name)
      (let ((replacement (assoc (match-string 3 name) expand-file-name-custom-tilde-alist)))
        (when replacement
          (setq name (replace-match (cdr replacement) t t name 1)))))))

Ich lasse das Parsen der Verknüpfungen .zshrczum Ausfüllen expand-file-name-custom-tilde-alist(oder welcher Technik auch immer Sie wählen, um die Aliase synchron zu halten) als Übung.

Gilles 'SO - hör auf böse zu sein'
quelle
Meine Übungslösung:(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))
Michaël
4

Einfach $foostatt ~fooim Minibuffer verwenden. Emacs wird fooals Name einer Umgebungsvariablen behandelt und deren Wert verwendet.

Friedel
quelle
Was für ein verstecktes Killer-Feature! (Bemerkung: Exportieren Sie die Variable, damit sie verfügbar sind)
AdrieanKhisbe