Emacs才是世界上最强的IDE - 高亮光标处单词

Eclipse是一个比较不错的IDE(当然与Emacs比起来还是差不少,
), 现在用它的人挺多的, 用过的用户应该都会知道, 在Eclipse里面, 当把光标移到一个变量, 或者方法, 或者类名, 或者类型名上面的时候, Eclipse会把这个符号的所在的作用域中的所有这个符号都高亮, 比如局部变量abc, 它就会把当前作用域内所有的局部变量, 就像下面这个样子:
但是它并不会高亮与它同名的但是不同类型的单词, 比如它并不会高亮字符串”abc”, 如上图所示. 它也不会高亮和它不在同一作用域内的单词, 比如上图中的下面那个大括号扩住的代码块内的abc, 虽然和上面的代码块的abc同类型, 但是不是同一作用域, Eclipse也不会高亮它, 甚至, Eclipse都不会高亮当前光标处的单词的重载方法(这点感觉不太方便), 如下图所示:
总之, Eclipse只会高亮当前作用域内和当前光标处单词完全是同一个语法个体的单词.
那么Emacs中是否有类似的功能呢, 当然有! highlight-symbol这个包就我们实现了这个功能, 我们先来瞧瞧它长啥样:
上图中那些灰色背景, 蓝色前景的”defconst”就是用highlight-symbol高亮的,漂亮吧,:).
highlight-symbol与Eclipse的高亮功能有哪些不同点呢?
- 它除了自动高亮, 即随着光标的移动自动高亮所有当前光标下的单词, 还可以手动高亮, 比如我先高亮所有的abc, 然后再高亮所有的def, 还可以高亮所有的ghi, 还可以…, 总之, 可以无限高亮所有单词, 就像下面这样:
- 它不是以语法个体进行高亮的, 它仅以单词进行高亮, 即: 假如当前光标下的abc是int型, 它高亮的时候, 同时会高亮字符串”abc”, 这样既有好处, 也有坏处, 好处就是我这样一眼能看清楚有多少当前光标下这样的单词, 而且不区分作用域(从上面的图也可以看出来), 因为它不做语法分析, 坏处就是不同类型的单词混在了一起.
- 它可以高亮任意类型的文件, c/c++/java/ruby, 等等, 包括text, 我就用它来高亮text. 看看这个:
Eclipse恐怕只支持很少几种. - 它可以在所有相同的单词之间跳转, 回到前一个, 退到后一个, 非常方便, 还可以只在一个函数内进行跳转.
总之, 有优点也有缺点, 不过优点明显多于缺点.
我觉得一个好的高亮当前光标处单词的工具应该把Eclipse和highlight-symbol的优点结合起来, 既可以根据语法进行高亮, 语法高亮的时候还可以由用户控制是否区分作用域, 还可以根据单词外形进行高亮.
CEDET里有一个根据语法进行高亮的minor mode,想了解的话请看这里的semantic-idle-tag-highlight-mode。
下面我来讲讲highlight-symbol的使用.
C-c M-H高亮当前光标下的单词, C-c M-R取消所有单词的高亮, C-c M-N移到下一个高亮, C-c M-P则移到上一个高亮(这两个命令和vi中的*和#命令功能一样,当激活了emaci-mode后,按n和p即可,这样用起来更方便了,具体参见强大的文件阅读器 - Emaci), C-c M-n在函数内移到下一个高亮, C-c M-p在函数内移到上一个高亮, C-c r对当前光标下的单词进行替换. 使用很简单吧.
注意:highlight-symbol与color moccur以及w3m冲突,当启用了`highlight-symbol-mode’后,moccur和w3m自己的颜色高亮就没了。
这里有我的highlight-symbol的配置文件, 配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | ;; -*- Emacs-Lisp -*- ;; Time-stamp: <2010-04-12 11:38:25 Monday by ahei> ;; emacser.com/highlight-symbol.htm (require 'util) (require 'highlight-symbol) (when window-system (am-add-hooks '(emacs-lisp-mode-hook lisp-interaction-mode-hook java-mode-hook c-mode-common-hook text-mode-hook ruby-mode-hook html-mode-hook sh-mode-hook Info-mode-hook) 'highlight-symbol-mode-on)) (defun highlight-symbol-settings () "Settings for `highlight-symbol'." (setq highlight-symbol-idle-delay 0.5) (defun highlight-symbol-mode-on () "Turn on function `highlight-symbol-mode'." (if window-system (highlight-symbol-mode 1))) (defun highlight-symbol-mode-off () "Turn off function `highlight-symbol-mode'." (highlight-symbol-mode -1)) ;;;###autoload (define-globalized-minor-mode global-highlight-symbol-mode highlight-symbol-mode highlight-symbol-mode-on) ;;;###autoload (defun highlight-symbol-jump (dir) "Jump to the next or previous occurence of the symbol at point. DIR has to be 1 or -1." (let ((symbol (highlight-symbol-get-symbol))) (if symbol (let* ((case-fold-search nil) (bounds (bounds-of-thing-at-point 'symbol)) (offset (- (point) (if (< 0 dir) (cdr bounds) (car bounds))))) (unless (eq last-command 'highlight-symbol-jump) (push-mark)) (let ((target (save-excursion ;; move a little, so we don't find the same instance again (goto-char (- (point) offset)) (re-search-forward symbol nil t dir)))) (if target (goto-char (+ target offset)) (message (format "Reach %s" (if (> dir 0) "bottom" "top")))) (setq this-command 'highlight-symbol-jump))) (error "No symbol at point")))) ;; I bind "C-x w" to `copy-sexp' (eal-define-keys 'hi-lock-map `(("C-x w" nil))) (eal-define-keys `(emacs-lisp-mode-map lisp-interaction-mode-map java-mode-map c-mode-base-map text-mode-map ruby-mode-map html-mode-map) `(("C-c M-H" highlight-symbol-at-point) ("C-c M-R" highlight-symbol-remove-all) ("C-c M-N" highlight-symbol-next) ("C-c M-P" highlight-symbol-prev) ("C-c r" highlight-symbol-query-replace) ("C-c M-n" highlight-symbol-next-in-defun) ("C-c M-p" highlight-symbol-prev-in-defun)))) (defun highlight-symbol-settings-for-emaci () "`highlight-symbol' settings for `emaci'." (eval-when-compile (require 'cl)) ;;;###autoload (defun emaci-n () "Command bind to key n." (interactive) (if (edebug-active) (edebug-next-mode) (if (equal major-mode 'gud-mode) (call-interactively 'gud-next) (call-interactively 'highlight-symbol-next)))) (define-key-list emaci-mode-map `(("p" highlight-symbol-prev)))) (eval-after-load "emaci" `(highlight-symbol-settings-for-emaci)) (eval-after-load "highlight-symbol" '(highlight-symbol-settings)) (provide 'highlight-symbol-settings) |

loading...
I use this elisp sometimes,but it not useful as I think.
This elisp author is also company mode author,his homepage provide many useful elisp.
[回复]
ahei 回复:
十一月 29th, 2009 at 7:08 下午
虽然没有按语法进行高亮, 但是也够用了, 我觉得还挺不错的, 在看代码的时候挺方便的, 我现在一直在用.
是吗?有空去瞧瞧
[回复]
sometimes error occurs when my comments are written in english,please check it.
[回复]
ahei 回复:
十一月 29th, 2009 at 7:31 下午
我检查了一下配置, 没看出什么问题. 你是不是回复的时候, 引用了?
[回复]
[Comment ID #11116 Will Be Quoted Here]
可能是自己留言的问题,感觉留言被服务器接收比较慢,不知是否是yo2服务器的问题。
[回复]
ahei 回复:
十一月 30th, 2009 at 1:40 下午
可能是,yo2确实烂。我现在就凑合着用吧。
[回复]
博主您好。今天第一次发现这个这么优秀的emacs中文blog。我是新手,在这里又学到了好多东西。
不过用这个插件的时候一直出现问题,提示Symbol’s function definition is void: apply-define-key
网上没有找到相关资料。所以才冒昧提问一下。。。
[回复]
ahei 回复:
三月 13th, 2010 at 4:00 上午
@**, 呵呵,谢谢. 我更新了一下配置, 你再更新一下. 里面用到了一个util.el, 在我的DEA里面有下载, 以后有什么我配置里面的东西找不到的话, 先去我的DEA里面看一看.
[回复]
** 回复:
三月 15th, 2010 at 12:44 上午
@ahei, 博主回复好快呀,非常感谢哟O(∩_∩)O我着就看看去~~
[回复]
顺便想请教博主一个小问题哦。在windows下有没有办法只在开启emacs的时候交换caps和ctrl键呢?
现在的工作暂时还离不开windows,所有时候都交换两个按键也有不方便的地方。。。
[回复]
ahei 回复:
三月 15th, 2010 at 3:19 上午
你可以把你的caps lock和你的右ctrl交换阿,这样你既可以用你的ctrl,又可以用caps lock啦。而且即使你在win下,你也可以用caps lock做ctrl使阿,也照样非常方便阿
[回复]
不按语法高亮实在太容易做了,就是个字符串匹配。可是按语法高亮是很难做的。首先你必须为语言做parser,其次你必须对程序进行静态分析。Eclipse在这一点来说比Emacs强很多,因为它真正的理解程序语言,而Emacs不是真的理解那些语言。
[回复]
ahei 回复:
三月 16th, 2010 at 4:59 上午
Emacs当然有语法分析的工具,只不过这个高亮的功能没有使用语法分析的功能而已。Emacs的语法分析支持很多语言,不止java。Emacs做语法分析最强大的工具是cedet.
[回复]
ahei 回复:
三月 19th, 2010 at 5:35 上午
@, CEDET里有一个根据语法进行高亮的minor mode,想了解的话请看这里的semantic-idle-tag-highlight-mode。
[回复]
貌似内置的highlight-regexp, unhighlight-regexp就够用了。highlight-changes也蛮有意思的
[回复]
ahei 回复:
四月 3rd, 2010 at 2:57 下午
1. highlight-regexp必须手工输入正则
2. highlight-changes一直高亮修改, 编辑了大量文本后, buffer就很乱了, 可以试试cedet的semantic-highlight-edits-mode, 比较不错, 过几秒后, 修改的高亮就取消了
[回复]
(require ‘highlight-symbol)
这个命令执行不了,
highlight-symbol在哪里提供的?
grep dea-1.3, 可是找不到
[回复]
ahei 回复:
八月 30th, 2010 at 5:31 下午
@, grep要加上-r参数, http://code.google.com/p/dea/source/browse/trunk/lisps/highlight-symbol.el
[回复]