【发布时间】:2010-09-17 04:45:03
【问题描述】:
我使用 emacs 来查看和编辑代码和其他文本文件。我想知道是否有一种方法可以向前或向后搜索在当前缓冲区中标记的文本。类似于我可以在记事本或写字板中执行的操作。如我可以在缓冲区中标记一些文本并执行 C-s 或 C-r 并能够使用标记的文本进行搜索而无需实际输入整个搜索文本吗?
谢谢,
罗希特
【问题讨论】:
标签: search emacs text text-editor
我使用 emacs 来查看和编辑代码和其他文本文件。我想知道是否有一种方法可以向前或向后搜索在当前缓冲区中标记的文本。类似于我可以在记事本或写字板中执行的操作。如我可以在缓冲区中标记一些文本并执行 C-s 或 C-r 并能够使用标记的文本进行搜索而无需实际输入整个搜索文本吗?
谢谢,
罗希特
【问题讨论】:
标签: search emacs text text-editor
你可以通过 C-h k C-s 找到 C-s 的帮助,它说:
键入 DEL 以取消搜索字符串末尾的最后一个输入项。类型 RET 退出,在找到的位置离开点。键入 LFD (C-j) 以匹配结束 的线。输入 C-s 再次向前搜索, C-r 再次搜索 落后。 键入 C-w 将缓冲区中的下一个单词或字符拉出到 搜索字符串的结尾,然后搜索它。输入 C-M-w 删除 搜索字符串末尾的字符。键入 C-M-y 从 yank char 缓冲到搜索字符串的末尾并搜索它。键入 M-s C-e 到 将其余行拉到搜索字符串的末尾并搜索它。类型 C-y 拉出最后一串被杀死的文本。键入 M-y 替换字符串 只是在搜索提示之前被杀死了字符串。 C-q 型 引用控制字符来搜索它。键入 C-x 8 RET 添加一个 按 Unicode 名称搜索的字符,并完成。 C-g 同时 搜索或搜索失败时取消输入回 被成功找到。 C-g 当搜索成功时中止并且 将点移动到起点。
如果您尝试在搜索字符串仍为空的情况下退出,它会调用 非增量搜索。
键入 M-c 切换搜索是否区分大小写。键入 M-s i 切换 在不可见的文本中搜索。键入 M-r 切换正则表达式模式。 键入 M-s w 切换单词模式。键入 M-s _ 切换符号模式。类型 M-s ' 切换字符折叠。
键入 M-s SPC 以切换空白匹配。在增量搜索中, 一个或多个空格通常匹配由 变量“搜索空白正则表达式”;另见变量 “isearch-lax-whitespace”和“isearch-regexp-lax-whitespace”。
键入 M-s e 以编辑 minibuffer 中的搜索字符串。
还支持前 16 个搜索字符串的搜索环。 键入 M-n 以在搜索环中搜索下一个项目。键入 M-p 到 在搜索环中搜索上一个项目。键入 C-M-i 到 使用搜索环完成搜索字符串。
键入 M-% 以运行“query-replace”,并使用要从最后一个替换的字符串 搜索字符串。键入 C-M-% 以使用最后一个运行“query-replace-regexp” 搜索字符串。键入 M-s o 运行“发生”,显示最后一次搜索 细绳。键入 M-s hr 运行“highlight-regexp”,突出显示 最后一个搜索字符串。
键入 C-h b 以显示所有 Isearch 键绑定。键入 C-h k 以显示 Isearch 键的文档。键入 C-h m 以显示文档 搜索模式。
【讨论】:
@Alex 做到了。
我经常使用的另一个选项是C-s C-w,用于搜索当前标记之后的单词。反复点击 C-w 会增加额外单词的搜索(例如,C-s C-w C-w C-w 搜索当前标记后的 3 个单词)。
类似地,C-s M-s C-e 搜索当前标记之后的行的其余部分,C-s C-M-y 搜索标记之后的字符。这些都可以以相同的方式重复(前者在C-s之后有些尴尬地重复M-s C-e)。
【讨论】:
C-r C-w 向后搜索("r" = reverse)标记后的单词。并且C-r C-w C-w 向后搜索标记后的两个单词。
C-s C-y现在绑定到C-s M-s C-e(从Emacs 24.1开始)[source]。
执行此操作的最短键序列是 M-w C-s M-y.
【讨论】:
有一个很棒的功能:isearch-forward-symbol-at-point。它突出显示您的点所在的单词的所有出现 - 无需将点放在单词的开头。然后您可以使用 C-s 或 C-r 移动到下一个或上一个。
请注意,这是一个精确匹配:例如,如果您在 hi 上使用它,它将不会匹配 chill。
我在初始化文件中将 if 映射到 command-f (mac OSX): (global-set-key (kbd "s-f") 'isearch-forward-symbol-at-point)。
【讨论】:
isearch-forward-symbol-at-point 自动选择点的文本。如果您认为一个词与 Emacs 认为一个词不同,这可能会产生问题。不过还是有用的。 GNU Emacs 24.5.1 上的默认绑定是 M-s .。
其他答案描述了如何搜索复制的文本,或如何搜索当前的单词。但它们都没有真正描述如何“使用标记的文本进行搜索”。
添加以下钩子将使当前选择的文本是用于 isearch 的文本:
(defun jrh-isearch-with-region ()
"Use region as the isearch text."
(when mark-active
(let ((region (funcall region-extract-function nil)))
(deactivate-mark)
(isearch-push-state)
(isearch-yank-string region))))
(add-hook 'isearch-mode-hook #'jrh-isearch-with-region)
提示:这与 expand-region 非常匹配。
【讨论】:
(deactivate-mark)之前添加(goto-char (region-beginning))以防止在调用函数时直接移动到下一个匹配,并将(isearch-push-state)替换为(isearch-update) ;使用(isearch-push-state),如果在同一段文本上重复调用它,它将停止突出显示其他事件。
上面的答案(包括接受的答案)太麻烦恕我直言。我找到了以下信息并且更喜欢它:
“Ctrl+s Ctrl+w”。这将搜索当前单词,但您必须移动 将光标首先移到单词的开头。
http://xah-forum.blogspot.com/2009/08/search-word-under-cursor-in-emacs.html
【讨论】:
我正在使用以下不存在必须键入多个连续的 C-s 来查找以后出现的问题:
(defun search-selection (beg end)
"search for selected text"
(interactive "r")
(kill-ring-save beg end)
(isearch-mode t nil nil nil)
(isearch-yank-pop)
)
(define-key global-map (kbd "<C-f3>") 'search-selection)
前面代码的缺点是选中的文本被复制到了stretch。下面的代码就没有这个问题:
(defun search-selection (beg end)
"search for selected text"
(interactive "r")
(let (
(selection (buffer-substring-no-properties beg end))
)
(deactivate-mark)
(isearch-mode t nil nil nil)
(isearch-yank-string selection)
)
)
(define-key global-map (kbd "<C-f3>") 'search-selection)
【讨论】:
是的。 M-W(获取所选文本的副本)C-s <RET> C-y <RET>。然后根据需要重复C-s。 C-r 也是如此。
【讨论】: