emacs 缓冲区中的目录快捷方式

Sea*_*mus 8 zsh emacs

所以我问了这个关于 shell 中目录快捷方式的问题。这个想法是我希望能够打开一个文件/home/Documents/foo,比如说,通过输入C-x C-f ~foo/file.

那么,有没有办法在 emacs 缓冲区中模拟 zsh 的“命名目录”?

顺便说一句,我想使用的快捷方式定义已经在我的 .zshrc 中,如果有直接读取它们的解决方案,则可以获得加分。

Gil*_*il' 8

负责扩展~文件名的 Emacs 组件是expand-file-name. 不幸的是,它是用 C 编写的,并且在其内部深处是假定后面~是用户名的代码。幸运的是,Emacs 有一种为函数添加包装器的通用方法,因此如果您不介意重复内置函数中的某些逻辑,您可以随心所欲。

下面是一些完全未经测试的代码,应该可以帮助您前进。查阅 Emacs Lisp 手册中的“Advising Emacs Lisp Functions”以获取更多信息;基本思想是defadviceexpand-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)))))))
Run Code Online (Sandbox Code Playgroud)

我将解析快捷方式.zshrc以填充expand-file-name-custom-tilde-alist(或您选择的任何技术以保持别名同步)作为练习。