我最近试用了Sublime Text 2,我发现Goto Anything对于导航源代码非常有用(Ctrl-P file@symbol似乎工作得很好)。Emacs 有类似的东西吗?最好是可以正常工作的东西,没有大量的自定义 elisp。
到目前为止我已经尝试过:
我用过
multi-occur-in-matching-buffers
,但它似乎也无法满足“即时”标准。
我目前将 #2 和 #3 一起使用,作为 Goto Anything 的不良替代品。
如果不是 Goto Anything 的精确克隆,那么我可以使用一个简单的即时搜索解决方案(一种在所有打开的缓冲区中搜索给定字符串并动态显示结果的解决方案)。所以这也是可以接受的。
我使用 Emacs 24.2,所以任何仅 v24 的 elisp 也可以。
编辑:在event_jr 的建议下,我又给了 Helm 一次机会,我发现它确实支持跨所有开放缓冲区的即时搜索。helm-multi-occur
+helm-follow-mode
出乎意料地接近满足我的需求,唯一的小问题是(听起来很挑剔):
我还没有找到运行时(见下面的编辑#2)helm-follow-mode
自动开启的方法helm-multi-occur
。我必须手动调用它C-c C-f
。有人愿意用 elisp 的片段来尝试一下吗?它不像 ST2 的 Goto Anything 那样“智能”(即,它不理解源代码中的“符号”,就像 Goto Anything 那样)。
编辑#2:现在我已经掌握了大部分的 Goto 任何东西,这要感谢下面 event_jr 的回答(当然,还要感谢 Helm 的创建者Thierry Volpiatto)。我衷心推荐给任何寻找类似功能的人。以下是我目前正在使用的 elisp:
;; instant recursive grep on a directory with helm
(defun instant-rgrep-using-helm ()
"Recursive grep in a directory."
(interactive)
(let ((helm-after-initialize-hook #'helm-follow-mode))
(helm-do-grep)))
;; instant search across all buffers with helm
(defun instant-search-using-helm ()
"Multi-occur in all buffers backed by files."
(interactive)
(let ((helm-after-initialize-hook #'helm-follow-mode))
(helm-multi-occur
(delq nil
(mapcar (lambda (b)
(when (buffer-file-name b) (buffer-name b)))
(buffer-list))))))
;; set keybindings
(global-set-key (kbd "C-M-s") 'instant-search-using-helm)
(global-set-key (kbd "C-M-S-s") 'helm-resume)
(global-set-key (kbd "C-M-g") 'instant-rgrep-using-helm)