最近我尝试过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
非常接近满足我的需求,唯一的小问题是(不想听起来太挑剔):
我还没有找到一种方法可以在运行
helm-multi-occur
时自动打开helm-follow-mode
。 我必须使用C-c C-f
手动调用它。 有人能否提供一段elisp代码片段?它不像ST2的Goto Anything那样“智能”(即它不理解源代码中的“符号”,如同Goto Anything那样)。
编辑#2:现在我已经拥有了大部分的Goto Anything功能,感谢event_jr下方的答案(当然还要感谢Helm的创建者Thierry Volpi
;; 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)