在Emacs中搜索标记(选定)文本

问题描述 投票:44回答:8

我使用emacs查看和编辑代码和其他文本文件。我想知道是否有一种向前或向后搜索当前缓冲区中标记的文本的方法。类似于我在记事本或wordpad中可以做的事情。我可以在缓冲区中标记一些文本并执行C-s或C-r并且能够使用标记的文本进行搜索而无需实际输入整个搜索文本吗?

谢谢,

罗希特

search emacs text text-editor
8个回答
31
投票

是。 M-W(获取所选文本的副本)C-s <RET> C-y <RET>。然后根据需要重复C-s。同样对于C-r


101
投票

@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在标记之后搜索该字符。这些都是以同样的方式重复(前者在M-s C-e之后有点笨拙地重复C-s)。


17
投票

我使用以下,没有必须输入多个连续的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)

前面代码的缺点是所选文本被复制到拉伸。以下代码没有此问题:

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

6
投票

其他答案描述了如何搜索复制的文本,或如何在点搜索单词。但它们都没有真正描述如何“使用标记文本进行搜索”。

添加以下钩子将使得当前选择的文本是用于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配对很好。


5
投票

执行此操作的最短键序列是Me Vs M-y。


3
投票

这有很好的功能:isearch-forward-symbol-at-point。它会突出显示您的点所在的所有单词 - 无需将该点放在单词的开头。然后,您可以使用C-s或C-r移至下一个或上一个。

请注意,它是完全匹配的:如果您在hi上使用它,它将与chill不匹配。

我映射到command-f(mac OSX):在init文件中的(global-set-key (kbd "s-f") 'isearch-forward-symbol-at-point)


2
投票

上面的答案(包括已接受的答案)太麻烦恕我直言。我找到了以下信息并且更喜欢它:

“Ctrl + s Ctrl + w”。这将搜索当前单词,但您必须先将光标移动到单词的开头。

http://xah-forum.blogspot.com/2009/08/search-word-under-cursor-in-emacs.html


0
投票

你可以通过C-h k C-s找到C-s的帮助,它说:

键入DEL以从搜索字符串末尾取消最后一个输入项。键入RET退出,在找到的位置留下点。输入LFD(C-j)以匹配行尾。键入C-s再次向前搜索,C-r再次向后搜索。键入C-w将缓冲区中的下一个单词或字符拖到搜索字符串的末尾,然后搜索它。键入C-M-w以从搜索字符串的末尾删除字符。键入C-M-y将缓冲区中的char从搜索字符串的末尾拖出并搜索它。键入M-s C-e将其余行放入搜索字符串的末尾并搜索它。键入C-y以抽取最后一串被杀死的文本。键入M-y以替换字符串,只是在搜索提示符中使用字符串kill之前将其取消。键入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以切换空白匹配。在增量搜索中,一个或多个空格通常匹配变量'search-whitespace-regexp'定义的任何空格;另见变量'isearch-lax-whitespace'和'isearch-regexp-lax-whitespace'。

键入M-s e以编辑迷你缓冲区中的搜索字符串。

还支持前16个搜索字符串的搜索环。键入M-n以搜索搜索环中的下一个项目。键入M-p以搜索搜索环中的上一个项目。键入C-M-i以使用搜索环完成搜索字符串。

键入M-%以使用字符串运行'query-replace'以从上一个搜索字符串中替换。键入C-M-%以使用最后一个搜索字符串运行“query-replace-regexp”。键入M-s o以运行显示最后一个搜索字符串的“出现”。键入M-s h r以运行突出显示最后一个搜索字符串的“highlight-regexp”。

键入C-h b以显示所有Isearch键绑定。键入C-h k以显示Isearch密钥的文档。键入C-h m以显示Isearch模式的文档。

© www.soinside.com 2019 - 2024. All rights reserved.