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

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

所以我问这个问题关于 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视为环境变量的名称并使用其值。

相关内容