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

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键上去了, 非常的方便.

GD Star Rating
loading...
标签:cursor, Elisp, Emacs, emacser, emacser.com, highlight, highlight-symbol, IDE, lisp, mode, screenshot, vi, 光标loading...
用C-s C-w和C-r C-w来做也是一样的嘛
[回复]
ahei 回复:
二月 25th, 2010 at 1:16 上午
但是你这样有个缺点,那就是光标必须在单词的起始处,光标在单词中间就不行了
[回复]
Jay 回复:
二月 26th, 2010 at 1:10 上午
@ahei, 那是需要的,不过我倒是不介意多按一下C-←
[回复]
ahei 回复:
二月 26th, 2010 at 1:22 上午
@Jay, 哈哈,我想用emacs的人都会很介意多按一下多余的键的
[回复]
嗯,不错,确实非常方便,特别是代码写得非常清晰简洁。
[回复]
我使用楼主的方法,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 回复:
八月 23rd, 2010 at 6:41 上午
@onixie, 工作比较忙,有空帮你看下
[回复]
ahei 回复:
九月 12th, 2010 at 2:15 下午
@onixie, 我试了一下,你这个是可以的啊,你那怎么不可以啦?
[回复]
@Jay
世界真是小,我看到jay了。
[回复]