所以我问这个问题关于 shell 中的目录快捷方式。我的想法是,我希望能够/home/Documents/foo
通过键入来打开文件C-x C-f ~foo/file
。
那么,有没有办法在 emacs 缓冲区中模拟 zsh 的“命名目录”?
顺便说一句,我想要使用的快捷方式定义已经在我的 .zshrc 中,如果有一个解决方案可以直接读取它们,那就可以获得奖励积分。
答案1
负责扩展~
文件名的 Emacs 组件是expand-file-name
.不幸的是,它是用 C 语言编写的,并且其内部的代码假定后面的内容~
是用户名。幸运的是,Emacs 有一种在函数周围添加包装器的通用方法,因此如果您不介意重复内置函数中的某些逻辑,则可以做您想做的事情。
这里有一些完全未经测试的代码,应该可以帮助您继续。请参阅 Emacs Lisp 手册中的“Advising Emacs Lisp Functions”以获取更多信息;基本思想是defadvice
在 的实际代码之前添加一些要运行的代码expand-file-name
。请指出我在评论中不可避免地犯的错误(无论您是否知道如何修复它们)。
(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)))))))
我将把解析要.zshrc
填充的快捷方式expand-file-name-custom-tilde-alist
(或您选择保持别名同步的任何技术)作为练习。
答案2
只需使用$foo
而不是~foo
在迷你缓冲区中即可。 Emacs 会将其foo
视为环境变量的名称并使用其值。