Sublime Text 2为Emacs提供"Goto Anything"(或即时搜索)?

Vic*_*ani 25 emacs dot-emacs sublimetext emacs24 emacs-helm

我最近尝试了Sublime Text 2,我发现Goto Anything非常适用于导航源代码(Ctrl-P文件@符号似乎工作得非常好).Emacs有类似的东西吗?最好的东西只是工作,没有大量的定制elisp.

到目前为止我尝试过的:

  1. 我见过HelmAnything,但据我所知,他们都不能进行实际的"即时"搜索(见下面的编辑).

  2. 我已经习惯了multi-occur-in-matching-buffers,但似乎也无法满足"即时"标准.

  3. imenu/ idomenu适用于单个文件,但不适用于文件.

我目前一起使用#2和#3,作为Goto Anything的不良替代品.

如果不是Goto Anything的精确克隆,那么我可以使用天真的即时搜索解决方案(一个在所有打开的缓冲区中搜索给定字符串并动态显示结果的解决方案).所以这也是可以接受的.

我使用Emacs 24.2,所以任何仅限v24的elisp也没问题.

编辑:我给头盔再出手,在event_jr的建议,我发现它确实在所有打开的缓冲区支持即时搜索.helm-multi-occur+ helm-follow-mode出乎意料地接近满足我的需求,唯一的小问题是(冒着挑剔的风险):

  • 我跑步时没有找到helm-follow-mode 自动开启的方法helm-multi-occur.我必须手动调用它C-c C-f.有人想用一小段elisp来拍摄吗?(见下面的编辑#2)

  • 它不像ST2的Goto Anything那样"智能"(也就是说,它不能理解源代码中的"符号",就像Goto Anything那样).

编辑#2:现在我已经获得了大部分Goto Anything,感谢下面的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)
Run Code Online (Sandbox Code Playgroud)

eve*_*_jr 19

只需使用掌舵.

它可能比您要求的配置更多,但是一旦您按照自己喜欢的方式配置它,它应该非常舒适.非常像Emacs;).

你应该向Thierry提交一个bug,以获得更多新手友好的默认值.他对问题非常敏感.

舵的多发生

主要通过提供多缓冲交互"发生" 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)))))
Run Code Online (Sandbox Code Playgroud)

掌舵缓冲器列表

通常,您不关心查询字符串的确切出现次数,但需要包含它的所有缓冲区的列表.

helm-buffers-list有一些技巧.您指定的第一个符号是按主模式过滤,您可以使用"@"前缀将列表缩小到包含字符串的缓冲区.

也就是说,"ruby @prompt"将显示一个缓冲区列表,其主模式包含"ruby",其内容包含"prompt".或者您可以使用"@prompt"显示包含"prompt"的所有缓冲区.


一旦你习惯了,它就会变得强大而舒适.


编辑修改my-helm-multi-all以启用helm-follow-mode.

编辑2更新helm-follow-mode代码以反映头盔更改.

编辑3再次更新以反映掌舵变化

  • 你好.我尝试了这个,我得到了'错误的类型参数:number-or-marker-p,nil`.我正在使用Emacs 24. (2认同)

L42*_*42y 7

Emacs拥有Projectile满足您的需求:

  • 跳转到项目中的文件
  • 在项目缓冲区中多次出现