Emacs:结合使用iseach-forward和Latester-top-bottom

问题描述 投票:9回答:4

非常感谢您的帮助。

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

我发现自己不断这样做:

C-s fooC-s C-s C-s ...哦!那就是我要寻找的'foo'!C-l

是否可以将搜索结果居中显示在屏幕中间?

欢呼声

search emacs
4个回答
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会不太令人讨厌。

Advise isearch-forward本身等同于添加我上面最初建议的钩子,似乎对重复搜索没有影响。添加钩子更简单,而且我认为它更惯用,因此它可能比建议该功能更可取。


4
投票

谢谢你尼古拉斯和格雷格。

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

(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”功能将其始终居中放置在屏幕中间。

对于非邪恶的用户,代码看起来像这样:(未经测试!)

(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)

干杯!


1
投票

您可以在defadvice之后使用recenter-top-bottom运行isearch-forward


0
投票

[对于像我这样的其他人,他们想要在这里配置他们的spacemacs,@ 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)
© www.soinside.com 2019 - 2024. All rights reserved.