【发布时间】:2013-01-21 12:07:53
【问题描述】:
我最近试用了Sublime Text 2,我发现Goto Anything 对导航源代码非常有用(Ctrl-P file@symbol 似乎工作得很好)。 Emacs 有类似的东西吗?最好是可以正常工作的东西,没有大量的自定义省略号。
到目前为止我已经尝试过:
我用过
multi-occur-in-matching-buffers,但它似乎也无法满足“即时”标准。
我目前将 #2 和 #3 一起使用,作为 Goto Anything 的不良替代品。
如果不是 Goto Anything 的精确克隆,那么我可以使用一个简单的即时搜索解决方案(一种在所有打开的缓冲区中搜索给定字符串并动态显示结果的解决方案)。所以这也是可以接受的。
我使用 Emacs 24.2,所以任何仅 v24 的 elisp 也可以。
编辑:我在event_jr's suggestion 又给了 Helm 一个机会,我发现它确实支持在所有打开的缓冲区中进行即时搜索。 helm-multi-occur + helm-follow-mode 出乎意料地接近满足我的需求,唯一的小问题是(有听起来吹毛求疵的风险):
当我运行(参见下面的编辑 #2)helm-multi-occur时,我还没有找到一种方法来自动打开helm-follow-mode。我必须使用C-c C-f手动调用它。有人愿意用 elisp 的 sn-p 来尝试一下吗?它不像 ST2 的 Goto Anything 那样“智能”(即它不像 Goto Anything 那样理解源代码中的“符号”)。
编辑#2:感谢event_jr's answer below(当然,感谢Helm 的创建者Thierry Volpiatto),现在我已经掌握了大部分的Goto Anything。我衷心推荐给任何寻找类似功能的人。以下是我目前正在使用的 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)
【问题讨论】:
-
这对于 superuser.com 来说可能是一个更好的问题
-
不,关于 Emacs 在编程上下文中的问题 100% 在 SO 范围内
-
为什么不坚持使用 sublime?
-
@event_jr 我不会仅仅因为它没有 Goto Anything 就从 Emacs 切换到 Sublime Text。如果我这样做,我会得到一件事并失去一百万:)
-
@event_jr 这与特定的“杀手级功能”无关。事实上,Emacs 甚至没有一套固定的“特性”。这是关于一般的编辑器。我喜欢修改Emacs 的最后一点 是多么容易。无限的可定制性不断复合并得到回报。我所做的每一个小定制都让它更接近我对“理想”编辑器的心目中的形象。从某种意义上说,那是 Emacs 的真正的杀手级功能。另一方面,如果我使用 ST2,我的工作效率会很快达到最高水平。
标签: emacs sublimetext emacs24 dot-emacs emacs-helm