我最近尝试了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's suggestion给了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 Anything,感谢event_jr's answer below(当然,感谢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)
答案 0 :(得分:19)
它可能比您要求的配置更多,但一旦得到它 配置你喜欢的方式,它应该很舒服。非常像Emacs ;)
你应该向Thierry提交一个错误,以获得更多友好的新手 默认值。他对问题非常敏感。
主要通过提供多缓冲交互“发生”
helm-multi-occur
。如果你执行命令,你会注意到你有
首先选择一些缓冲区(使用 C-SPC 从列表中选择,
M-SPC 选择全部)。然后您可以在下一个输入您的查询
提示。您可以轻松制作自己的版本来跳过缓冲区选择
像这样:
(eval-after-load "helm-regexp"
'(setq helm-source-moccur
(helm-make-source "Moccur"
'helm-source-multi-occur :follow 1)))
(defun my-helm-multi-all ()
"multi-occur in all buffers backed by files."
(interactive)
(helm-multi-occur
(delq nil
(mapcar (lambda (b)
(when (buffer-file-name b) (buffer-name b)))
(buffer-list)))))
通常你不关心查询字符串的确切出现,但想要一个 包含它的所有缓冲区的列表。
helm-buffers-list
有一些诡计。第一个符号你
指定是按主模式过滤,您可以使用“@”前缀缩小
包含字符串的缓冲区列表。
即使,“ruby @prompt”将显示主要模式的缓冲区列表 包含“ruby”,其内容包含“prompt”。或者您可以使用“@prompt”显示包含“prompt”的所有缓冲区。
一旦你习惯了,它就会变得强大而舒适。
编辑已修改my-helm-multi-all
以启用helm-follow-mode。
编辑2 更新helm-follow-mode
代码以反映掌舵更改。
编辑3 再次更新以反映helm changes
答案 1 :(得分:7)
Emacs Projectile满足您的需求:
答案 2 :(得分:1)
Heml远不是对ST3的模糊搜索。
Fiplr看起来很有前景,但在我的笔记本电脑上无法工作(请参阅github上的第一期)
Simp.el看起来像Fiplr,但在我的结尾不起作用。
Projectile适合我!这是您的解决方案!
我还使用ido-mode和flx-ido进行模糊搜索,
并且对于显示结果的垂直方式,我在我的.emacs中使用它:
;; Display ido results vertically, rather than horizontally
(setq ido-decorations (quote ("\n-> " "" "\n " "\n ..." "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]" " [Confirm]")))
(defun ido-disable-line-truncation () (set (make-local-variable 'truncate-lines) nil))
(add-hook 'ido-minibuffer-setup-hook 'ido-disable-line-truncation)
(defun ido-define-keys () ;; C-n/p is more intuitive in vertical layout
(define-key ido-completion-map (kbd "C-n") 'ido-next-match)
(define-key ido-completion-map (kbd "C-p") 'ido-prev-match))
(add-hook 'ido-setup-hook 'ido-define-keys)
答案 3 :(得分:0)
Icicles 提供了一些与您正在寻找的功能相似的功能。
C-x b
和C-x C-f
,要选择缓冲区或文件,允许多次完成:您可以键入模式以匹配缓冲区/文件名和/或模式{{3在match content / buffer中。}当您键入时,候选者将被过滤file(您称之为“即时”的是Emacs所谓的“增量”)。您可以优化其中一种或两种搜索模式incrementally,从而以不同方式缩小选择范围。您可以同时访问任意数量的匹配缓冲区/文件。您也可以使用相同的方法搜索Dired中标记的文件:C-F
。
C-c
`
(progressively)逐步搜索多个缓冲区或文件。再次,渐进式细化等。
#1和#2之间的主要区别在于:
对于#1,您只想查找匹配的缓冲区或文件。您不必立即关注查找特定事件---任何匹配都足够。
对于#2,您提供要搜索的缓冲区或文件,并且您希望在搜索匹配中导航。
您还可以使用#1找到所需的缓冲区和文件,然后搜索其内容:您上次使用的内容匹配模式可用作Isearch(C-s
)的搜索模式。
答案 4 :(得分:0)
对于emacs我自定义和修改此解决方案(使用install helm):
(defun helm-occur-from-point (initial-value)
"Invoke `helm-occur' from point."
(interactive)
(let ((input initial-value)
(bufs (list (buffer-name (current-buffer)))))
;; (isearch-exit)
(helm-occur-init-source)
(helm-attrset 'moccur-buffers bufs helm-source-occur)
(helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
(helm-set-local-variable
'helm-multi-occur-buffer-tick
(cl-loop for b in bufs
collect (buffer-chars-modified-tick (get-buffer b))))
(helm :sources 'helm-source-occur
:buffer "*helm occur*"
:history 'helm-grep-history
:input input
:truncate-lines t)))
(defun get-point-text ()
"Get 'interesting' text at point; either word, or region"
(if mark-active
(buffer-substring (mark) (point))
(thing-at-point 'symbol)))
(defun helm-occur-1 (initial-value)
"Preconfigured helm for Occur with initial input."
(helm-occur-from-point initial-value))
(defun bk-helm-occur ()
"Invoke helm-occur with initial input configured from text at point"
(interactive)
(helm-occur-1 (get-point-text)))
(global-set-key (kbd "M-s-o") 'bk-helm-occur)
主要基于 @see https://news.ycombinator.com/item?id=6872508但是最后的helm版本不起作用,但修改了我的更改(只是从一些内部helm模块复制/粘贴)