1. GNU
和Emacs
简介
1.1 GNU
工程简介 目录
摘自WikiPedia
。1985
年,Richard Stallman
(理查德.斯托曼)创立了自由软件基金会(Free Software Foundation
) 来为GNU
计划提供技术,法律及财务支持。到了1990
年,GNU
计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs
,C
语言 编译器GCC
以及大部分UNIX
系统的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD
)。1991
年, Linus Torvalds
(林纳斯.托瓦兹)编写出了与UNIX
兼容的Linux
操作系统内核,并在GPL
条款下发布。Linux
之后在网上广泛流传, 许多程序员参与了开发和修改。1992
年,Linux
与其他的GNU
软件结合,完全自由的操作系统正式诞生。该操作系统往往被称 为"GNU/Linux"
,或简称Linux
。尽管如此,GNU
计划自己的内核Hurd
依然在开发中,目前已经发布Beta
版本。GNU
工程十几年来 已经成为一个对软件开发主要的影响力量,创造了无数的重要工具,例如:强健的编译器GCC
,有力的文本编辑器Emacs
,甚至一个 全功能的操作系统。
1.2 Emacs
历史介绍目录
Emacs
在1970
年诞生于MIT
人工智能实验室(MIT AI Lab)
,在此之前,人工智能实验室的ITS
上运行的操作系统PDP-6
和 PDP-10
的默认编辑器是一个叫做TECO``(Text Editor and Corrector)
的编辑器。与现代的文本编辑器不同,TECO
将击键,编 辑和文本显示按照不同的模式处理。在TECO
上击键并不会直接将这些字符插入到文档里去,必须输入一系列的TECO
指令,而被编辑 的文本在输入命令的时候是不会显示在屏幕上的。
1970
年代初,Richard Stallman
访问Stanford AI Lab
时见到了那里的”E“editor
。这种编辑器有着所见即所得的直观 特点,深深打动了Stallman
。那时候MIT AI Lab
的黑客Carl Mikkelsen
已经给TECO
加上了称作"Control-R"
的编辑显示模式, 使得屏幕能跟随用户的每次击键刷新显示。Stallman
重写了这一模式,使它运行得更有效率,后来又加入了宏,允许用户重新定义运 行TECO
程序的键位。这一新版的TECO
立刻在AI实验室流行开来,并且很快积累了大量自定义的宏,这些宏的名字通常就以“MAC”
或者 “MACS"
结尾,意为”宏“。两年后,Guy Steel
承担起统一当时存在的各种键盘命令集的工作。Steele
和Stallman
经过一夜奋战, 最终由Stallman
完成了这一任务,包括一套扩展和注释新的宏包的工具。这个完成的系统被称作EMACS
,代表“Editing MACros"
。
随后的几年里,开发出了许多运行于其他操作系统的类Emacs
的编辑器,包括由Michael McMahon
和Daniel Weinreb
编写的 SINE,EINE,ZWEI
。1978
年,Honeywell
的Cambridge Information System Lab
的Bernard Greenberg
用Maclisp
编写出 Multics Emacs
,第一次完全采用Lisp
作为扩展语言。Lisp
语言提供了前所未有的灵活性,因此被后来的Emacs
开发者沿用。最早在Unix
上运行的Emacs
类编辑器是1981
年James Gosling
编写的Gosling Emacs(Gosling
后来发明了Java
编程语言)。1984
年, Gosling Emacs
成为专有软件(Proprietary software)
。
1984
年,Stallman
开始致力于开发GNU Emacs
,这是一个自由软件,以代替Gosling Emacs
。GNU Emacs
是GNU
计划的第 一个项目,以C
语言编写,将Emacs Lisp
作为扩展语言。GNU Emacs
最广泛发布的版本事15.34
,出现于1985
年。实际上版本2
到12
并不存在,GNU Emacs
的早期版本都是以"1.x.x"
的形式编号,直到1.12
版时,开发人员放弃了这一记法。因此,Version 13
是第 一个公共发行的版本,它发布于1985
年3
月20
日。GNU Emacs
和Gosling Emacs
一样运行在Unix
系统上。不过,GNU Emacs
功能更 多,特别它有一个真正的lisp
作为扩展。结果,GNU Emacs
很快就取代了Gosling Emacs
,成为Unix
系统上事实的Emacs
编辑器。
到1999
年为止,GNU Emacs
的开发工作基本上是在封闭的情况下进行。后来,GNU Emacs
项目建立了公共开发邮件列表和匿名CVS
代码访问。现在的开发在一个CVS
代码仓库中进行,最新的版本是23.0.60
。Richard Stallman
一直以来是GNU Emacs
的维护者。 他于2008
年将代码的维护工作交给了Stefan Monnier
和Chong Yidong
。
Emacs
不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能让使用者置身于全功能的操作系统中,在 给予编辑器的功能基础上,Emacs
自行开发了一个"Bourne-shell-like"
的shell:EShell
。
2.Emacs
基本知识
2.1 Emacs
的界面元素目录
这里以纯文本的界面为例,也就是通过 emacs -nw
来启动的情况。Emacs
启动后的界面从上到下依次为:缓冲区窗口,信息栏 (英文叫:mode line
应该翻译成模式行,这一行也确实显示了编辑模式的信息,但是它也显示了许多关于所编辑的缓冲区的其他的 信息,翻译成信息栏从意义上也可以),回显区(echo area
)。
缓冲区窗口是用来编辑文件的,Emacs
把它所编辑的文档放在内存的缓冲区中编辑,直到用户保存了文档,才保存到原来的文档里, 即使Emacs
对文档进行自动保存,它也不是保存到源文件里。所以,Emacs
里所编辑的文档都被称作缓冲区。
信息栏会显示当前编辑文档的一些信息,比如:缓冲区的名字,编辑模式,当前光标所在的行数和列数。我的信息栏当前显示的内 容如下:
-UUU:**-F1 Emacs
中文手册 47%
L27
(Fundamental)----------------------------------------
-UUU
代表???
**-:*
代表未保存,-
代表可写,如果出现%
代表只读
47%
代表光标的位置所占整个缓冲区的比例,还可能事 All
(代表着一个屏幕就显示了缓冲区的所有内容),Top
(代表当前屏幕位 于缓冲区的顶端),Bot
(代表当前屏幕位于缓冲区的底部,即当前屏幕下面没有内容了)。
L27
代表当前光标所在的行号;
Fundamental
表示当前的编辑模式。
回显区(echo area,minibuffer)
:回显区用来回显用户的输入(参数或者命令),回显区不显示只有一个字符的指令,比如:Ctrl-e
。 对于多个字符的指令,只要键入字符的时候给予稍许的停顿,echo area
就会把键入的指令回显出来。等第一次的回应产生时,再输入 的部分就不需要再给于停顿的时间,其回应会在输入的同时立即产生。echo area
除了回显指令之外,也会将指令的回馈显示出来, 错误信息也会显示在这里。
回显区(echo area,minibuffer)
:回显区用来回显用户的输入(参数或者命令),回显区不显示只有一个字符的指令,比如:Ctrl-e
。 对于多个字符的指令,只要键入字符的时候给予稍许的停顿,echo area
就会把键入的指令回显出来。等第一次的回应产生时,再输入 的部分就不需要再给于停顿的时间,其回应会在输入的同时立即产生。echo area
除了回显指令之外,也会将指令的回馈显示出来, 错误信息也会显示在这里。
2.2 Emacs
的缓冲区和视窗目录
缓冲区是Emacs
用来存放所编辑的文档的内存区,我们是通过视窗来看到缓冲区的内容的,我们对文档的所有改动都是在缓冲区 中进行的。只要用户不将缓冲区的内容存回硬盘里的文档,那么硬盘里的文档是不会随着缓冲区而有任何改变的。为了减少因一些意外 关机等因素造成的用户资料的丢失,Emacs
会将用户正在编辑的文档自动存储在一个暂存档里面,这个暂存档的名字类似于这样:".#myfile"
, 可以看到他是一个隐藏文件。这种自动存储动作默认情况下会在用户输入300
个字符或者间隔30
秒的时间发生。在用户用Emacs
打开文 档的时候,Emacs
也会建立一个暂存文档"myfile~"
,这个文档保存了打开之前的文档内容。这样来保护用户的资料,防止误操作引 起的丢失。可以通过Alt(ESC)-x recovery-file
来从暂存档中恢复文档。
2.3 Emacs
设定环境配置目录
Emacs
中的一些变量的设置可以通过Ctrl-h v
快捷键来查看,通过Alt-x set-variable
命令来设置变量。可以设置肯定或 否定:nil
代表否定,non-nil
代表肯定,t
也可以代表肯定。例如,查看和设置auto-save-visited-file-name
这个变量的方法如下:
① 键入Ctrl-h v RET
② echo area
会出现:Describe variable:
③ 在冒号之后键入auto-save-visited-file-name
④ 在屏幕上会出现一个新的窗口,显示如下的内容:
auto-save-visited-file-name is a variable defined in C source code'. Its value is t Documentation: Non-nil says auto-save a buffer in the file it is visiting, when practical. Normally auto-save files are written under other names. You can customize this variable.
⑤ 输入Alt-x set-variable
,回显区会显示出Set variable:
,在冒号输入:auto-save-visited-file-name RET
,这时
候回显区会显示:”Set auto-save-visited-file-name globally to value:“
在冒号后输入nil 或者t来设置变量的值。
在Emacs
执行过程中所设置的变量的值,只对目前所执行的Emacs
有用,一旦离开当前的Emacs
,所有的设定都会恢复成原来的预设 值。需要将所有设定的变量的值存在名为“.Emacs”
的文档里,这个文档是Emacs
的配置文件,Emacs
启动时会读取里面的设置。它所 采用的语句都是遵循Elisp
语法的。
可以在.emacs
文件中加上这么一句,来使设置保存下来:(setq auto-save-visited-file-name t)
有关自动存储的设定还有下面的变量:
delete-auto-save-file:
设定文档被存回硬盘后,自动存储的暂存档会不会被删除;
auto-save-interval:
设定自动存储的字符数;
auto-save-timeout:
设定自动存储的间隔时间。
2.4 Emacs
基本术语目录
Emacs
中有两个重要的按键:Alt-x
和Ctrl-x
。 按键Alt-x
代表Alt-x
,即先按下Alt
键,在不释放Alt
键的情况下按下x
键, 如果键盘上没有Alt
键,也可以用Esc
键代替Alt
键。
按键Ctrl-x
代表Ctrl-x
,即先按下Ctrl
键,在不释放Ctrl
键的情况下按下x
键。
Ctrl x
代表按下Alt
键后释放掉,再按下x
键。
可见,按键序列中间的那个短线代表按键是不是连接上了。
Emacs
中的指令输入都是在先按下Alt-x
键之后再输入指令的,比如按下Alt-x
之后,在回显区(echo area)
会显示出Alt-x
, 此时你输入save-buffer
,然后按下回车键,回显区会显示:Wrote /home/...
(你的文件的保存地址)。
这就是保存文件的命 令(Command)
。它还会告诉你这条指令有一个快捷键(hotkey):Ctrl-x Ctrl-s
。可以看到,这个快捷键是Ctrl-x
开头的,事 实上一般的快捷键也是如此。并不是所有的命令都有快捷键,比如说set variable
这个命令就没有对应的快捷键。
2.5 Emacs
的自动完成(Completion)
功能目录
Emacs
具有对于用户输入自动完成的功能,这包括输入命令,文件名,缓冲区,Emacs
中的参数等。
自动完成功能主要有以 下三个键:?,SPC
(空格键),TAB
键。
?
(问号键,是通过SHIFT-/
来输入的)键会在一个新的窗口中显示当前所有的选项,SPC
键会 自动填充Emacs
能够确定的一个字(word
),TAB
键会自动填充Emacs能确定的剩下的输入,如果由于存在多种选择,Emacs
不能 确定该匹配哪种输入,那么Emacs
也会一个新的窗口中显示所有可能的输入。也就是说,Emacs只会自动完成它能确定的输入,对 于它不确定的输入,它不会自动完成。以M-x save-buffers-kill-emacs为例:如果你输入Alt-x save-b ,这时候按以下 空格键,Emacs会自动帮你把buffers这个单词写完,如果你指数入了Alt-x save- ,然后按下空格键,它就会显示出所有 以save打头的命令,因为Emacs不知道如何决策。如果你输入Alt-x save-b 然后按下TAB键,它也会把buffer这个单词自动 补齐,但是它会提示:complete but not uniqe。因为这时候前缀为save-buffer的命令有两个。如果你输入Alt-x save-buffers 然后按下TAB键,这时候,Emacs会自动完成save-buffers-kill-emacs这整条命令。如果此时你按下空格键,Emacs只会自动 完成kill这个单词。从这可以看到空格键和TAB键的区别。TAB键完成它所能确定的整条命令,而空格键之完成它所能确定的一个 单词。你输入Alt-x save 后按下?键,Emacs会在一个新的窗口中显示所有以save 开头的命令。
3 Emacs
操作
3.1 缓冲区的操作目录
Ctrl-x b buffername RET (switch-to-buffer) 来切换到指定的缓冲区,输入Ctrl-x b 后,echo area 会 显示"Switch to buffer (default info): ",默认的缓冲区是除了当前缓冲区之外的最近被访问的缓冲区。
Ctrl-x k buffername RET (kill-buffer) 删除指定的缓冲区,默认删除当前缓冲区。
Ctrl-x Ctrl-b (list-buffer) 将当前使用的缓冲区显示出来,如下所示:
CRM Buffer Size Mode File
.* Emacs 中文手册 6251 Fundamental ~/Emacs中文手册
% *info* 277699 Info (efaq)Top
% *Help* 8708 Help
* *scratch* 191 Lisp Interaction
% *GNU Emacs* 1078 Fundamental
…… …… …… ……
CRM那一列标记缓冲区的状态,可能的状态如下:
"*" 表示此缓冲区被修改过
"." 表示此缓冲区是当前选择的缓冲区
"%" 表示此缓冲区是只读的(read-only)
这些状态会随着当前的选择的缓冲区而组合在一起,比如".*",".%"。
在上面的Buffer那一列,显示的是缓冲区的名字,如果缓冲区的名字前后都有一个"*",表示此缓冲区不是从文档里读
取的,所以它对应的File那一列就是空的。
Alt-x buffer-menu 也会在当前的窗口中列举出当前所有打开的缓冲区,回显区会提示如下的命令:
“commands : d s x u;f o 1 2 m v ……”。对几个常用的说明如下:
d:对光标所在的缓冲区做上删除标记,即在缓冲区名称前加上一个"D",此时并未真正执行删除操作,而只是做一个标记;
s:对光标所在的缓冲区做上保存标记,即在缓冲区名称前加上一个"S",此时也并未真正执行保存操作,只是做一个标记;
x:对做了删除和保存标记的缓冲区执行相应的操作;
u:对相应的缓冲区取消所做的标记;
f:在当前窗口打开光标所在那个缓冲区,这个当前窗口就是显示缓冲区列表的窗口;
o:在新的窗口打开光标所在的那个缓冲区,如果此时有两个窗口,那么会在除了显示缓冲区列表的那个窗口的另外
一个窗口打开缓冲区,如果现在只有一个缓冲区,那么会新建一个窗口来显示缓冲区;
1:最大化显示光标所在的缓冲区,他会关闭所有其他的窗口;
2:在当前窗口中打开缓冲区,这和f 好像有相同的效果。有一点不同的是,如果光标在当前打开的缓冲区中按下2,
那么会最大化显示当前缓冲区,而按下f键,它就不会最大化显示当前缓冲区。
Alt-x buffer-menu 的效果和Ctrl-x Ctrl-b的效果是一样的,只不过Alt-x buffer-menu 会提示快捷键,
而Ctrl-x Ctrl-b不会提示快捷键。
3.2视窗的操作目录
视窗是显示缓冲区内容的地方,多个视窗可以显示同一个缓冲区的内容。Emacs中总有一个当前视窗(current window),
即光标所在的那个视窗。每一个视窗都有一个光标位置,这个光标位置会随时被记录下来,并不随着视窗或缓冲区的
改变而改变。当再次回到此视窗的时候,光标仍然会停留在离开前的位置。所以,移动光标的指令只对当前操作的视窗
产生影响,而对其他视窗不产生影响。有关视窗的操作如下:
Ctrl-x 0 (delete-window):关闭当前视窗,在当前只有一个缓冲区的视窗的时候,是无法将当前视窗关闭的;
Ctrl-x 1 (delete-other-windows):最大化当前视窗,也就是关闭了其它视窗;
Ctrl-x 2 (split-window-vertically):把当前视窗分割成上下两个视窗,这两个视窗将分享分割前的空间,
并且他们对应着同一个缓冲区,因而在内容上是同步的;
Ctrl-x 3 (split-window-horizontally):将当前视窗分割成左右两个视窗,这两个视窗也是显示同一个缓冲区的内容;
Ctrl-x ^ (enlarge-window):将当前视窗高度增加;
Ctrl-x { (shrink-window-horizontally):将当前视窗横向缩小一些,如果横向只有一个视窗,那么这个指令就不会起作用;
Ctrl-x } (enlarge-window-horizontally):将当前视窗横向扩大一些,同理,横向只有一个视窗,这个指令嗯也不起作用;
Ctrl-u Ctrl-x ^ 是将Ctrl-x ^指令重复执行四次,Ctrl-u n command 这个指令是通用的指令,它是将command指令重复执行n次;
Ctrl-u n Ctrl-x ^ 就是将Ctrl-x ^指令重复执行n次;
以上两个重复执行的指令对于Ctrl-x { 和Ctrl-x }这两个指令也是适用的。
Ctrl-l :这个指令是将当前光标所在行置于窗口中央,并且重新显示窗口;
Ctrl-v : 指令向下卷动屏幕;
Alt-v : 指令向上卷动屏幕;
Ctrl-p : 将光标移到上一行的相同位置,如果上一行的对应位置没有字符(空格也算是字符,只是不可见而已), 那么光标将位于上一行的最后一个字符后面;
Ctrl-n : 将光标移到下一行的相同位置,方式与Ctrl-p指令相同;
Alt-< : 将光标移到文档的开头;
Alt-> : 将光标移到文档的结尾;
Ctrl-x < : 将屏幕向左卷动,想一下,屏幕向左卷动,你将看到每一行的末尾;
Ctrl-x > : 将屏幕向右卷动,你将看到每一行的开头;
3.3文档的打开与保存目录
Ctrl-x Ctrl-f 组合键可以打开文档,按下这个组合键之后,Emacs会自动显示当前路径,如果你所要打开的
文档就在当前路径下,只要在minibuffer里输入文档的名称即可,如果你所要打开的文档不是minibuffer中显示
的路径,你可以输入一个"/“,然后再输入你想要打开的文件的完整路径,这个斜杠的意思是,它前面的路径无效,
后面输入的路径才是要打开的文档的路径,可以看到,minibuffer中显示的路径被括在一对大括号中了,表示无效。
实际上,输入代表当前用户的主目录的”~“符号,也可以将minibuffer中显示的路径括在一对大括号中。也可以
用Backspace键来删除部分字符来找到想要打开的文档的路径。
Emacs可以以FTP的方式编辑远程的文档,格式如下:/host:filename,它由一个斜杠,一个冒号,远方主 机名和文档的完整路径名四个部分组成,比如:/hsko@gate.sinica.edu.tw:~/work/text.tex。
如果在输入了Ctrl-x Ctrl-f之后不输入文档名,直接按下回车键,那么Emacs会在窗口中显示当前目录下的 所有文档,这时候你可以利用d,s,x,u,f,o,1,2等键来打开相应的文档,具体内容如前所述。
打开一个文档后,Emacs要做如下事:
① 产生一个新的缓冲区
② 将所要编辑的文档内容拷贝到缓冲区中
③ 新建一个视窗来显示缓冲区
所以,用户对文档所有的操作都是对缓冲区的操作,直到用户将缓冲区保存到磁盘中,磁盘中的文档才会改变。
Ctrl-x Ctrl-s组合键来保存当前的缓冲区。
Ctrl-x Ctrl-w 组合键可以让用户重新输入一个文件名来保存缓冲区,相当于Windows中的"另存为”。
Ctrl-x s 指令可以用来存储所有修改过的缓冲区,输入此指令时,回显区会显示(y,n,!,.,q…)提示信息,
它们的含义如下:
y: 同意对当前缓冲区存档,并且其他缓冲区是否存档还要询问;
n: 不同意对当前缓冲区存档,对其他缓冲区是否存档还要询问;
!: 对所有的缓冲区都存档;
.: 同意对当前缓冲区存档,并放弃其他缓冲区的存档,并且离开存档状态;
q: 离开存档的状态。
(离开存档状态并没有关闭缓冲区或者离开Emacs)
Ctrl-x Ctrl-c 在询问用户是否保存缓冲区之后,退出Emacs。
另外,Ctrl-x i 命令可以在当前文档中插入所指定的文档内容;Alt-x pwd 命令可以查看当前的工作目录。
3.4 在Emacs 中的输入和显示目录
Emacs中的输入也有两种模式:插入模式(insert mode),覆盖模式(overwrite mode)。通过指令
Alt-x overwrite-mode来在这两种模式之间切换。如果当前是覆盖模式,模式线(mode-line)上会显示出Ovwrt,
普通模式下显示的事Fundamental。
在Emacs中如果一行内容很长,用户没有用RET键来把一个很长的行截断,那么Emacs默认情况会用多行来显示这一行,
通过在行尾加上"\“或者”"来提示用户这一行很长,是分成多行来显示的,实际上它们共同组成一行,中间没有换行符。
也可以把一行显示不下的内容隐藏起来不显示,这是通过变量truncate-lines来设置的。truncate-lines为真的时候,
就会把视窗一行显示不下的内容隐藏起来,用户可以通过左右滚屏操作来看到隐藏的内容。
在Emacs 中可以通过RET键来插入一个换行符,此时光标会处于下一行的开始处。还有一个快捷键是Ctrl-j也可以
插入一个换行符,但是此时的光标会根据用户的之前的缩进方式处在一个带有缩进效果的位置,这比RET要方便很多。
通过Ctrl-q可以插入一些特殊的字符,比如:Ctrl-q Ctrl-l插入了一个分页符,分页符显示出来时是一深红色显示的^L。
3.5 Emacs中移动光标目录
Ctrl-f :向前(向右)移动一个字符(一个英文字母或者一个汉字);
Ctrl-b : 向后(向左)移动一个字符(同上);
Ctrl-n : 光标移动到下一行的对应位置,如果对应位置没有字符,那么光标留在下一行的最后一个字符的后面;
Ctrl-p : 光标移动到上一行的对应位置,规则同上;
Alt-f : 光标向右移动一个字(一个英文单词是一个字,连续出现的汉字算一个字);
Alt-b : 光标向左移动一个字,同上;
Ctrl-v : 向下卷动一个屏幕,上一个屏幕的最后两行会出现在新屏幕的头两行,以便于衔接;
Alt-v : 向上卷动一个屏幕,同上,两个屏幕之间会有两行的衔接内容;
以上指令都可以用 Ctrl-u n command 来实现多次执行,实际上,Ctrl-u 指令对于任何指令都可以实现多次执行;
Ctrl-x < : 视窗向左卷动;
Ctrl-x > : 视窗向右卷动;
Alt-> : 光标移动到缓冲区的最末端;
Alt-< : 光标移动到缓冲区的最前端;
在Emacs 中可以通过下面的两个命令移动到指定的行和列:
Alt-x goto-char RET n : 这个指令会将光标移动到从缓冲区开头的第一个字符算起的第n个字符,一个中文汉字算一个字符, 一个英文字母也算一个字符;
Alt-x goto-line RET n : 这个指令将光标移动到从缓冲区的第一行算起的第n行;
3.6 指令的数值参数目录
指令的树值参数在前面也多次提到过,它的格式如下:
① Ctrl-u n command/char 或者 Alt-n command/char;
② Ctrl-u m Ctrl-u n 或者 Alt-m Ctrl-u n;
第一种指令中的两条指令是等价的,用来将指令command重复执行n次,或者一次输入n个字符char。其中第二条指令就是 用Alt-n 代替了第一条指令的Ctrl-u n,因而更简洁一些。
第二种指令的两条指令也是等价的,原理如上。它是用来一次输入m个数字n,注意m在前,表示重复的次数;n在后,表示 所要输入的数字。这个指令只能实现一位数即0~9的重复输入,不能重复输入两位数。
3.7 获取行列信息目录
Alt-x what-page :获取当前光标所在的页数和行数,比如:page 1,line 165;
Ctrl-x l(count-lines-page): 获取当前光标所在页的总行数和光标所处位置前后的行数,
如:Page has 167 lines (166 + 2),括号外面的167表示总行数,括号中的166和2分别表示光标前和后的行数,它重
复计算了光标所在的那一行,所以和比总行数多1,如果光标在一行的开头,那么光标前后的行数之和就等于总行数,
光标在某一行的结尾时,光标前后的行数和还是比总行数大1。
Alt-x what-line: 获取当前光标所在的行数,比如 line 167;
Ctrl-x = : 获取光标当前所在位置的字符的信息,比如说,把光标停在汉字"信"上,按下Ctrl-x = 组合键回显区显示如下:
Char: 信 (43077, #o124105, #xa845, file …) point=11598 of 11648 (100%) column=39
如果把光标停在缓冲区的末尾,它会如下显示:
point=11601 of 11609 (EOB) column=3
Alt-x = : 获取选定区域的信息,要想设定区域,用Ctrl-@ 组合键来设置区域的起始点,终点为光标的当前位置,
显示的信息可能类似于下面的内容:
Region has 9 lines, 592 characters
Alt-x line-number-mode 能够使行数信息始终显示在中间的信息栏上,可以在".emacs"文件中
通过(setq line-number-mode t)来设置这个变量为真。
3.8 文件的删减目录
Emacs中文件的删减分成两种类型,一种被称作事killing,另一种被称作事deletion。killing是将内容
从缓冲区中移到一个叫做kill-ring的变量中,你可以通过指令Ctrl-h v kill-ring 来查看这个变量的值,
它的值是下面这种结构:
(“内容1” “内容2” “内容3” “……” ……)
Emacs可以打开多个缓冲区,却只有一个kill-ring变量,这就是说,缓冲区之间是共享这个变量的,
Emacs所设计这个共享的变量的目的,一是可以恢复所删除的内容,另外一个目的是实现各个缓冲区内容的互通,
只要把甲缓冲区的内容放到kill-ring中,乙缓冲区就可以把到共享的kill-ring中把内容取出,如此一来,
各个缓冲区之间就可以共享资源了。
deletion类型的删除,并不把内容放进kill-ring中,而是将删除的内容遗弃,此时可以通过Ctrl-x u指令
来找回。键入一次Ctrl-x u 可以恢复到前一个指令的状态,再键入一次就可以恢复到前两个指令的状态,如此
周而复始,就可以恢复到更改前的全貌了。属于deletion的指令有:删除字符,空白字符,空白列等。下面详细说明:
deletion类型的删除指令(删除字符,空格):
Ctrl-d : 删除光标所在位置的字符;
Alt-\ : 删除光标所在位置之前的所有相连的空白符,如果光标所在位置上就是一个空白符,它会删除与
此空白符相连的所有空白符。例如 “a b”,如果光标在"b"处,按下Alt-\,字符串变成"ab",如果光标
在"a"“b"之间,那么按下Alt-\,字符串也变成"ab”;
Alt-SPC : 删除空白符,只保留一个,作为字符间的分割符。
killing类型的删除指令(删除单词,句子,段落):
Ctrl-w : 删除区块的内容;
Alt-d : 删除一个字(一个英文单词算是一个单词,连续的汉字也算一个字);
Ctrl-k : 删除此行的剩余内容,不包括换行符,如果当前光标就在一行的最后一个字符上,那么将 删除换行符,也就是上下两行就连成一行了;
Ctrl-x Ctrl-o : 这个组合键的作用是删除连续的空白行,如果有多个空白行,则只保留一行;如果
只有一个空白行,那么删除此空白行。可见这个功能也可以有Ctrl-k来完成,但对于多个空白行,这个快捷键更方便;
如何从kill-ring中恢复内容呢? 先按下Ctrl-y 这个快捷键(就是粘贴键),然后不断的按下Alt-y 来
选择所要恢复的内容即可。kill-ring中的内容仿佛在一个循环链表中,Alt-y键的作用就是调整指向链表结
点的指针的位置,每按一次Alt-y键,指针就指向下一个结点,最后一个结点的下一个结点是链表的第一个结点。
还有一点要说明的事,kill-ring中的内容安排是将最近产生的killing内容放在最前面,也就是我们遍历的第一个结点