Emacs 是什么的简称?Emacs 能做什么一个简略的介绍,讲述一下我已经知道的 Emacs 的功能。 Emacs 资料这里可以找到很多有关 Emacs 的资料。包括入门书籍,网址等。 Emacs Lisp 功能扩展集锦我搜集到的一些很好的 emacs 扩展。它们使得 Emacs 成为一个多 才多艺的编辑器。 Emacs 笔记这里简要记录一些 Emacs 的使用技巧。便于查询。 返回 Emacs 绑定键盘的技巧。万无一失的绑定方法很多人绑定一些比较特殊的键的时候,都搞不清楚在 (global-set-key ... ‘my-funtion) 里写些什么。特别是在 xterm 里的时候就更不知所措了。其实有一个万无一失的办法保证你一定写对。这个办法就是:
好了,你现在就能在 minibuffer 里看到你应该写在 .emacs 的东西了。 如果你还是失败了……如果你在第1步的时候发现 Emacs 根本对你的按键没有反应,那么应该怀疑是你的窗口管理器拦截了这个按键。比如,我的 FVWM 设置把 C-f3 设定成了打开一个 FvwmCommand, 所以 Emacs 接收不到这个按键。如果我要绑定一个函数到 C-f3, 我必须让 FVWM 放过 C-f3。 绑定新的前缀键其实上面的办法只能让你绑定一个已有的前缀。你有可能想绑定一个 save-buffer 到 "C-c C-w C-b a"。上面的办法就不灵了。我们必须使用另外的办法: (global-set-key (kbd "C-c C-w C-b a") ‘save-buffer) 一点解释上面的那个 "C-c C-w C-b a" 是自动把 "C-c C-w", "C-c C-w C-b" 都定义成了一个 prefix-command. 你可以这样看到它们:
现在你清楚的看到了 "C-c C-w", "C-c C-w C-b" 都是 prefix command 吧? 创建新的 prefix command上面这个办法只对开头的键已经是 prefix command 的键序列起作用,如果你的第一个键不是一个 prefix,那么就会出错。你可以试试:(global-set-key (kbd "C-z C-c C-w b") ‘find-file) 出现错误:(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个分支:
自定义 prefix command 的另外一个更大的好处就是:你可以修改最上层对 prefix command 的绑定,从而修改许多键的绑定。比如,我们可以把 “存盘” 轻而易举的改成 “保存”: (define-key ctl-z-map (kbd "保存") ‘盘-map) 这样一来, “C-z 保存!” ,“C-z 保存到” , “C-z 保存退出” 就分别有了 “C-z 存盘!” , “C-z 存盘到” 和 “C-z 存盘退出” 的含义了。 Emacs 的简单设置我觉得这里的设置对我来说比缺省的设置方便。
关闭烦人的出错时的提示声。
关闭起动时的那个“开机画面”。
显示列号。
不要在鼠标点击的那个地方插入剪贴板内容。我不喜欢那样,经常把我的文档搞的一团糟。我觉得先用光标定位,然后鼠标中键点击要好的多。不管你的光标在文档的那个位置,或是在 minibuffer,鼠标中键一点击,X selection 的内容就被插入到那个位置。
用一个很大的 kill ring. 这样防止我不小心删掉重要的东西。我很努莽的,你知道 :P
把 fill-column 设为 60. 这样的文字更好读。
不用 TAB 字符来indent, 这会引起很多奇怪的错误。编辑 Makefile 的时候也不用担心,因为 makefile-mode 会把 TAB 键设置成真正的 TAB 字符,并且加亮显示的。
设置 sentence-end 可以识别中文标点。不用在 fill 时在句号后插入两个空格。
可以递归的使用 minibuffer。我经常需要这么做。
防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
把缺省的 major mode 设置为 text-mode, 而不是几乎什么功能也没有的 fundamental-mode.
括号匹配时显示另外一边的括号,而不是烦人的跳到另一个括号。
光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。
在标题栏显示buffer的名字,而不是 emacs@wangyin.com 这样没用的提示。
让 Emacs 可以直接打开和显示图片。
进行语法加亮。
把这些缺省禁用的功能打开。
设置一下备份时的版本控制,这样更加安全。
一个简单的办法设置 auto-mode-alist, 免得写很多 add-to-list.
设置有用的个人信息。这在很多地方有用。
让 dired 可以递归的拷贝和删除目录。 移动光标
返回 Emacs Fill 详解Emacs 具有非常智能的文本编辑能力。它可以自动对文字断行,并且在断开的行首都加入一些 prefix(前缀)。 你编辑 C 程序多行注释的时候,你想要编辑器能够自动缩进到合适的位置并且插入一个 "*",就像这样? /* seed the random number generator * first try the random file /dev/random * if there isn‘t such a file in the system * use current time to seed the RNG. */ 在你写新闻组的文章的时候,你又想让编辑器使你的文档出现这样漂亮的缩进: 1. I seed the random number generator first try the random file /dev/random if there isn‘t such a file in the system use current time to seed the RNG. 2. I need more powerful randomized binary search tree algorithm to store my wavefront elements. 这些 * 和 行首留出的空白就叫做 prefix。每当使用 fill-paragraph 等操作或者启动了 auto-fill-mode 的时候,文字在断行时,Emacs 可能会在断开的每行前面加入 prefix(前缀)。这大大方便了编辑类似程序注释这一类文字。 设置 fill-columnfill-column就是说到多少列的时候断行。你可以使用 C-u 70 C-x f 这样的命令把 fill-column 设置为 70. 也可以把光标移动到你想要断行的位置,然后按 C-u C-x f 断开的行可能会被自动加上一个前缀(prefix)。设置prefix的方式主要有两种,手动设置和 adaptive prefix 自动设置。 手动设置 prefix如果把光标放在段落首后面一个位置,使用 C-x . (set-fill-prefix) 就可以把段落头到光标处的那段字符作为 prefix. Adaptive Filling但是没有手动设置 prefix 的时候,Emacs 也可以自动识别段落首的一些字符作为 prefix。这就叫做 Adaptive Filling。 提取候选前缀Emacs 使用变量 adaptive-fill-regexp 来提取前缀。这个变量是一个正则表达式。它会把fill区域开头的能够匹配的部分作为候选的前缀。很多 major mode 会自动帮你设置好这个变量,所以你通常不用操心。 但是某些时候,你可能希望能够自己操纵这一切。我们下面就来看一个具体的例子。假设如果你要达到这种效果,在同一个文本文件里:
这些 "*** ", "* ", "1. ", "2. ", " " 就叫做前缀。为了识别这些前缀,我们把 adaptive-fill-regexp 设置为: (setq adaptive-fill-regexp "[ \t]+\\|[ \t]*\\([0-9]+\\.\\|\\*+\\)[ \t]*") 这表示前缀可以全是空白字符。或者开头可以有一些空白,接着数字加点或者一个以上的 *,接着一些空白。那么 Emacs 发现开头有这样的字样时,就会把这个字符串作为一个“候选前缀”。 候选前缀的选择我们已经轻松提取了可能作为前缀的部分,但是一个候选前缀是否被使用,还有很多因素。Emacs 的策略是非常聪明的。我们下面来看看 Emacs 是怎样为用户着想的。
总结这个规则看起来挺复杂,不过我们可以用算法描述的方式简单的描述出来: 1. 使用 adaptive-fill-regexp 把每行开头部分能够匹配的字符提取出来,作 为“候选前缀”。 2. 如果文字有两行以上,把第二行的候选前缀插入到断开的所有行开头。 3. 如果文字只有一行,看看 adaptive-fill-first-line-regexp 能不能匹配这 行的候选前缀。如果能匹配,使用这个前缀。否则,把这个前缀转成同样长 度的空格,把这些空格作为前缀。 Emacs Outline Mode 示例
下面就是一个 LaTeX 文档的各种 outline 操作的结果示范。由于 outline-minor-mode 的键绑定前缀 C-c @ 过于复杂,大部分经常使用 outline 的人想把它设置为另一个键,所以以后我在叙述时直接称呼函数名字和简化前缀的键绑定。具体的键绑定请用 C-h w 查询。 更改前缀可以在启动 outline-minor-mode 之前,用改变 outline-minor-mode-prefix 变量的办法一次完成。比如: (setq outline-minor-mode-prefix [(control o)]) 就可以把前缀改成 C-o. 以后我们实例中的键绑定都使用 C-o. 本文的 Outline首先,给大家一个 outline 的总体印象。我们使用 outline 来看看本文的主要内容 :)
原文档这是一个非常简单的 LaTeX 文档: outline.tex
我们来把文档的各部分术语解释一下。
启动 OutlineM-x outline-minor-mode 就可以启动 Outline。还有一个 outline-mode 是一个 major mode,一般都不用它。 全局隐藏操作光标在任何位置,只要执行这些操作,文档的显示就会变化成需要的样子。 hide-sublevels(C-o C-q)这个操作如果不带参数,隐藏所有文档子结构,只剩最上层。
M-4 hide-sublevels(M-4 C-o C-q)这是参数为4的操作,显示至文档第4层子结构。
hide-body(C-o C-t)文档的所有 Entry 都被隐藏。只显示主干。
对一个子树(Chapter 1)的隐藏操作hide-subtree(C-o C-d)所有文档部分展开时,光标移动到 Chapter 1,执行 hide-subtree。整个 Chapter 1 的子树被折叠起来。
hide-other(C-o C-o)所有文档部分展开时,光标移动到 Chapter 1,执行 hide-other。除了 Chapter 1,其它子树全部被折叠起来。这个操作正好与 hide-subtree 互补。
hide-leaves(C-o C-l)所有文档部分展开时,光标移动到 Chapter 1,执行 hide-leaves。所有 Chapter 1 子树下的所有级别的 entry 被隐藏。也就是说,Chapter 1 下,只显示 branch.
hide-entry(C-o C-c)所有文档部分展开时,光标移动到 Chapter 1,执行 hide-entry。Chapter 1 的 Entry 被隐藏,但是所有子树都不动。
全局显示操作show-all(C-o C-a)显示所有文档。结果就是原文档。 对一个子树的显示操作为了演示,我们从全部隐藏的情况开始:
show-children(C-o C-i)show-children 只显示直接的下一代子树,而不显示间接的下一代。这里, \begin{document} 的直接的下一代就是 \chapter{...}。
show-entry(C-o C-e)把光标移动到 Chapter 1,执行 show-entry。Chapter 1 的 Entry 被显示,但是所有子结构还是保持隐藏。 show-branches(C-o C-k)把光标移动到 Chapter 1,执行 show-branches。Chapter 1 这棵子树之下的各级“树干”被显示,但是各级 entry 还是保持隐藏。Chapter 1 自己的 entry,由于我们上一步已经显示,所以保持不变。
show-subtree(C-o C-s)把光标移动到 Chapter 1,执行 show-subtree。Chapter 1 及其所有子结构全部被扩展。
Outline mode 下的移动操作在 outline 模式下,有几种特殊方便的移动方式。
|
|
来自: helloworld > 《linux》