自定义Emacs的菜单项(技术分析)

Vim、Emacs配置和使用
回复
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

自定义Emacs的菜单项(技术分析)

#1

帖子 careone » 2012-06-10 12:58

自定义Emacs的菜单项(技术分析)
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
------
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
头像
呼文彪
帖子: 338
注册时间: 2009-03-13 20:31
来自: cnblogs.com/open_source

Re: 自定义Emacs的菜单项(技术分析)

#2

帖子 呼文彪 » 2012-07-15 15:12

不错!

代码: 全选

'(("OS" . "Fedora")
  ("editor" . "Emacs"))
  ("blog" . "http://www.cnblogs.com/open_source")
回复