Entonces hice esta pregunta sobre los accesos directos a directorios en un shell. La idea es que me gustaría poder abrir un archivo /home/Documents/foo
, digamos, escribiendo C-x C-f ~foo/file
.
Entonces, ¿hay alguna manera de emular los "directorios con nombre" de zsh en el búfer de emacs?
Por cierto, las definiciones de acceso directo que quiero usar ya están en mi .zshrc, si hay una solución que las lea directamente, que obtiene puntos de bonificación.
Respuestas:
El componente Emacs que se encarga de expandir
~
en los nombres de archivo esexpand-file-name
. Desafortunadamente, está escrito en C, y en el fondo de sus intestinos hay un código que supone que lo que viene después~
es un nombre de usuario. Afortunadamente, Emacs tiene una forma genérica de agregar un envoltorio alrededor de las funciones, por lo que puede hacer lo que quiera si no le importa repetir parte de la lógica en la función incorporada.Aquí hay un código completamente no probado que debería ayudarte. Consulte "Asesoramiento de las funciones de Emacs Lisp" en el manual de Emacs Lisp para obtener más información; La idea básica es que
defadvice
agrega un código para ejecutar antes del código real deexpand-file-name
. Señale los errores que inevitablemente cometí en los comentarios (ya sea que sepa cómo solucionarlos o no).Dejaré analizar los atajos
.zshrc
para completarexpand-file-name-custom-tilde-alist
(o cualquier técnica que elija para mantener los alias sincronizados) como ejercicio.fuente
(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))
Simplemente use en
$foo
lugar de~foo
en el minibúfer. Emacs lo trataráfoo
como el nombre de una variable de entorno y usará su valor.fuente