Emacs:结合isearch-forward和center-top-bottom

时间:2012-06-15 14:29:48

标签: search emacs

非常感谢您提前帮助。

在Emacs中,我喜欢使用iseach-forward(C-s),但如果突出显示的fount单词位于屏幕中间而不是最底部,我会更喜欢它。

我发现自己不断这样做:

C-s foo C-s C-s C-s ...... 哦!这就是我要找的'foo'! C-L

有没有办法将搜索结果集中在屏幕中间?

干杯

4 个答案:

答案 0 :(得分:5)

最佳方法可能是添加以下钩子:

(add-hook 'isearch-mode-end-hook 'recenter-top-bottom)

这将在每次成功增量搜索完成时执行recenter-top-bottom命令。

编辑:我调查了一下,重复搜索相同字符串时执行的函数(即在活动搜索期间连续输入C-sC-r)似乎是isearch-repeat-forward和/或isearch-repeat-backward。因此,如果您希望重新定位每个重复,除了定义上述钩子之外,还需要建议所述函数,如下所示:

(defadvice
  isearch-repeat-forward
  (after isearch-repeat-forward-recenter activate)
  (recenter-top-bottom))

(defadvice
  isearch-repeat-backward
  (after isearch-repeat-backward-recenter activate)
  (recenter-top-bottom))

(ad-activate 'isearch-repeat-forward)
(ad-activate 'isearch-repeat-backward)

就我个人而言,我发现由此产生的行为非常令人讨厌并迷失方向,但 de gustibus non est disputandum 。将recenter-top-bottom保留用于初始isearch-mode-end-hook并在recenter函数的建议中单独使用repeat可能不那么令人讨厌。

建议isearch-forward本身相当于添加我最初建议的钩子,似乎对重复搜索没有影响。添加钩子更简单,我认为更惯用,所以它应该比建议功能更受欢迎。

答案 1 :(得分:4)

谢谢Nicolas和Greg。

您的建议指出了正确的方向。 这是完成我要求的代码:

(defadvice
    evil-search-forward
    (after evil-search-forward-recenter activate)
    (recenter))
(ad-activate 'evil-search-forward)

(defadvice
    evil-search-next
    (after evil-search-next-recenter activate)
    (recenter))
(ad-activate 'evil-search-next)

(defadvice
    evil-search-previous
    (after evil-search-previous-recenter activate)
    (recenter))
(ad-activate 'evil-search-previous)

说明:

我不想让事情变得更复杂,因为我使用了Evil(Emacs中的vim模式),所以我在我的问题中省略了它。

我使用defadvice向前搜索,移动到下一个搜索项目并移动到上一个搜索项目。

值得一提的是我没有使用(recenter-top-bottom)功能。这种行为很疯狂,因为它将第一个搜索项目置于屏幕中间,第二个集中在顶部,第三个集中在底部。我只是使用'recenter'功能将它始终居中到屏幕中间。

对于不是Evil的用户,代码看起来像这样:(未经过测试!)

(defadvice
    isearch-forward
    (after isearch-forward-recenter activate)
    (recenter))
(ad-activate 'isearch-forward)

(defadvice
    isearch-repeat-forward
    (after isearch-repeat-forward-recenter activate)
    (recenter))
(ad-activate 'isearch-repeat-forward)

(defadvice
    isearch-repeat-backward
    (after isearch-repeat-backward-recenter activate)
    (recenter))
(ad-activate 'isearch-repeat-backward)

干杯!

答案 2 :(得分:1)

您可以使用defadvicerecenter-top-bottom后运行isearch-forward

答案 3 :(得分:1)

对于像我这样来配置太空macs的其他人来说,@ RafaelGP的答案对我有用,但稍作修改:所有邪恶函数中都带有-ex-,如下所示:

 (defadvice
      evil-ex-search-forward
      (after evil-search-forward-recenter activate)
    (recenter))
  (ad-activate 'evil-ex-search-forward)

  (defadvice
      evil-ex-search-next
      (after evil-search-next-recenter activate)
    (recenter))
  (ad-activate 'evil-ex-search-next)

  (defadvice
      evil-ex-search-previous
      (after evil-search-previous-recenter activate)
    (recenter))
  (ad-activate 'evil-ex-search-previous)