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

所以我向this question询问了shell中的目录快捷方式.我的想法是,我希望能够在/ home / Documents / foo中打开一个文件,比如输入C-x C-f~foo / file.

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

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

最佳答案
负责扩展文件名的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(或您选择的任何技术以保持别名同步)作为练习.

转载注明原文:zsh – emacs缓冲区中的目录快捷方式 - 代码日志