首页 > Elisp, 中级 > 自定义Emacs工具栏

自定义Emacs工具栏

作者: Meteor Liu

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

自定义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。

分享家:Addthis中国
GD Star Rating
loading...
自定义Emacs工具栏, 8.1 out of 10 based on 17 ratings 标签:C/C++, Emacs, emacser, emacser.com, gdb, gud, keymap, meteor, meteor1113, screenshot, semantic, 工具栏, 截图, 配色, 配色, 鼠标

相关日志

分类: Elisp, 中级
  1. xilbert
    2010年6月9日04:07 | #1

    不错,学习了。toolbar 现在会定制了,但不知道scrollbar 怎么定制。我只要一拖动scrollbar ,emacs就会选中scrollbar滚动过的内容….

    [回复]

    ahei 回复:

    @xilbert, 我的不会阿,你emacs -Q试试

    [回复]

    xilbert 回复:

    @ahei, 这就奇怪了,emacs -Q 以后还是这样,
    几天前特意安装ubuntu10.4来用emacs,结果发现碰到在windows下没有的问题。
    这是其中的一个,还有一个就是org mode 好像不能auto-fill,其他mode下都会自动折行。

    [回复]

    ahei 回复:

    @xilbert, 那就奇怪了。另外,auto-fill-mode默认的就是关闭的吧,我emacs -Q试了,默认是关闭的

    [回复]

    xilbert 回复:

    @ahei, 我把它打开了(auto-fill-mode 1),依然如此

    [回复]

    ahei 回复:

    @xilbert, 那就不知道了,诡异

    [回复]

    匿名 回复:

    @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 回复:

    @, 你不是已经打开了auto-fill-mode吗?那是可以自动换行的阿,你是不是试错了?你杂试的?

    [回复]

    xilbert 回复:

    @ahei,是这样的,在我.emacs中设置过(auto-fill-mode 1)
    ,然后我打开一个org文件,我一直输入文字,中间没有敲回车,结果这行文字竟然不自动断
    行,前面的文字跑到屏幕的外面去了(一直往左跑),在emacs的scrollbar旁边产生一个向右的箭头。
    然后我打开一个c文件,就不会出现这样的问题,当文字到了最右端,它会自动转到下一行。
    并且在scrollbar旁产生一个向下的箭头。

    [回复]

    ahei 回复:

    @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 回复:

    @ahei, 哦,原来如此啊,谢谢!

  2. 2010年6月9日13:13 | #2

    键盘流到此一游,呵呵

    [回复]

  3. 匿名
    2010年6月12日08:32 | #3

    请教,你的wordpress代码框用得是什么插件?

    [回复]

    ahei 回复:

    @, wp-codebox, 我的wordpress插件

    [回复]

  4. sweord
    2010年6月15日09:10 | #4

    jcjbrian的载图好酷啊, 如何实现那几个分割窗口啊? 楼主知道么?顺便也给咱们讲讲吧 :)

    [回复]

    ahei 回复:

    @sweord, jcjbrian用的插件叫codepilot,在这里可以下载: http://github.com/brianjcj/mylisp

    [回复]

  5. tmpistemp
    2010年6月22日07:53 | #5

    请问emacs中的中文输入法,怎么输入”兲”,”囧”"屄(文明使用,文明使用)”等个性的不常见词?

    [回复]

    ahei 回复:

    你为什么不用搜狗输入法呢?我从来没用过Emacs的输入法

    [回复]

    tmpistemp 回复:

    @ahei, 在linux上,不启动X,在命令行中使用的时候只好这样了

    [回复]

    ahei 回复:

    @tmpistemp, 你会经常不启动X?

    [回复]

    tmpistemp 回复:

    @ahei, 是的,有各种情况会让你不启动x

    [回复]

    Michael J. 回复:

    @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的话 顺便把它的自带输入法升级了吧
    也顺便参照其他输入法弄个五笔的码表吧

    [回复]

  6. seagle
    2011年1月28日20:02 | #6

    确实不太好用啊,够折腾人的。
    如果没有联网,或者没有足够的scm工具,el-get简直是折磨人啊,还不如手动管理。linux下倒是很爽,不过这也失去了el-get的作用了,没法在各个平台下同步,还影响启动速度。
    我现在还是用auto-install + package,大多数还是手动,足够了。
    如果有好多方法还请赐教哈。

    [回复]

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