Careone <[email protected]>, 2012.6
首先分析下Emacs的菜单项的各种语法:
例1:define-key
代码: 全选
;; The "File" menu items
(define-key menu-bar-file-menu [exit-emacs]
`(menu-item ,(purecopy "退出") save-buffers-kill-terminal
:help ,(purecopy "保存未保存的缓冲区,退出 Emacs")))
* 打头是用 define-key(定义菜单);
* menu-bar-file-menu 代表对应的 menu-bar.el 文件中, file 菜单项的菜单。这是一种命名惯例,方便理解和维护;
* exit-emacs 代表本文件内的标记;
* menu-item 后面双引号内的内容,代表表示菜单项的文字,但应注意前面应加 purecopy 字样。可以进行翻译;
* save-buffers-kill-terminal 代表菜单项执行的命令。可以进行翻译;
* help 后面双引号内的内容,代表帮助提示信息;
例2:menu-bar-separator(添加菜单项中的分隔线)
代码: 全选
(define-key menu-bar-file-menu [separator-exit]
menu-bar-separator)
* 打头是用 define-key;
* menu-bar-file-menu 代表对应的 menu-bar.el 文件中, file 菜单项的菜单。这是一种命名惯例,方便理解和维护;
* separator-exit 代表本文件内的标记。每个分隔线的标记都必须是不同的,如果有重名,只会出现一个,其它的不会在菜单中显示出来;
* menu-bar-separator 代表这是一个分隔线;
例3:
代码: 全选
(define-key menu-bar-file-menu [delete-this-frame]
`(menu-item ,(purecopy "删除框架") delete-frame
:visible (fboundp 'delete-frame)
:enable (delete-frame-enabled-p)
:help ,(purecopy "Delete currently selected frame")))
* 打头是用 define-key;
* 比例1多了下面两条信息:
* visible:
* enable:
例4:
代码: 全选
(define-key menu-bar-file-menu [revert-buffer]
`(menu-item ,(purecopy "重读缓冲区") revert-buffer
:enable (or revert-buffer-function
revert-buffer-insert-file-contents-function
(and buffer-file-number
(or (buffer-modified-p)
(not (verify-visited-file-modtime
(current-buffer))))))
:help ,(purecopy "Re-read current buffer from its file")))
(define-key menu-bar-file-menu [write-file]
`(menu-item ,(purecopy "另存为...") write-file
:enable (and (menu-bar-menu-frame-live-and-visible-p)
(menu-bar-non-minibuffer-window-p))
:help ,(purecopy "保存当前缓冲区到其它文件")))
* 打头是用 define-key (定义菜单);
* 比例1多了下面这条信息:
* enable:
* 多了条件运算符 and 和 or;
例5:
代码: 全选
(define-key menu-bar-file-menu [ps-print-region-faces]
`(menu-item ,(purecopy "使用 Postscript 打印区域") ps-print-region-with-faces
:enable mark-active
:help ,(purecopy "优质打印选区到 PostScript 打印机")))
(define-key menu-bar-file-menu [ps-print-buffer-faces]
`(menu-item ,(purecopy "使用 Postscript 打印缓冲区") ps-print-buffer-with-faces
:enable (menu-bar-menu-frame-live-and-visible-p)
:help ,(purecopy "使用 PostScript 优质打印缓冲区")))
* 打头是用 define-key;
* 第一个 :enable后面 make-active 没有带括号;
* 第二个 :enable后面 有带括号;
例6:
代码: 全选
;; The "Show/Hide" submenu of menu "Options"
(defvar menu-bar-showhide-menu (make-sparse-keymap "显示/隐藏"))
(define-key menu-bar-showhide-menu [column-number-mode]
(menu-bar-make-mm-toggle column-number-mode
"列号"
"Show the current column number in the mode line"))
* 打头是用defvar (定义变量.也可理解为定义可扩展菜单,也就是说,这个菜单下面还有子菜单 define-key);
* menu-bar.el 文件下 showhide菜单下的可扩展菜单;
* makeu-sparse-keymap 代表可扩展菜单,双引号内的内容可以翻译;
* column-number-mode 代表可执行的命令;
* 最后面两行,分别代表菜单项内容,帮助提示信息内容;
* 这种菜单项创建模式,比例1要简单。例1/例3中的visable和enable可以控制在哪些情况下,该菜单项是灰色不可用的;
* 自己可以参考这种方式,自定义添加自己的菜单;
例7:
代码: 全选
(defun menu-bar-showhide-fringe-menu-customize-reset ()
"复位包边模式: 在窗格两侧都显示包边。"
(interactive)
(customize-set-variable 'fringe-mode nil))
(define-key menu-bar-showhide-fringe-menu [default]
`(menu-item ,(purecopy "默认值") menu-bar-showhide-fringe-menu-customize-reset
:help ,(purecopy "左右两侧都显示包边")
:visible (display-graphic-p)
:button (:radio . (eq fringe-mode nil))))
* 打头是用 defun (作用:自定义图形化的设置菜单,常用于修改某些设置);
* :button 代表在自定义界面中出现的按钮,radio 代表单选,nil 代表否(相当于通常所说的null);
例8:
代码: 全选
;;; Buffers Menu
(defcustom buffers-menu-max-size 10
"Maximum number of entries which may appear on the Buffers menu.
If this is 10, then only the ten most-recently-selected buffers are shown.
If this is nil, then all buffers are shown.
A large number or nil slows down menu responsiveness."
:type '(choice integer
(const :tag "全部" nil))
:group 'menu)
(defcustom buffers-menu-buffer-name-length 30
"Maximum length of the buffer name on the Buffers menu.
If this is a number, then buffer names are truncated to this length.
If this is nil, then buffer names are shown in full.
A large number or nil makes the menu too wide."
:type '(choice integer
(const :tag "长整型" nil))
:group 'menu)
* 打头用 defcustom;
例9:其它常见表达式
代码: 全选
(global-set-key [f10] 'menu-bar-open)
(provide 'menu-bar)
(require 'facemenu)
(load "facemenu")
(autoload "facemenu" "Facemenu" t)
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(column-number-mode t)
'(display-battery-mode t)
'(display-time-mode t)
'(size-indication-mode t)
(global-linum-mode 1)
'(global-linum-mode t)
(setq load-path (cons "$HOME" file:///d:/emacs-23.4)
(setq load-path (cons "$HOME" ~)
* global-set-key 代表调置快捷键F10, 对应的命令是 menu-bar-open;
* provide 是表示本文件提供的是menu-bar 菜单相关条目,可以理解为表明自己身份。注意前面要加一个英文单引号;
* require 表示需要某个 .el/.elc文件, 主文件名是 facemenu。注意前面也要加一个英文单引号;
* load 表示加载某个 .el/.elc 文件,主文件名是 facemenu。注意是用两个双引号包起来;
* autoload 代表自动加载某个 .el/.elc文件,第一组双引号内是主文件名是 facemenu。名称,第二组双引号内是菜单项的显示内容,后面是值: t代表“真”,nil代表“假”;
* 注意global-linum-mode的几种写法:直接写在小括号内的,后面用数字1代表真,数字0代表假;如果小括号前面还有个英文单引号,后面的用t 代表真,nil代表假。不要弄错了。
(global-linum-mode 1)
'(global-linum-mode t)
* setq load-path代表设置额外的加载路径(如自已定制的.el/.elc 文件);
-------------------
说明:
以上是自已对emacs 的一点心得。有兴趣的朋友,可以按相关原理自定义和调整自己的emacs,以及处理emacs 中文菜单的翻译工作。
另外:EMACS菜单的中文翻译,主要在于处理 lisp/menu-bar.el 主菜单文件,以及 lisp/loadup.el中加载的文件。文件位置如下:
* Emacs for windows:
C:\Emacs-23.4\lisp\menu-bar.el
C:\Emacs-23.4\lisp\loadup.el
------
* Emacs for linux:
/usr/share/emacs/23.1/lisp/menu-bar.el
/usr/share/emacs/23.1/lisp/loadup.el
------