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

Modified on: Sat, 30 Jun 2018 12:24:00 +0800

所以我向这个问题询问了shell中的目录快捷方式。这个想法是我希望能够在/home/Documents/foo中打开一个文件,比如输入 Cx Cf ~foo/file

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

顺便提一下,我想要使用的快捷方式定义已经在我的.zshrc中了,如果有一个直接读取它们的解决方案,那就获得了奖励积分。

作者:Community,Seamus

最佳答案

负责扩展文件名中~的Emacs组件是expand-file-name。不幸的是,它是用C语言编写的,其内部深处的代码假设~后面的内容是用户名。幸运的是,Emacs有一种在函数周围添加包装器的通用方法,所以如果你不介意重复内置函数中的某些逻辑,你可以做你想做的事。

这里有一些完全未经测试的代码可以帮到你。在Emacs Lisp手册中查找“建议Emacs Lisp函数”以获取更多信息;基本思想是defadvice添加一些代码,以便在expand-file-name的实际代码之前运行。请表明我在评论中不可避免地犯的错误(无论你是否知道如何解决这些错误)。

(ad-define-subr-args 'expand-file-name '(name &optional default-directory))
(defvar expand-file-name-custom-tilde-alist
  '("foo" . "/home/Documents/foo"))
(defadvice expand-file-name (before expand-file-name-custom-tilde
                             activate compile)
  "User-defined expansions for ~NAME in file names."
  (save-match-data
    (if (string-match "\\`\\(\\(.*/\\)?~\\([^:/]+\\)\\)/" name)
        (let ((replacement (assoc (match-string 2 name) expand-file-name )))
          (if replacement
              (setq name (replace-match replacement t t name 1)))))))

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

作者:Gilles

相关问答

添加新评论