崇高文本2的“转到任何东西”(或即时搜索)为Emacs?(Sublime Text 2's

2019-08-16 18:56发布

我尝试了崇高的文本2最近,我发现转到任何用于导航的源代码(寄望有用按Ctrl-P文件@符号似乎工作非常好)。 有没有为Emacs类似的东西? 最好的东西,只是工作,没有一吨定制的elisp的。

我试过到目前为止:

  1. 我见过头盔和任何东西 , 但据我了解都没有能够真正的“即时”搜索(见下文编辑)。

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

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

我目前使用#2,#3一起,作为一个贫穷的替代转到什么。

如果转到任何的不是精确克隆,那么我可以凑合着用一种天真的即时搜索解决方案(一个用于搜索所有打开的缓冲区,并显示结果动态地给定的字符串)。 所以这是可以接受的了。

我使用Emacs 24.2,所以任何V24-只elisp的也很好。

编辑 :我给头盔再出手,在event_jr的建议 ,我发现在所有打开的缓冲区支持即时搜索。 helm-multi-occur + helm-follow-mode来惊人地接近满足我的需求,唯一的小问题是(在冠冕堂皇挑剔的风险):

  • 我还没有找到一种方法来打开helm-follow-mode ,当我运行自动 helm-multi-occur 我必须用手动调用它Cc Cf 有人在乎拿在这一个投篮的elisp的一个片段? (见下面的编辑#2)

  • 它不是“聪明”像ST2的转到任何东西(也就是说,它不会在源代码中理解“符号”一样,转到什么都)。

编辑#2:现在我已经得到了大部分转到任何东西,这要归功于以下event_jr的答案 (当然,这要归功于头盔的创造者, 蒂埃里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)

Answer 1:

只需使用掌舵。

这也许是更多的配置比你要求的,但一旦你得到它配置你喜欢,它应该是相当舒适。 非常喜欢的Emacs)。

你应该文件,蒂埃里错误的找些新手友好的默认值。 他是问题非常敏感。

舵的多发生

主要多缓冲交互式“发生”是通过提供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有一些技巧了它的袖子。 您指定的第一个符号由主要模滤波,并且可以使用“@”前缀,以缩小到包含字符串缓冲区。

要机智,“红宝石@Prompt”会告诉你,其主要模式包括“红宝石”,其内容包含“提示”缓冲区的列表。 或者你也可以使用“@Prompt”,以显示包含“提示”的所有缓冲区。


强大的和舒适的,一旦你习惯了它。


编辑修改my-helm-multi-all使舵遵循的模式。

编辑2更新helm-follow-mode代码,以反映掌舵的变化。

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



Answer 2:

Emacs有弹满足你的需要:

  • 跳转到项目中的文件
  • 多发生在项目缓冲区


Answer 3:

  1. HEML远未ST3的模糊搜索。

  2. Fiplr看起来很有希望,但不能在我的笔记本电脑工作(见GitHub的第一个问题)

  3. Simp.el看起来像Fiplr但没有工作,要么在我结束。

  4. 弹丸对我的作品! 这里是您的解决方案!

我也用IDO模式和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)


Answer 4:

冰柱提供了一些功能,类似于什么,似乎你正在寻找。

  1. Cx bCx Cf ,选择缓冲区或文件,允许多完成:你可以输入一个模式来匹配缓冲区/文件名和/或一个模式相匹配的内容在缓存 / 文件 。 考生被过滤增量为您键入(你所说的“瞬间”是什么Emacs中所称的“增量”)。 您可以提炼一种或两种搜索模式逐渐收窄以不同的方式的选择。 您可以访问任意数量的缓存/匹配的文件,在同一时间。 你也可以用同样的方法来搜索标记的文件中Dired: CF

  2. Cc `icicle-search )在多个缓冲区或文件增量搜索。 再次,逐步细化等。

之间#1和#2的主要区别是这样的:

  • 对于#1,你只是想找到匹配的缓冲区或文件。 你不马上关心寻找特定的事件---任何比赛就足够了。

  • #2,您所提供的缓冲区或文件进行搜索,并希望搜索命中中导航。

您还可以使用#1到找到所需的缓冲区和文件,然后搜索的内容:您上次使用的内容匹配的图案可作为ISEARCH(搜索模式Cs )。



Answer 5:

为Emacs我定制和修改该解决方案(用于安装舵):

(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但最后掌舵版本无法正常工作,但固定与我的变更(只是复制/从一些内部掌舵模块粘贴)



文章来源: Sublime Text 2's “Goto Anything” (or instant search) for Emacs?