Поэтому я задал этот вопрос о ярлыках каталогов в оболочке. Идея в том, что я хотел бы открыть файл /home/Documents/foo
, скажем, набрав C-x C-f ~foo/file
.
Итак, есть ли способ эмулировать "именованные каталоги" zsh в буфере emacs?
Кстати, определения ярлыков, которые я хочу использовать, уже есть в моем .zshrc, если есть решение, которое читает их напрямую, которое получает бонусные баллы.
Ответы:
Компонент Emacs, который отвечает за расширение
~
имен файловexpand-file-name
. К сожалению, он написан на C, и глубоко внутри его кишечника находится код, который предполагает, что последующим~
является имя пользователя. К счастью, в Emacs есть общий способ добавления обертки вокруг функций, поэтому вы можете делать все, что хотите, если не возражаете повторить некоторую логику во встроенной функции.Вот некоторый полностью непроверенный код, который должен помочь вам. Для получения дополнительной информации обратитесь к разделу «Советы по функциям Emacs Lisp» в руководстве по Emacs Lisp. Основная идея заключается в том, что
defadvice
добавляет некоторый код для запуска перед фактическим кодомexpand-file-name
. Пожалуйста, отметьте ошибки, которые я неизбежно сделал в комментариях (знаете ли вы, как их исправить или нет).Я оставлю разбор ярлыков,
.zshrc
чтобы заполнитьexpand-file-name-custom-tilde-alist
(или любой другой метод, который вы выберете, чтобы синхронизировать псевдонимы) в качестве упражнения.источник
(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))
Просто используйте
$foo
вместо~foo
минибуфера. Emacs будет обрабатыватьfoo
как имя переменной окружения и использовать ее значение.источник