3

有没有办法为 isearch 提供一个区域?

我想重载 isearch 以便:

Cs -> 1. 如果没有选择区域,则像往常一样进行 isearch,或者 2. 将区域作为要用于搜索的字符串的 isearch

例如:我“选择”单词“no exit”,然后 Cs 应该在缓冲区中搜索“no exit”。在某种程度上,当光标位于“no”开头时,这可以用 Cs Cw Cw 完成。我想知道是否有办法扭转这种情况,所以首先选择(某种方式)然后使用选择进行搜索

4

2 回答 2

2

您可能会发现命令narrow-to-regionwiden有用的,做C-hfnarrow-to-regionRETC-hfwidenRET了解更多

更新

这是一些快速而肮脏的代码来做你想做的事,为了简单起见,我没有处理一些案例,但这应该给出一个想法

(add-hook 'isearch-mode-end-hook (lambda ()
                                   (when (buffer-narrowed-p)
                                     (widen))))

(defun my-isearch(&optional start end)
  (interactive "r")
  (when (region-active-p)
      (narrow-to-region start end))
    (call-interactively 'isearch-forward-regexp))

更新 2

尝试以下功能,这应该做你想要的

(defun my-isearch(&optional start end)
  (interactive "r")
  (if (region-active-p)
      (progn
        (let ((string (buffer-substring-no-properties start end)))
          (deactivate-mark)
          (isearch-resume string nil nil t string nil)))
    (call-interactively 'isearch-forward-regexp)))
于 2014-02-26T11:20:14.350 回答
2

这正是Isearch+ ( isearch+.el) 提供的功能。搜索是否仅限于活动区域由布尔选项控制isearchp-restrict-to-region-flag

您可以在搜索期间使用C-x n(command isearchp-toggle-region-restriction) 来切换此行为。

第二个布尔选项isearchp-deactivate-region-flag控制在搜索期间是否停用该区域(例如,以便您可以更好地查看搜索区域)。

默认情况下,这两个选项都为真(搜索仅限于活动区域,并且在搜索期间该区域被停用)。

(要将 Isearch 限制在Info中的活动区域,您还必须使用库Info+ ( info+.el)。


更新

嗯,这正是最初描述的。您后来对评论的回复表明您实际上并不想搜索该区域的文本;您想在缓冲区中的其他地方搜索region 中的文本这是前者,而不是后者。

于 2014-02-26T14:59:46.503 回答