有没有办法为 isearch 提供一个区域?
我想重载 isearch 以便:
Cs -> 1. 如果没有选择区域,则像往常一样进行 isearch,或者 2. 将区域作为要用于搜索的字符串的 isearch
例如:我“选择”单词“no exit”,然后 Cs 应该在缓冲区中搜索“no exit”。在某种程度上,当光标位于“no”开头时,这可以用 Cs Cw Cw 完成。我想知道是否有办法扭转这种情况,所以首先选择(某种方式)然后使用选择进行搜索
您可能会发现命令narrow-to-region
和widen
有用的,做C-hfnarrow-to-region
RET和C-hfwiden
RET了解更多
更新
这是一些快速而肮脏的代码来做你想做的事,为了简单起见,我没有处理一些案例,但这应该给出一个想法
(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)))
这正是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 中的文本。这是前者,而不是后者。