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


8

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

那么,有没有一种方法可以在emacs缓冲区中模拟zsh的“命名目录”?

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


也许这不是unix SE问题,我应该在SU上试试运气吗?
Seamus 2010年

这个问题不是特定于Unix的(甚至是zsh部分:Windows都有一个zsh端口,或者至少是Cygwin有一个zsh端口),所以它应该在SU上。但是,好,现在在这里,所以我在这里回答了。
吉尔(Gilles)“所以

Answers:


8

负责扩展~文件名的Emacs组件为expand-file-name。不幸的是,它是用C语言编写的,并且在其深处是一些代码,这些代码假定之后~是用户名。幸运的是,Emacs具有在函数周围添加包装器的通用方法,因此,如果您不介意重复内置函数中的某些逻辑,则可以执行所需的操作。

这是一些完全未经测试的代码,可以助您一臂之力。在Emacs Lisp手册中查找“建议Emacs Lisp功能”,以获取更多信息。基本思想是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(或您选择使别名保持同步的任何技术)的练习。


我练习的解决方案:(defun my/add-to-tilde-alist (hash) (let* ((tilde:dir (split-string hash "=")) (tilde (car tilde:dir)) (dir (cadr tilde:dir))) (push (cons tilde dir) expand-file-name-custom-tilde-alist))) (mapc #'my/add-to-tilde-alist (split-string (with-output-to-string (call-process "zsh" nil standard-output nil "-ic" "hash -d")) "\n" t))
迈克尔

4

简单地使用$foo,而不是~foo在迷你。Emacs将视为foo环境变量的名称并使用其值。


多么致命的隐藏功能!(备注:导出变量以使其可用)
AdrieanKhisbe 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.