"超级明星" 或者在emacs中查找光标下的单词等价词

34

我是一个使用vim的用户,最近为了好玩尝试使用emacs。目前我发现我最想从vim中转移到emacs的特性是"超级星号"(通过输入*来查找光标下的单词),但我还没有在emacs中找到它的等效物。如果emacs内置不支持这个功能,我需要在我的emacs文件中添加什么才能得到类似的功能?


1
我在VIM中不知道那个。很酷 :) - Gordon Thompson
3
可能是重复的问题,https://dev59.com/NXRB5IYBdhLWcg3wj32c - Trey Jackson
4
我同意这是一个重复的问题,但对于熟悉"super star"命令的Vim用户来说,更容易找到。另一个答案从未提到过"star"这个词,这让我很难找到答案。 - mmrobins
6个回答

42

正如 paldepind {{pointed out}},isearch-forward-symbol-at-point(默认情况下使用M-s.)是与Vim中的*相似的一个函数。这个函数在GNU Emacs 24.4及以上版本中可用;如果你的Emacs版本不同或较旧,请继续阅读查看替代方案。

通常我会执行 (M-b ...) C-s C-w ... C-s。也就是说:

  1. M-b 移动到感兴趣的单词开头
    • 可能有零个或多个这样的单词
  2. C-s 开始 I-Search
  3. C-w 拉取从当前位置开始的单词
    • 可能有一个或多个这样的单词
  4. C-s 查找下一个匹配项
  5. 更多的 C-s 查找后续的匹配项
  6. RET 退出 I-search 并返回最近的匹配项
    • 或者使用一系列的 C-g 返回原始起始位置

以下是将其集成到 I-Search 中的尝试(通过 C-sC-r 调用;使用 C-h k C-s 获取关于 isearch 的信息)。

(require "thingatpt")
(require "isearch")
(define-key isearch-mode-map (kbd "C-*")
  (lambda ()
    "Reset current isearch to a word-mode search of the word under point."
    (interactive)
    (setq isearch-word t
          isearch-string ""
          isearch-message "")
    (isearch-yank-string (word-at-point))))

将其集成到 I-Search 中可以利用其单词匹配和大小写敏感设置(C-s M-c C-* 可以对点下方的单词进行大小写敏感的搜索)。

有没有办法将所有这些钢琴组合放入一个单一的按键中,更像vim? - Dfr
3
使用isearch-forward-symbol-at-point,默认情况下绑定为C-s .。 - paldepind
@paldepind:看起来不错;NEWS 表明它起源于 GNU Emacs 24.4(2014 年 10 月)。 - Chris Johnsen
@ChrisJohnsen 是的。这是比较近的事情。我认为更新答案会很好! - paldepind

17

尝试按下C-sC-w


12
这是一个错误的答案。它假设点在单词的开头,而 Vim 的 super star 功能可以从单词内的任何位置使用。 - Bleeding Fingers

10

这里是一个开始:

(global-set-key (kbd "C-*")
  (lambda ()
    (interactive)
    (re-search-forward (format "\\b%s\\b" (thing-at-point 'word)))))

7

现在还有Smart Scan这个轻量级的附加包,提供了这个功能。

它可以从MELPA获取;将MELPA添加到已启用的package-archives列表的说明在这里

安装它:

M-x package-install RET smartscan RET

然后你可以通过以下方式启用它:

(global-smartscan-mode t) ;; Turn on Smart Scan globally

向前和向后搜索的默认键绑定分别为M-nM-p


PS:如果您感兴趣,介绍此软件包的原始博客文章在这里


4

如果您正在使用 Viper(非常好用),那么这应该可以达到类似的效果:

(require 'thingatpt)
(require 'viper)

(defun viper-search-word-at-point ()
  "Reset viper-s-string to word at point and start a forward viper search."
    (interactive)
    (setq viper-s-string (word-at-point))
    (viper-search viper-s-string 't nil))

(global-set-key (kbd "C-*") 'viper-search-word-at-point)

4

C-s C-w可以使用,但它并不是严格的符号搜索,而是“点右侧的单词部分”搜索。

正确的答案是M-s .。这将启动符号搜索,并预先加载指针所在位置的符号。符号搜索是isearch的一种特殊模式,您可以使用M-s _启动。如果您已经在isearch中(例如,按下了C-sC-r),您也可以键入M-s _进入符号搜索。

我敦促您阅读整个isearch文档,因为它非常强大和多功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接