Raccourcis de répertoire dans le tampon emacs

8

J'ai donc posé cette question sur les raccourcis de répertoire dans un shell. L'idée est que j'aimerais pouvoir ouvrir un fichier /home/Documents/foo, par exemple, en tapant C-x C-f ~foo/file.

Alors, existe-t-il un moyen d'émuler les "répertoires nommés" de zsh dans le tampon emacs?

Soit dit en passant, les définitions de raccourcis que je veux utiliser sont déjà dans mon .zshrc, s'il existe une solution qui les lit directement, qui obtient des points bonus.

Seamus
la source
Peut-être que ce n'est pas une question Unix SE et que je devrais tenter ma chance sur SU?
Seamus
cette question n'est pas spécifique à Unix (même dans la partie zsh: il y a un port zsh pour Windows, ou du moins pour Cygwin), donc ça devrait être sur SU. Mais bon, c'est ici maintenant, alors j'ai répondu ici.
Gilles 'SO- arrête d'être méchant'

Réponses:

8

Le composant Emacs qui est responsable de l'expansion ~des noms de fichiers est expand-file-name. Malheureusement, il est écrit en C, et au fond de ses entrailles se trouve un code qui suppose que ce qui vient après ~est un nom d'utilisateur. Heureusement, Emacs a une façon générique d'ajouter un wrapper autour des fonctions, vous pouvez donc faire ce que vous voulez si cela ne vous dérange pas de répéter une partie de la logique de la fonction intégrée.

Voici un code complètement non testé qui devrait vous permettre de démarrer. Consultez «Conseils sur les fonctions Emacs Lisp» dans le manuel Emacs Lisp pour plus d'informations; l'idée de base est d' defadviceajouter du code à exécuter avant le code réel de expand-file-name. Veuillez signaler les erreurs que j'ai inévitablement commises dans les commentaires (que vous sachiez les corriger ou non).

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

Je vais laisser l'analyse des raccourcis .zshrcà remplir expand-file-name-custom-tilde-alist(ou quelle que soit la technique que vous choisissez pour garder les alias synchronisés) comme exercice.

Gilles 'SO- arrête d'être méchant'
la source
Ma solution d'exercice:(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

Utilisez simplement $fooplutôt que ~foodans le mini-tampon. Emacs traitera foocomme le nom d'une variable d'environnement et utilisera sa valeur.

Friedel
la source
Quelle fonctionnalité cachée tueur! (remarque: exporter la variable pour qu'elle soit disponible)
AdrieanKhisbe