第一部分 Emac基础知识
Emacs窗口剖析
专家们通常会配置他们的Emacs,使它关闭菜单栏,好在屏幕上留出更大的编辑空间。但是在您学习Emacs时,菜单栏是帮您熟悉其丰富功能的好方法。
要用键盘访问菜单栏,请按F10。您可以使用向上或向下的方向键,在菜单选项中移动,然后按 Enter。如果您想终止这一过程,可以随时按下Ctrl-G。
自上而下:菜单栏、窗口(缓冲区)、模式行、迷你缓冲区
在每个 Emacs 窗口中都有一条横贯底部的高亮条,它被称为模式行,您可以把它看成是状态栏。它将为您提供有关Emacs 会话和当前缓冲区(在上面的窗口中显示)的信息。
学习如何键入 Meta 组合键
Emacs 键盘输入中的第二种主要类型是 Meta 键;在 Emacs 符号中,Meta 按键被表示为 M-。如果您从未听说过Meta 键,那是因为目前的大多系统并没有这个键。输入 Meta 组合键,有三种方法:
Meta 键常被绑定到 Alt 键,使用方法与 Ctrl 键类似。如果您的设置就是这样,请使用该设置,这是最简单、最常见的方法。通常您可以使用Esc 键完成一个 Meta 按键序列,但您的操作与输入一个 Ctrl 按键序列时不同。按下 Esc,然后松开,再按第二个键。您可以用Ctrl-[ 代替 Esc 键。如果您通过网络线路运行 Emacs,无法使用 Esc 和 Alt 键,这种方法会很方便。
请尝试输入 M-b 命令,这会把光标向回移动一个单词,有三种操作方法:
1.按住 Alt 键,然后按一下 B。
2.按下 Esc,然后松开,再按一下 B。
3.按住 Ctrl 键,再按 [,同时松开两个键,然后再按一下 B。
您运行的每个 Emacs 命令都是一个函数,由 Emacs Lisp 定义,并有一个函数名。甚至连用向上方向键将光标向上移动一行也是一个函数(previous-line)。您可以使用M-x 命令,然后再输入函数名,运行任意一个函数。
请尝试以下操作:
1.按住 Alt 键。
2.按 X 键。
3.同时松开两个键,您会注意到迷您缓冲区中会出现“M-x”字样。
4.键入previous-line 并按 Enter。
当然,您平常是不会这样运行这个函数的,因为使用向上方向键比这容易多了,不过这是个好例子。函数为数众多,而且由于 Emacs 是可扩展的,
您可以编写自己的函数以扩展其功能。
缓冲区操作
基本操作
C-x C-s保存Buffer内容到文件
C-x C-f打开或新建文件
新建缓冲区
C-x b切换缓冲区时,如果输入新名字,则会新建缓冲区
切换缓冲区
C-x b通过输入缓冲区名字,切换到指定缓冲区
C-x o切换到临近缓冲区窗口
C-x C-b打开当前缓冲区列表
杀死缓冲区
C-x k杀死缓冲区,回车则默认是杀死当前缓冲区
移动快捷键
键盘输入 |
函数 |
描述 |
C-p, |
previous-line |
将插入点向上移动到上一行。 |
C-n,DownArrow |
next-line |
将插入点向下移动到下一行。 |
C-f,RightArrow |
forward-char |
将插入点移动到下一个字符。 |
C-b,LeftArrow |
back-char |
将插入点移动到上一个字符。 |
M-f |
forward-word |
将插入点移动到下一个单词。 |
M-b |
backward-word |
将插入点移动到上一个单词。 |
C-v, PgDn |
scroll-up |
将文本向上滚动一屏。 |
M-v, PgUp |
scroll-down |
将文本向下滚动一屏。 |
Home |
beginning-of-buffer |
将插入点移到缓冲区的开始处。(在某些版本中,这个键被缺省定义为移动到当前行的开始处。) |
End |
end-of-buffer |
将插入点移到缓冲区的末尾。(在某些版本中,这个键被缺省定义为移动到当前行的末尾。) |
C-a |
beginning-of-line |
将插入点移到本行的开始处。 |
C-e |
end-of-line |
将插入点移到本行的结尾。 |
M-a |
beginning-of-sentence |
将插入点移到句子的开始处。 |
M-e |
end-of-sentence |
将插入点移到句子的结尾处。 |
C-{ |
beginning-of-paragraph |
将插入点移到段落的开始处。 |
C-} |
end-of-paragraph |
将插入点移到段落的结尾处。 |
删除,撤消和重复
要删除插入点的字符,请用C-d;类似地,M-d 会从插入点开始,删除到单词的末尾。
您可以通过运行 undo 函数把它找回来。该函数被绑定到C-_,您要键入它,即 Ctrl并用 Shift 键输入下划线。
C-u 是一个通用参数命令,后面接一个数字和一个命令。它将按某个次数多次运行特定的命令。
尝试以下操作:移动到第二句诗的开始处,键入 In what distant d,然后再键入 C-u 2 e,这将写入两个 e 字符。在没有数字参数的情况下,C-u 会假定这个数字为 4。如果您将 C-u 本身作为参数,则 4 会自乘,得到 16;您可以在反复自乘任意多次之后再指定一个命令,如 C-u C-u C-u A 会在插入点处键入 64 个 A。
第二部分 Emacs基本模式和编辑特性
获得当前模式的描述
这些模式可以划分为主要模式和次要模式。主要模式规定了主要的编辑行为,并且仅应用于当前编辑会话中的缓冲区。
在任何时刻,每个缓冲区都有且仅有一个活动的主要模式。
次要模式通常提供了一些与任何特定的主要模式无关的特性或功能。次要模式包括 Overwrite 模式(本系列文章的第一部分教程对其进行了描述)、用于管理签入版本控制系统 (RCS) 的文件的 RCS 模式、以及处理自动文字回绕的 Auto Fill 模式。可以在任何时候同时激活所有这些次要模式以及许多其他类似的模式。
C-h m查看当前缓冲区的所有主要和次要模式。
设置模式
Emacs 模式是一些函数。要调用其中某个函数,您需要输入 M-x,然后给出模式名。
Text模式
Text模式是一种基本的模式,与Fundamental 模式相比仅有很少的改变,所以它的优势并不明显;但它是对口语(如英语)文本进行编辑的一个很好的基础。从 TeX 模式到 Outline 模式,许多用于编辑某类文本或文档的特殊模式都是基于 Text 模式的。Text 模式下,Tab 键被定义为相对于先前段落的缩进以缩进段落。
Abbrev模式
尝试定义一个缩写的全拼,并使其应用于所有的缓冲区:
1.在一新行中,输入一个缩写单词 li,,以使得光标位于这个单词的末尾(即在 i 之后)。
2.通过输入C-xa i g,运行 inverse-add-global-abbrev 函数。
3.在小缓冲区中给出提示的地方定义您的缩写:输入 Little lamb 并按 Enter。
下面开启Abbrev 模式:输入M-xabbrev-mode。
测试一下吧,输入li空格后,li就会自动变成Little lamb。
反过来,也可以为一个已有单词全拼定义缩写。当您在编写程序源代码并且刚输入了一个较长的变量时,这种方式是特别有用的。现在,请尝试下面的操作:
1.在新行中输入 He became a little child。
2.当光标紧跟在 child 这一单词之后时,输入C-xa g。
3.在小缓冲区中输入 c 并按 Enter。
转换大小写
有几个 Emacs 函数可以用于转换大小写。uppercase-word 函数(绑定到M-u)可以将光标处到光标所在词的词尾之间的所有文本都转换为大写字母。类似地,downcase-word(绑定到M-l)可以将光标处到光标所在词的词尾之间的所有文本转换为小写字母。
在缓冲区中尝试下面这些操作:
1.将光标移动到以“For he calls”开头的行,并输入 M-c M-c M-l M-c M-l M-c 以使这一行正确地变为大写。
2.向下移动光标到以“We are called”开头的行,并且输入 M-u M-u M-u M-u M-u M-u 以使整行内容转换为大写字母。
增量搜索
这是一种很有效的文本搜索方式,因为与带有搜索框工具的应用程序不同,在这些应用程序中,您需要输入一个术语,然后按 Enter(或者更糟,您必须单击 OK 按钮),而在您输入关键词的第一个字母时立即开始进行增量搜索。一旦找到正确的匹配项,您即可停止输入。
最常用的增量搜索是 isearch-forward 函数,它绑定到C-s。它从缓冲区中光标处开始前向搜索您给出的文本。要移到下一个匹配项,可以再次输入 C-s。当您到达了缓冲区的末尾,Emacs会发出提示声,并在小缓冲区中显示一则消息,即已到达缓冲区末尾。如果此后您再次输入 C-s,搜索工作将回绕到缓冲区的开头(小缓冲区将给出提示信息)。
第三部分 高级Emacs文本操作
(略)
第四部分 选项、寄存器和书签
命令行参数
$ emacs plans tasks 同时打开多个文件
$ emacs +15practice.b 打开文件并定位到第15行
$ emacs +3:12practice.b 打开文件并定位到第3行第12个字符
$ emacs +10:5practice.b –insert myfile anotherfile 插入文件到指定行
$ emacs -nw
最有用的 Emacs 命令行选项之一是 -nw,这个选项在当前终端中打开 Emacs,而不是创建一个它自己的新的 X 客户端窗口。当您正通过一个慢速的连接运行远程终端窗口,并且不希望启动本地的 X 客户端窗口时,这是非常有用的。
$ emacs -q
通过给定 -q 选项,您可以指定 Emacs 不运行任何现有的启动文件。当您希望运行一个 Emacs 会话,而不使用任何已有的自定义设置时;当您正在使用一个新的 Emacs 功能时;当某处出现了奇怪的行为时;或者您不确定是否您自己的某个自定义设置是导致问题的原因时,对于调试新添加到您的启动文件中的内容,这个选项是非常有用的。
$ emacs -u joe
因为每个人的 .emacs 文件是不同的,所以您可能希望尝试使用其他人的启动文件,以实现相应的更改,并观察其他人如何自定义他们的编辑环境。只要这个.emacs启动文件对您来说是可读的,那么该命令将使用用户joe的home目录中.emacs启动文件来启动Emacs。
$ emacs +999 myfile –eval”(insert (current-time-string))”
要启动 Emacs 并执行一个 Lisp 表达式,可以使用 –eval 选项;并在其后紧跟一个用引号括起来的 Lisp 表达式。
$ emacs –batch +35practice.b –insert myfile -f save-buffer –kill
您可以采用批处理模式运行 Emacs,以实现非交互处理。当您给出 –batch 选项时,Emacs 将不对标准输出进行写操作,并且它将从标准输入(而不是迷你缓冲区)中获得输入。Emacs 将执行给定的命令,直到一个导致退出的命令、或者直到它碰到一个 –kill 选项。
第五部分 确定Emacs视图形状
C-x 2 垂直划分
C-x 3 水平划分
C-x 0 关闭窗口
C-x 1 关闭当前窗口外的所有窗口
C-x ^ 使当前窗口更高些
M—C-x ^ 更矮些
C-x { 使当前窗口更窄些
C-x } 使当前窗口更宽些
C-x 5 2 生成一个新的框架。(它出现在您桌面上的确切位置,取决于您的窗口管理器。)它也包含了之前缓冲区的一个副本。
第六部分 自定义Emacs环境
C-h v 查看变量值
M-x set-variable 修改变量值
自定义Emacs键绑定
M-x global-set-key
global-set-key 函数将给定的函数绑定于给定的按键,并使得它在所有的模式和缓冲区中都有效。要为当前没有定义的按键定义一个新的绑定,可以运行 global-set-key 函数,给出新的按键,然后给出要运行的命令。
例如,绑定M-`到phases-of-moon函数,该函数将打开一个显示当前月亮盈亏的新缓冲区窗口。尝试下面的操作:
M-x global-set-key
Set key globally: M-`
Set key <M-F1> to command: phases-of-moon
M-x menu-bar-mode 关闭/开启菜单栏
M-x display-time 在模式行中放置一个时钟
定制时间显示格式
M-x set-variable
Set variable: display-time-day-and-date
Set display-time-day-and-date to value: 1
===============================================================================
参考资料
Emacs编辑环境,第1部分:学习Emacs的基础知识
http://www.ibm.com/developerworks/cn/education/aix/emacs1-1/index.html
http://www.ibm.com/developerworks/cn/education/aix/emacs1-1/section2.html
http://www.ibm.com/developerworks/cn/education/aix/emacs1-1/section3.html