Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1347375
  • 博文数量: 206
  • 博客积分: 10571
  • 博客等级: 上将
  • 技术积分: 2610
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 11:50
文章分类
文章存档

2014年(1)

2013年(4)

2012年(18)

2010年(14)

2009年(31)

2008年(3)

2007年(135)

分类: LINUX

2007-04-30 16:59:12

Emacs 编辑器完全介绍(7)

 

出现错误:(error "Key sequence C-z C-c C-w b uses invalid prefix characters")

所以你必须事先把第一个键设定为 prefix:

(define-prefix-command 'ctl-z-map)

(global-set-key (kbd "C-z") 'ctl-z-map)

然后再用

(global-set-key (kbd "C-z C-c C-w b") 'find-file)

就行了。"C-z C-c" 和 "C-z C-c C-w" 都会自动被定义为 prefix command.

绑定中文命令

现在我举一个例子来说明 prefix command 是如何工作的。我们可以把中文的 存盘 两个字绑定到save-buffer. 这样你用中文输入法敲入“存盘”两个字时,就可以把当前 buffer 保存起来。

(define-prefix-command '存-map)

(global-set-key (kbd "存") '存-map)

(define-key 存-map (kbd "盘") 'save-buffer)

有趣吧?你可以猜到这里面是怎么回事吧?太简单了是不是?当你输入“存”的时候,看到 minibuffer 是这样:

 

这是因为我们把“存”这个字绑定到了 存-map 这个 prefix-command. 当读到“存”的时候,Emacs 就会等待下一条命令,这个命令是定义在 存-map 这个 map 里的。它读到“盘”,就会执行 save-buffer 了。

不过注意,你真的要在文档里输入“存盘”两个字就得先打 C-q 了。刚才我就打了好多次 C-q,真累啊。还是用一些不常用的词组比较好,或者加一个 ctrl 什么的前缀,就像这个,"C-z 存盘"。

(define-prefix-command 'ctl-z-map)

(global-set-key (kbd "C-z") 'ctl-z-map)

(define-key ctl-z-map (kbd "存盘") 'save-buffer)

看我们更 bt 一点:

(define-prefix-command 'ctl-z-map)

(global-set-key (kbd "C-z") 'ctl-z-map)

(define-key ctl-z-map (kbd "给我存盘啦!") 'save-buffer)

嗨哟!yes sir!!

define-key 会自动建立很多 prefix command. 不过自己显式用 define-prefix-command 定义前缀命令有一个好处,就是你可以在你的 prefix 里再方便的定义更多的命令,而不用把整个前缀都写一遍。

(define-prefix-command 'ctl-z-map)

(define-prefix-command '存-map)

(define-prefix-command '盘-map)

(global-set-key (kbd "C-z") 'ctl-z-map)

(define-key ctl-z-map (kbd "存") '存-map)

(define-key 存-map (kbd "盘") '盘-map)

 

(define-key 盘-map (kbd "!") 'save-buffer)

(define-key 盘-map (kbd "到") 'write-file)

(define-key 盘-map (kbd "退出")

  (lambda ()

    (interactive)

    (save-buffer)

    (kill-emacs)))

这样,到了“C-z 存盘-” 这个时候,我们定义了3个分支:

  • “C-z 存盘!,表示保存这个文件;
  • “C-z 存盘到,表示保存到另一个文件;
  • “C-z 存盘退出,这个不用解释了吧。

自定义 prefix command 的另外一个更大的好处就是:你可以修改最上层对 prefix command 的绑定,从而修改许多键的绑定。比如,我们可以把 “存盘” 轻而易举的改成 “保存”:

(define-key ctl-z-map (kbd "保存") '盘-map)

这样一来, “C-z 保存!” ,“C-z 保存到” , “C-z 保存退出” 就分别有了 “C-z 存盘!” , “C-z 存盘到” 和 “C-z 存盘退出” 的含义了。


Emacs 的简单设置

我觉得这里的设置对我来说比缺省的设置方便。

·                (setq visible-bell t)

关闭烦人的出错时的提示声。

·                (setq inhibit-startup-message t)

关闭起动时的那个“开机画面”。

·                (setq column-number-mode t)

显示列号。

·                (setq mouse-yank-at-point t)

不要在鼠标点击的那个地方插入剪贴板内容。我不喜欢那样,经常把我的文档搞的一团糟。我觉得先用光标定位,然后鼠标中键点击要好的多。不管你的光标在文档的那个位置,或是在 minibuffer,鼠标中键一点击,X selection 的内容就被插入到那个位置。

·                (setq kill-ring-max 200)

用一个很大的 kill ring. 这样防止我不小心删掉重要的东西。我很努莽的,你知道 :P

·                (setq default-fill-column 60)

把 fill-column 设为 60. 这样的文字更好读。

·                (setq-default indent-tabs-mode nil)

·                (setq default-tab-width 8)

·                (setq tab-stop-list ())

·                (loop for x downfrom 40 to 1 do

·                      (setq tab-stop-list (cons (* x 4) tab-stop-list)))

不用 TAB 字符来indent, 这会引起很多奇怪的错误。编辑 Makefile 的时候也不用担心,因为 makefile-mode 会把 TAB 键设置成真正的 TAB 字符,并且加亮显示的。

·                (setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")

·                (setq sentence-end-double-space nil)

设置 sentence-end 可以识别中文标点。不用在 fill 时在句号后插入两个空格。

·                (setq enable-recursive-minibuffers t)

可以递归的使用 minibuffer。我经常需要这么做。

·                (setq scroll-margin 3

·                      scroll-conservatively 10000)

防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。

·                (setq default-major-mode 'text-mode)

把缺省的 major mode 设置为 text-mode, 而不是几乎什么功能也没有的 fundamental-mode.

·                (show-paren-mode t)

·                (setq show-paren-style 'parentheses)

括号匹配时显示另外一边的括号,而不是烦人的跳到另一个括号。

·                (mouse-avoidance-mode 'animate)

光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。

·                (setq frame-title-format "emacs@%b")

在标题栏显示buffer的名字,而不是 这样没用的提示。

·                (auto-image-file-mode)

让 Emacs 可以直接打开和显示图片。

·                (global-font-lock-mode t)

进行语法加亮。

·                (put 'set-goal-column 'disabled nil)

·                (put 'narrow-to-region 'disabled nil)

·                (put 'upcase-region 'disabled nil)

·                (put 'downcase-region 'disabled nil)

·                (put 'LaTeX-hide-environment 'disabled nil)

把这些缺省禁用的功能打开。

·                (setq version-control t)

·                (setq kept-new-versions 3)

·                (setq delete-old-versions t)

·                (setq kept-old-versions 2)

·                (setq dired-kept-versions 1)

设置一下备份时的版本控制,这样更加安全。

·                (mapcar

·                 (function (lambda (setting)

·                             (setq auto-mode-alist

·                                  (cons setting auto-mode-alist))))

·                 '(("\\.xml$".  sgml-mode)

·                   ("\\\.bash" . sh-mode)

·                   ("\\.rdf$".  sgml-mode)

·                   ("\\.session" . emacs-lisp-mode)

·                   ("\\.l$" . c-mode)

·                   ("\\.css$" . css-mode)

·                   ("\\.cfm$" . html-mode)

·                   ("gnus" . emacs-lisp-mode)

·                   ("\\.idl$" . idl-mode)))

一个简单的办法设置 auto-mode-alist, 免得写很多 add-to-list.

·                (setq user-full-name "Wang Yin")

·                (setq user-mail-address "wang-y01@mails.tsinghua.edu.cn")

设置有用的个人信息。这在很多地方有用。

·                (setq dired-recursive-copies 'top)

·                (setq dired-recursive-deletes 'top)

让 dired 可以递归的拷贝和删除目录。

阅读(1153) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~