首页 > Elisp, 初级 > 在Emacs中使用vi的*和#命令

在Emacs中使用vi的*和#命令

2010年2月24日 ahei 发表评论 阅读评论


vi里有个很好用的功能就是, 在命令模式下, 按*向前搜索下一个单词, 按#向后搜索后一个单词. 那Emacs下有没有这样的功能呢? 抱歉, 还真没有。也许你会说C-s C-w不是可以解决吗?但是这个方法需要光标在单词起始处,光标在单词中间的话就不行了。不过不用怕, 有elisp, 啥不能实现呢? 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
(defun isearch-cur-word (fun)
  "ISearch current word use function FUN."
  (let ((cur-word (current-word)))
    (if (not cur-word)
        (message "No word under cursor.")
      (call-interactively fun)
      (isearch-yank-string cur-word))))
 
(defun isearch-forward-cur-word (&optional backward)
  "`isearch-forward' current word."
  (interactive "P")
  (let ((fun (if backward 'isearch-backward 'isearch-forward)))
    (isearch-cur-word fun)))

原理很简单, 首先用current-word函数得到当前光标下的单词, 然后调用对应的isearch命令, 最后用isearch-yank-string把当前单词复制到搜索串里, 达到搜索当前单词的目的. C-u isearch-forward-cur-word则向后搜索当前单词.

上面实现的是增量搜索当前单词, 那怎么像vi中那样直接到达下一个单词, 而不启动增量搜索呢?

我曾写过一篇文章Emacs才是世界上最强的IDE - 高亮光标处单词, 这个用于高亮光标处单词的elisp包正好有个上面所说的功能, 命令是highlight-symbol-next和highlight-symbol-prev, 在view-mode下我把它们绑定到了N和P键上去了, 非常的方便.

分享家:Addthis中国
GD Star Rating
loading...
在Emacs中使用vi的*和#命令, 8.0 out of 10 based on 2 ratings 标签:cursor, Elisp, Emacs, emacser, emacser.com, highlight, highlight-symbol, IDE, lisp, mode, screenshot, vi, 光标

相关日志

分类: Elisp, 初级
  1. 2010年2月25日01:01 | #1

    用C-s C-w和C-r C-w来做也是一样的嘛

    [回复]

    ahei 回复:

    但是你这样有个缺点,那就是光标必须在单词的起始处,光标在单词中间就不行了

    [回复]

    Jay 回复:

    @ahei, 那是需要的,不过我倒是不介意多按一下C-← :-P

    [回复]

    ahei 回复:

    @Jay, 哈哈,我想用emacs的人都会很介意多按一下多余的键的

    [回复]

  2. xilbert
    2010年6月9日04:28 | #2

    嗯,不错,确实非常方便,特别是代码写得非常清晰简洁。

    [回复]

  3. onixie
    2010年8月23日06:11 | #3

    我使用楼主的方法,forward搜索是正常的。扩展一下,将backward搜索绑定到某个键就出问题了。搜索总是停留在当前单词上不向backward走。 下面是我按照楼主的思想写的,其实就是在isearch-forward和isearch-backward的后面加上个yank当前单词。呵呵。

    (defun isearch-current-word-forward (&optional regexp-p no-recursive-edit)
    (interactive “P\np”)
    (isearch-mode t (not (null regexp-p)) nil (not no-recursive-edit))
    (isearch-yank-string (current-word)))

    (defun isearch-current-word-backward (&optional regexp-p no-recursive-edit)
    (interactive “P\np”)
    (isearch-mode nil (not (null regexp-p)) nil (not no-recursive-edit))
    (isearch-yank-string (current-word)))

    (global-set-key (kbd “C-*”) ‘isearch-current-word-forward)
    (global-set-key (kbd “C-#”) ‘isearch-current-word-backward)

    (define-key isearch-mode-map (kbd “C-*”) ‘isearch-repeat-forward)
    (define-key isearch-mode-map (kbd “C-#”) ‘isearch-repeat-backward)

    [回复]

    ahei 回复:

    @onixie, 工作比较忙,有空帮你看下

    [回复]

    ahei 回复:

    @onixie, 我试了一下,你这个是可以的啊,你那怎么不可以啦?

    [回复]

  4. 2011年9月7日12:14 | #4

    @Jay

    世界真是小,我看到jay了。

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: