自定义Emacs工具栏
作者: Meteor Liu
前几天,emacs@newsmth上jcjbrian发了张他用emacs开发c++的截图,对他的工具栏挺感兴趣,所以向他请教了一下,同时也阅读了相关的info,在我的emacs上加了些自定义的工具栏(下图),在这记录一下以备忘。

emacs的工具栏配置都存放在tool-bar-map这个keymap里,这个keymap跟我们平时用于键绑定的keymap是一样的1,emacs会根据tool-bar-map的内容自动生成工具栏,如果执行一下下面这段代码,工具栏就没了:
(setq tool-bar-map (make-sparse-keymap)) |
要自定义工具栏,只需要修改tool-bar-map这个变量就可以了,一般我们可以用tool-bar-add-item这个函数来往tool-bar-map里添加工具项。
tool-bar-add-item的原型是这样的:
(tool-bar-add-item icon def key &rest props) |
参数icon设置工具图标,emacs的工具栏可以使用XPM和PBM格式的图标,当emacs 有libxmp支持时会使用XPM格式,没有libxmp库时会寻找PBM格式的图标(Info上还说有XBM格式,我没搞清楚什么情况下使用XBM)。
在etc/images目录下可以看到emacs自带的图标一般都同时有XPM和PBM两种格式,就是为了在没有libxmp库时也能显示工具栏,因为如果我们只有xpm格式的图标而没有libxmp库时,emacs就不在工具栏上显示这个项了。所以我们自己做图标时最好XPM和PBM都准备一份。
icon参数的类型是字符串,只需要传主文件名就可以,扩展名emacs会自己加,比如对图标文件semantic.xpm写成”semantic”。
emacs会在image-load-path下查找图标文件,这个变量的值默认为(“…/etc/images/” data-directory load-path),就是说它除了查找image目录外还会查找所有的load-path,所以如果我们有自己的图标目录,把它加到image-load-path或者load-path都可以。
图标的大小好像没有限制,emacs本身使用的图标是24×24像素的,如果使用了比它大的图标,整个工具栏会自动扩大。
参数def设置这个工具项被按下的执行什么命令,它的格式跟global-set-key里的command格式是一样的。
参数key用来给这个工具项指定一个key,这个key用于唯一标识这个工具项,所以在同一个keymap里key不能重复。
剩下的参数可以设置一些属性项,具体可以设置哪些属性可以看Info > elisp > Keymaps > Menu Keymaps > Defining Menus > Extended Menu Items。常用的几个属性有:
- :enable 这个属性的值是一个表达式,emacs对这个表达式求值,如果值为nil时,这个工具项会被禁用。
- :visible 这个属性控制这个工具项是否显示,它的类型与:enable是一样的。
- :help 这个属性类型是字符串,当鼠标在工具项上停留时会显示这个字符串。
其余的属性我没用过,也没仔细研究它们用来干什么。
举例来说,如果要添加一个工具项用来执行gdb命令,并且只有在c-mode或者c++-mode时才让它有效,可以这样:
1 2 | (tool-bar-add-item "gud/run" 'gdb 'gdb :enable '(memq major-mode '(c++-mode c-mode))) |
这样会把gdb这个工具项添加到默认工具栏的最后,如果不想要emacs默认的工具栏,可以先执行(setq tool-bar-map (make-sparse-keymap))把默认的工具栏清空。
我的toolbar配置文件在:http://github.com/meteor1113/dotemacs/blob/master/init-toolbar.el
Footnotes:
1 我读了半天info才明白,emacs的toolbar, menu和平时用global-set-key设置的按键绑定都是相通的,在emacs里,这些通通都保存在keymap里,只是menu和toolbar会多出一些属性设置。关于这些内容可以看看Info > elisp > Keymaps 以及下面的Menu Keymaps。

loading...
不错,学习了。toolbar 现在会定制了,但不知道scrollbar 怎么定制。我只要一拖动scrollbar ,emacs就会选中scrollbar滚动过的内容….
[回复]
ahei 回复:
六月 9th, 2010 at 5:15 上午
@xilbert, 我的不会阿,你emacs -Q试试
[回复]
xilbert 回复:
六月 9th, 2010 at 5:31 上午
@ahei, 这就奇怪了,emacs -Q 以后还是这样,
几天前特意安装ubuntu10.4来用emacs,结果发现碰到在windows下没有的问题。
这是其中的一个,还有一个就是org mode 好像不能auto-fill,其他mode下都会自动折行。
[回复]
ahei 回复:
六月 9th, 2010 at 6:10 上午
@xilbert, 那就奇怪了。另外,auto-fill-mode默认的就是关闭的吧,我emacs -Q试了,默认是关闭的
[回复]
xilbert 回复:
六月 9th, 2010 at 7:59 上午
@ahei, 我把它打开了(auto-fill-mode 1),依然如此
[回复]
ahei 回复:
六月 9th, 2010 at 8:04 上午
@xilbert, 那就不知道了,诡异
[回复]
匿名 回复:
六月 10th, 2010 at 2:39 上午
@ahei,
是我弄错了,org-mode 是不自动折行(wrap),而不是auto-fill今天偶然发现,有人这样设置就
折行了
;; turn on soft wrapping mode for org mode
(add-hook ‘org-mode-hook
(lambda () (setq truncate-lines nil)))
但scroll-bar 问题依然没解决,我把windows下的scroll-bar.el 复制到.emacs文件中,
还是那样
[回复]
ahei 回复:
六月 10th, 2010 at 3:04 上午
@, 你不是已经打开了auto-fill-mode吗?那是可以自动换行的阿,你是不是试错了?你杂试的?
[回复]
xilbert 回复:
六月 10th, 2010 at 4:47 上午
@ahei,是这样的,在我.emacs中设置过(auto-fill-mode 1)
,然后我打开一个org文件,我一直输入文字,中间没有敲回车,结果这行文字竟然不自动断
行,前面的文字跑到屏幕的外面去了(一直往左跑),在emacs的scrollbar旁边产生一个向右的箭头。
然后我打开一个c文件,就不会出现这样的问题,当文字到了最右端,它会自动转到下一行。
并且在scrollbar旁产生一个向下的箭头。
[回复]
ahei 回复:
六月 10th, 2010 at 5:47 上午
@xilbert, (auto-fill-mode 1)只对当前mode生效的,是local的,所以你org里面的没生效,c里面的也没生效,只是c默认的就是会truncate lines,而org没有,所以在org里面你需要手工执行一下M-x toggle-truncate-lines.你如果需要自动换行的话,需要执行一下M-x auto-fill-mode
[回复]
xilbert 回复:
六月 10th, 2010 at 5:51 上午
@ahei, 哦,原来如此啊,谢谢!
键盘流到此一游,呵呵
[回复]
请教,你的wordpress代码框用得是什么插件?
[回复]
ahei 回复:
六月 12th, 2010 at 8:39 上午
@, wp-codebox, 我的wordpress插件
[回复]
jcjbrian的载图好酷啊, 如何实现那几个分割窗口啊? 楼主知道么?顺便也给咱们讲讲吧
[回复]
ahei 回复:
六月 15th, 2010 at 9:20 上午
@sweord, jcjbrian用的插件叫codepilot,在这里可以下载: http://github.com/brianjcj/mylisp
[回复]
请问emacs中的中文输入法,怎么输入”兲”,”囧”"屄(文明使用,文明使用)”等个性的不常见词?
[回复]
ahei 回复:
六月 22nd, 2010 at 8:21 上午
你为什么不用搜狗输入法呢?我从来没用过Emacs的输入法
[回复]
tmpistemp 回复:
六月 22nd, 2010 at 8:23 上午
@ahei, 在linux上,不启动X,在命令行中使用的时候只好这样了
[回复]
ahei 回复:
六月 22nd, 2010 at 8:26 上午
@tmpistemp, 你会经常不启动X?
[回复]
tmpistemp 回复:
六月 22nd, 2010 at 6:30 下午
@ahei, 是的,有各种情况会让你不启动x
[回复]
Michael J. 回复:
七月 7th, 2011 at 12:16 下午
@tmpistemp,
嗯 这个你可以查查这些字的Unicode值 然后做个常用的记录表
纯用Emacs的话
在把其他字复制到Emacs后 用C-x = 查它的Unicode值 然后
用C-q 〈here enter oct char number〉 RET输入OCT的值
用C-x 8 RET 〈here enter hex char number〉 RET输入HEX的值
要么自己写个elisp把常用的这些字绑定一堆快捷键
再要不您不嫌麻烦 可以去做一个国标扩字符集到Unicode的转换表
再要不您想改造Emacs的话 顺便把它的自带输入法升级了吧
也顺便参照其他输入法弄个五笔的码表吧
[回复]
确实不太好用啊,够折腾人的。
如果没有联网,或者没有足够的scm工具,el-get简直是折磨人啊,还不如手动管理。linux下倒是很爽,不过这也失去了el-get的作用了,没法在各个平台下同步,还影响启动速度。
我现在还是用auto-install + package,大多数还是手动,足够了。
如果有好多方法还请赐教哈。
[回复]