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

时间:2013-02-06 10:21:57

标签: emacs sublimetext emacs24 dot-emacs emacs-helm

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

到目前为止我尝试过:

  1. 我见过HelmAnything但据我所知,他们都没有能够进行实际的“即时”搜索(请参阅下面的编辑内容) )。

  2. 我使用了multi-occur-in-matching-buffers,但似乎也无法满足“即时”标准。

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

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

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

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

    编辑:我在event_jr's suggestion给了Helm另一个镜头,我发现它支持支持在所有打开的缓冲区中进行即时搜索。 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'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)
    

5 个答案:

答案 0 :(得分:19)

只需使用helm。

它可能比您要求的配置更多,但一旦得到它 配置你喜欢的方式,它应该很舒服。非常像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)

  1. Heml远不是对ST3的模糊搜索。

  2. Fiplr看起来很有前景,但在我的笔记本电脑上无法工作(请参阅github上的第一期)

  3. Simp.el看起来像Fiplr,但在我的结尾不起作用。

  4. Projectile适合我!这是您的解决方案!

  5. 我还使用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 提供了一些与您正在寻找的功能相似的功能。

  1. C-x bC-x C-f,要选择缓冲区或文件,允许多次完成:您可以键入模式以匹配缓冲区/文件名和/或模式{{3在match content / buffer中。}当您键入时,候选者将被过滤file(您称之为“即时”的是Emacs所谓的“增量”)。您可以优化其中一种或两种搜索模式incrementally,从而以不同方式缩小选择范围。您可以同时访问任意数量的匹配缓冲区/文件。您也可以使用相同的方法搜索Dired中标记的文件:C-F

  2. C-c `progressively)逐步搜索多个缓冲区或文件。再次,渐进式细化等。

  3. #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模块复制/粘贴)