Scorciatoie di directory nel buffer di emacs


8

Quindi ho posto questa domanda sui collegamenti alle directory in una shell. L'idea è che mi piacerebbe poter aprire un file /home/Documents/foo, diciamo, digitando C-x C-f ~foo/file.

Quindi, c'è un modo per emulare le "directory denominate" di zsh nel buffer di emacs?

Per inciso, le definizioni delle scorciatoie che voglio usare sono già nel mio .zshrc, se c'è una soluzione che le legge direttamente, che ottiene punti bonus.


Forse questa non è una domanda unix SE e dovrei tentare la fortuna su SU?
Seamus,

questa domanda non è specifica per unix (anche fino alla parte zsh: c'è una porta zsh per Windows, o almeno per Cygwin), quindi dovrebbe essere su SU. Ma, beh, è ​​qui adesso, quindi ho risposto qui.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


8

Il componente Emacs che è responsabile dell'espansione ~nei nomi dei file è expand-file-name. Sfortunatamente, è scritto in C e nel profondo delle sue viscere c'è un codice che presuppone che ciò che viene dopo ~sia un nome utente. Fortunatamente, Emacs ha un modo generico di aggiungere un wrapper alle funzioni, quindi puoi fare quello che vuoi se non ti dispiace ripetere una parte della logica nella funzione integrata.

Ecco un codice completamente non testato che dovrebbe farti andare. Per ulteriori informazioni, consultare "Consigli sulle funzioni di Emacs Lisp" nel manuale di Emacs Lisp; l'idea di base è che defadviceaggiunge del codice da eseguire prima del codice effettivo di expand-file-name. Per favore segnala gli errori che ho inevitabilmente fatto nei commenti (che tu sappia come ripararli o no).

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

Lascerò analizzare le scorciatoie .zshrcda riempire expand-file-name-custom-tilde-alist(o qualunque tecnica tu scelga per mantenere sincronizzati gli alias) come esercizio.


La mia soluzione di allenamento:(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 il

4

Basta usare $fooinvece che ~foonel minibuffer. Emacs tratterà foocome il nome di una variabile d'ambiente e ne utilizzerà il valore.


Che caratteristica nascosta assassina! (nota: esporta la variabile affinché siano disponibili)
AdrieanKhisbe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.