当前位置:  开发笔记 > 开发工具 > 正文

如何在GNU Emacs中模拟Vim的*搜索?

如何解决《如何在GNUEmacs中模拟Vim的*搜索?》经验,为你挑选了3个好方法。

在Vim中,正常模式下的*键搜索光标下的单词.在GNU Emacs中,最接近的本机等价物将是:

C-s C-w

但这并不完全相同.它打开增量搜索迷你缓冲区,并从当前缓冲区中的光标复制到单词的末尾.在Vim中,你会搜索整个单词,即使你在按*时也在单词的中间.

我已经煮了一些elisp来做类似的事情:

(defun find-word-under-cursor (arg)
  (interactive "p")
  (if (looking-at "\\<") () (re-search-backward "\\<" (point-min)))
  (isearch-forward))

在点燃之前,它会向后退到单词的开头.我把它绑定到C- +,这很容易在我的键盘上打字,类似于*,所以当我输入C-+ C-w它从单词的开头复制到搜索迷你缓冲区.

但是,这仍然不完美.理想情况下,它会regexp搜索"\<" word "\>"不显示部分匹配(搜索单词"bar"不应匹配"foobar",只是"bar"自己).我尝试使用search-forward-regexp和concat'ing\<>但是这并没有包装在文件中,没有突出显示匹配并且通常非常蹩脚.isearch-*函数似乎是最好的选择,但是这些在编写脚本时表现不佳.

有任何想法吗?任何人都可以对elisp的位进行任何改进吗?还是有其他一些我忽略的方式?



1> scottfrazer..:

根据您对我的第一个答案的反馈,这是怎么回事:

(defun my-isearch-word-at-point ()
  (interactive)
  (call-interactively 'isearch-forward-regexp))

(defun my-isearch-yank-word-hook ()
  (when (equal this-command 'my-isearch-word-at-point)
    (let ((string (concat "\\<"
                          (buffer-substring-no-properties
                           (progn (skip-syntax-backward "w_") (point))
                           (progn (skip-syntax-forward "w_") (point)))
                          "\\>")))
      (if (and isearch-case-fold-search
               (eq 'not-yanks search-upper-case))
          (setq string (downcase string)))
      (setq isearch-string string
            isearch-message
            (concat isearch-message
                    (mapconcat 'isearch-text-char-description
                               string ""))
            isearch-yank-flag t)
      (isearch-search-and-update))))

(add-hook 'isearch-mode-hook 'my-isearch-yank-word-hook)


这与内置的"isearch-forward-symbol-at-point"有什么不同?

2> davidg..:

该亮点符号 Emacs的扩展提供了此功能.特别推荐的.emacsrc设置:

(require 'highlight-symbol)

(global-set-key [(control f3)] 'highlight-symbol-at-point)
(global-set-key [f3] 'highlight-symbol-next)
(global-set-key [(shift f3)] 'highlight-symbol-prev)

允许跳转到当前点的下一个符号(F3),跳转到上一个符号(Shift + F3)或突出显示与光标下的符号匹配的符号(Ctrl + F3).如果光标是中间字,命令将继续做正确的事情.

与vim的超级星不同,突出显示符号和符号之间的跳跃绑定到两个不同的命令.我个人并不介意分离,但如果你想要精确匹配vim的行为,你可以在同一个击键下绑定两个命令.



3> scottfrazer..:

有很多方法可以做到这一点:

http://www.emacswiki.org/emacs/SearchAtPoint

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有