EMACS-DOCUMENT

=============>集思广益

在Eshell中将目录加为书签

我一朋友曾经向我展示了一个很巧妙技巧,能做到在bash中将目录加为书签. 这是个很棒的技巧,不过我经常使用的是Eshell,所以我想把这个技巧也移植到Eshell中来. (注意,Emacs允许你在Dired中将目录加为书签,但该书签不能用在Eshell中!) 这个技巧的关键在于共享一个书签数据库(其实就是一个名为 ~/.marks/ 的目录,用于存放指向实际目录的软链接).

下面这段函数就是Eshell的移植版本.

(defun eshell/jump (mark)
  "Jump to a directory symlinked to by a file called ~/.marks/MARK."
  (eshell/cd (file-symlink-p (concat "~/.marks/" mark))))

注意这里的 file-symlink-p 可能有一定的误导性,当参数为指向文件的软链接时它会返回实际的文件路径,否则返回nil. 另外,这里的目录名称我也写死在了代码中了,也懒得去些其他的差错处理代码 – 虽然要做到这些也挺简单的.

这就已经很不错了,只是少了自动补全功能而已,而这个功能实现起来也完全没有难度:

(defun pcomplete/jump ()
  "Complete a command that wants a name of a file in ~/.marks."
  (pcomplete-here* (directory-files "~/.marks/")))

这就差不多搞定了!

虽说让Eshell支持Emacs书签会更 Emacs-y 一点,但是这种解决方案也有它的优势,那就同时支持 Eshell 和 bash. 更进一步,我们还可以为Emacs添加 mark 函数,这并不会太难.