Emacs 搜索精确单词

Emacs 搜索精确单词,emacs,xemacs,Emacs,Xemacs,我大部分时间都在verilog中工作,我最喜欢的编辑器是emacs 我喜欢vi(vim)中的一个特性,但我不知道如何在emacs中实现它 例如,我想进行精确的单词搜索-假设我有以下文本: 1. wire axi_bvalid = bvalid; 2. wire axi_bready; // assigned later 3. assign axi_cross_fifo_pop = axi_bv

我大部分时间都在verilog中工作,我最喜欢的编辑器是emacs

我喜欢vi(vim)中的一个特性,但我不知道如何在emacs中实现它

例如,我想进行精确的单词搜索-假设我有以下文本:

1. wire                   axi_bvalid = bvalid;
2. wire                   axi_bready; // assigned later
3. assign                 axi_cross_fifo_pop = axi_bvalid & axi_bready 
4. wire                   axi = 1'b1;
在搜索axi时,我只想在第4行找到匹配项。 今天,Ctrl-S搜索将匹配
axi
的每个实例

在vim中,执行此操作的方法是在单词或/\上按*键

emacs中有类似的东西吗


谢谢allot,Jony

我想您正在搜索该功能,使用
M-SW
激活

您可以通过两种方式使用它:只需发出
M-sw
,然后键入要搜索的单词。
或者要在vim中获得类似于
*
的内容,您可以使用isearch开始搜索,使用
C-s C-w
(搜索光标下的单词),然后
M-s w
将搜索切换到整词模式。

我在Emacs中没有找到与vim*等效的内置函数,但我确实成功地编写了这两个命令,这两个命令可能适合您:

(defun my-isearch-forward-word-at-point ()
  "Search for word at point."
  (interactive)
  (let ((word (thing-at-point 'word t))
        (bounds (bounds-of-thing-at-point 'word)))
    (if word
        (progn
          (isearch-mode t nil nil nil t)
          (when (< (car bounds) (point))
            (goto-char (car bounds)))
          (isearch-yank-string word))
      (user-error "No word at point"))))

(defun my-isearch-forward-symbol-at-point ()
  "Search for symbol at point."
  (interactive)
  (let ((symbol (thing-at-point 'symbol t))
        (bounds (bounds-of-thing-at-point 'symbol)))
    (if symbol
        (progn
          (isearch-mode t nil nil nil 'isearch-symbol-regexp)
          (when (< (car bounds) (point))
            (goto-char (car bounds)))
          (isearch-yank-string symbol))
      (user-error "No symbol at point"))))

(global-set-key (kbd "M-s ,") 'my-isearch-forward-word-at-point)
(global-set-key (kbd "M-s .") 'my-isearch-forward-symbol-at-point)
(在点()处取消我的isearch forward单词)
“在点处搜索单词。”
(互动)
let((单词(单词t点处的事物))
(界限(点“单词”处的事物界限)
(如果是单词
(项目
(isearch模式t nil nil t)
(当(<(车辆边界)(点))
(转到字符(汽车边界)))
(isearch拉扯字符串)
(用户错误“点上没有单词”))
(在点()处取消我的isearch前进符号)
“在点处搜索符号。”
(互动)
(let((符号(符号t点处的事物))
(边界(“点”符号处的对象边界)))
(如有)符号
(项目
(isearch模式t nil nil’isearch符号regexp)
(当(<(车辆边界)(点))
(转到字符(汽车边界)))
(isearch-yank字符串符号)
(用户错误“点上无符号”))
(全局设置键(kbd“M-s”)“我的isearch向前搜索点上的单词”)
(全局设置键(kbd“M-s”)“我的isearch前进符号在点处)
如您所见,我将这些命令绑定到M-s,M-s。。
根据您的Emacs版本,您可能能够在点(默认情况下绑定到M-s)使用内置命令isearch forward符号。

例如,需要基于正则表达式的搜索

M-x
isearch forward regexp
RET
\\uu
RET

请参阅Emacs Lisp信息文件, 节点34.3.1.3:正则表达式中的反斜杠构造

作为命令运行:

(defun my-re-search-forward (&optional word)
  "Searches for the last copied solitary WORD, unless WORD is given. "
  (interactive)
  (let ((word (or word (car kill-ring))))
    (re-search-forward (concat "\\_<" word "\\_>") nil t 1)
    (set-mark (point))
    (goto-char (match-beginning 0))
    (exchange-point-and-mark)))

谢谢你的回答,但是当我按M-s(Meta是我的左alt)时,我得到了一行goto:我该怎么办?@Jonathan,也许你已经
M-s
绑定到了其他东西。
C-h k M-s
给出了什么?Chris,'goto line'是一个交互式编译的Lisp函数——从“/tools/install/common/xemacs-21.4.22/Lisp/simple.elc”加载。我如何覆盖它?还是禁用它?这是最好的答案。如果由于某种原因,
M-sw
未绑定到此文件(因为init文件中的某些内容已更改),请尝试
C-sm-sw
。请参阅Emacs手册,节点。当然,如果您使用的是XEmacs,那么它可能会有所不同。这也会发现类似于
\u word
的单词您好,Andreas,谢谢您的回答!我对lisp一无所知,你知道怎么写这个并把它绑定到一个键上吗?我的意思是,我想让keymap打开isearch forward regexp,然后输入一个文本,并自动添加[^]@Jonathan。顺便说一句,isearch forward regexp是一个为交互使用而设计的命令。从Emacs Lisp内部向前搜索通常是有用的。在没有
\uu
的情况下对我有效。例如:
\
而不是
\\
@Vineshv认为你是对的,谢谢。这只是我搜索符号的习惯。这不会替换所有出现的单词,而是替换所选单词的一部分
(global-set-key [(control c) (\:)] 'my-re-search-forward)