学习Emacs

2.3基本的键盘命令
在这一部分我们会来讨论Emacs中的基本的键盘命令.像任何强大的文本编辑器一样,我们可以用Emacs来做的事也只是一些简单的键盘操作.
如果我们是一个vi的使用者,我们就会十分的熟悉vi中常用的k,j,h,l的移动命令,这几个命令可以实现上移一行,下移一行,向前一个字符和向后一个字符.也许在我们习惯vi中各种各样的组合的按键之前我们要花费几个小时或是几周的练习.
Emacs也并没有什么不同.在这里有许多不同的按键和命令要学习.但是就像是vi一样,我们只要掌握一些基本的命令就可以完成许多的工作.然后,随着时间的推移,我们就会逐渐扩展我们的知识,也就会出现更快的方法来完成类似这样的事情.
命令键(Meta,Esc,Control,Alt)
正如我们将会看到的,在Emacs中使用了大量的组合键命令.因为Emacs并不是像vi一样是一个模式编辑器,我们在移动光标或是执行命令之前并不要求考虑我们是在命令模式还是在编辑模式.相反,我们只要按下正确的组合按键,Emacs就会按照我们希望那样的来完成我们的工作.
在文档中Emacs最常用到的命令是C(Control或是Ctrl)和M(Meta)来简记的.在大多数现在的PC机上有一个或是更多个的Ctrl但是却少用标为Meta的键.在这样的情况下我们可以用Esc或是Alt来代替Meta键.在大多数标准的配置中,Esc和Alt事实上在做着同样的事情.
所以如果我们在任何的Emacs相关的文档中看到引用C-x f那就意味着按下Ctrl-x然后按下f.如果我们看到类似于M-x shell的引用则是意味着按下Alt-x然后输入shell.
对于初学者来说一个比较有用的命令就是M-x apropos或者是C-h a.apropos将在Emacs的在线文档中查找所有的功能以及我们所输入的所有的常规表达式.这是一个查找与窗体相关的命令的一个很好的方法.我们可以只是简单的输入C-h a然后frame.
在缓冲区中移动
现在我们已经知道一些简记的含义,下面列出的是我们在缓冲区中移动时常用到的命令:
C-p    向上一行
C-n    向下一行
C-f    向前一个字符
C-b    向后一个字符
C-a    移到一行的开头
C-e    移到一行的结尾
C-v    向下一页
M-v    向上一页
M-f    向前一个单词
M-b    向后一个单词
M-<    移到缓冲区的开头
M->    移到缓冲区的结尾
C-g    退出当前的操作
而且正如我们所期望的,小方向键也是可以正常工作的.但是也许我们的Backspace就不会正常的工作了.这是另外的一个故事:-(
实际的命令:
好了,现在我们已经知道了如何在一个缓冲区中进行光标的移动,那么又如何打开和保存文件呢?如何进行查询.下面是一些基本的命令.
在我们直接跳到这些命令之前我们要明白这些命令是如何进行工作的.
在Emacs中所有的键盘命令,例如M-x something或者是C-x something,实际上是Emacs中部分功能的缩写.而实际上我们也可以通过M-x function-name然后输入回车来完成同样的功能.如果这个功能与键盘进行了绑定我们还可以通过键盘的快捷键来进行调用.
例如在Emacs中保存缓冲区中的内容到磁盘的功能被叫作save-buffer.在默认的情况下这个功能与C-x C-s进行了绑定.所以我们可以使用快捷键来保存当前缓冲区中的内容,我们还可以通过M-x save-buffer来达同样的效果.
在默认的情况下大多数的常用的功能都与键盘进行.如下面的一个列表:
C-x C-s(save-buffer)    保存当前缓冲区内容到磁盘
C-x u(undo)        撤销上一次操作
C-x C-f(find-file)    从磁盘中打开文件
C-s(isearch-forward)    向前搜索一个字符串
C-r(isearch-backward)    向后搜索一个字符串
replace-string        查找并替换一个字符串
replace-regexp        使用常规表达式进行查找并替换
C-h t(help-with-tutorial)使用交互式手册帮助
C-h f(describe-function)显示一个功能的帮助信息
C-h v(describe-variable)显示一个变量的帮助信息
C-h x(describe-key)    显示一个按键功能的帮助信息
C-h a(apropos)        查找字符和常规表达式的帮助信息
C-h F(view-emacs-FAQ)    显示Emacs FAQ
C-h i(info)        阅读Emacs文档
C-x r m(bookmark-set)    设置一个书签,在查找时很有用.
C-x r b(bookmark-jump)    跳到一个书签处
当我们进行尝试这些功能时我们就会发现许多功能都会提示我们输入.这通常在是在mini-buffer中完成的.这与我们在vi中使用:commands的命令形式或是在Unix Shell中输入命令相类似.
Emacs有几百种基本的功能.上面所列出的只是很小的一部分来代表我们常用到的一些命令.我们可以从在线的帮助文档得到详细的功能描述.
Tab完成功能
就像是大多数流行的Unix Shell一样,Emacs可以使用Tab键来提供命令的完成功能.而事实上bash中的自动完成模仿Emacs而完成的,所以如果我们熟悉bash的这个特征,在Emacs中我们就会有在家的感觉咯~~
例如,我们输入M-x search然后按下Tab,Emacs就会添加一个连字符来表示有一些匹配的完成选项,但是他们与下一个字符之间都有一个连字符.再一次按下Tab,Emacs就会显示一个可以匹配的完成列表供我们从中进行选择.这时我们就会注意到Emcas会在一个新的窗口中完成这样的工作.他只是临时的将我们的窗口分裂为两个:一个包含有我们正在编辑的缓冲区,而另一个包含有完成匹配的列表.这时我们可以按下C-g来退出选择过重并关闭这个新窗口.
2.4指南,帮助和信息
Emacs随机带有一个在线的学习指南,通过这外指南我们可以了解学习Emacs时应要了解的基本编辑特征和功能.他也同时解释了如何来使用Emacs中其他的编辑功能.
如果我们要决定下努力来学习Emacs,那么强烈建议要花一些时间来读一下Emacs的学习指南.正如我们在上面的表中所列出的,我们可以通过C-h t进入Emacs的学习指南.这个学习指南是一个自学的指南而目标则是那些准备开始学习Emacs的人.
如果我们是在X环境下运行Emacs的,我们就会看到在菜单栏最右面的则标为帮助.如果我们浏览一下帮助菜单我们就会许多的内容都有键盘缩写并且列在菜单的右方.
最后我们可以查看Emacs的文档.我们可以输入M-x info或是C-h i,这样就会进行Emacs的文档浏览器Info.
3Emacs模式
Emacs的模式有着不同的行为和特征,我们可以选择将这些行为和特征打开或是关闭(当然或是自定义),这样我们就可以在不同的环境下来使用.所谓的模式就是可以使一个文本编辑器(Emacs)可以书写文档,可以用不同的语言(C,C++,Perl,Python,Java或是更多的语言)来编写程序,创建主页,发送E-Mail,阅读新闻组新闻,记录我们的日程,甚至可以玩游戏.
Emacs的模式只是简单的Lisp库,这些库可以进行扩展和修改.
3.1主要模式和次要模式
在Emacs中有两个基本的模式类型:主要模式(Major)和次要模式(Minor).他们的区别在我们将他们打开或是关闭来工作一段时间之前并不是一件容易的事情.但是在这里我们也要简单的介绍一下.
只有一个主要模式可以在任何时刻激活.许多的次要模式可以在任何时刻激活.主要模式的目标是某一种语言或是特殊的任务,而次要模式则要小得多并且也不是特定的实用程序而是可以完成许多的任务.听起来似乎有一些抽象,下面我们来举一个例子.当我们在编写纯文本文件时我们会常用到一个名为text-mode的模式.这个模式被设计成为用来书写类似于README文件的自由格式文档.这个模式可以知道如何来标记单词和段落以及可以确保当我们按下常规的按键时像我们所期待的一样来进行处理.
当我们要书写人们消费的文档时,我们总是希望这个文件看上去可以好看一些.他应该在合适的地方进行文本的换行.要允许文本换行我们可以打开auto-fill次要模式.这种模式会在我们输入很长的句子并且到了一行的结尾时会试着做出正确的处理.这是一个次要模式也就意味着他可以与几种不同的主要模式进行协作.但是刚才我们所提到的当到达一行的结尾时所做出的正确的处理在text-mode和在java-mode下是不同的.我们并不希望我们的java代码会像英文文本一样进行换行.但是我们却在我们的java代码中的注释块会进行换行.auto-fill模式可以来处理这一切.
各种不同的Emacs模式的作者已经做了大量的工作来保证事情以次要模式的方式来进行工作.
如果我们看一下Emacs的屏幕素描,我们就会发现模式行已经标示出了Emacs所在的模式.在当时的情况下他是处在默认的Lisp交互模式下.只有我们要书写Lisp代码时我们才会体会到他的用处.(但是因为Emacs的大部分是用Lisp写成的,那么为什么不呢?)
3.2程序模式
首先也是最重要的,Emacs是由程序员为程序员而设计的.对于我们可以想到的所有的流行的程序语言都可以得到高质量的模式(甚至是一些并不流行的程序语言也是这样).在这里我们只是简单的介绍其中的一些.
大多数的程序模式有着共同的特征.通常情况下他会达到下面的一些或是所有:
为程序语言提供语法加亮
为程序语言提供自动缩进和代码格式化
提供内容帮助
自动与调试工具交互
在菜单栏加入特殊的菜单
另外还有一些并不是语言所特有的模式可以帮助我们完成许多程序语言中所共同的编程任务.例如版本控制界面,在我们的代码中自动加入注释,创建Makefile文件,更新日志等.
当我们将所有这些模式放在一起来考虑Emacs代码的成熟度和稳定性时,与市场上一些商业化的集成开发环境(IDE)相比,例如C++或是Java的开发工具,也是相当优秀的.而且Emacs是可以自由得到的.
因为C,C++和Java的语法是相类似的,所以在Emacs中有一个模式可以同时处理这三种语言(同时也可以处理Object-C和IDL).这是一个非常成熟和完整的包而且包含在Emacs的发行版本之中.这个模式被叫作cc-mode或是CC模式.
为了得到更详细的信息或是下载新的版本,我们可以访问下面的网站:
http://www.python.org/emacs
Perl
在Emacs中可以有两种模式来编辑Perl代码.第一种被叫作perl-mode(正如我们所
期望的)而第二种被称之为cperl-mode.我们并不是十分的清楚为什么会有两种模
式,但是可以看出perl-mode是在Emacs中编辑Perl代码的原始模式.似乎比起
cperl-mode有着更少的特征而且也不可以识别一些Perl的语言构思.
Python
Python(另一个比较流行的脚本语言)也有一个可以获得的Emacs模式.似乎是到目录为止,他并不是随GNU Emacs发行而随XEmacs发行的.然而在这两种模式下他都可以很好的来进行工作.
其他
还有许多其他的编辑模式来帮助程序员.这些模式可以完成下面的一些事情:
Shell脚本(Bash,sh,ksh,csh...)
Awk,Sed,Tcl,...
Makefile
更新日志
文档
调试
3.3编写
有趣的Emacs模式不仅限于我们上面列出的用来书写代码的一些模式.书写文档的人们也可以从Emacs的模式中获益.
拼写检查(ispell 模式)
许多文档类型的作者要不时的进行拼写检查.如果我们已经安装了GNU ispell,我们就可以输入M-x ispell来对当前缓冲区进行拼写检查.如果他检查到了他所不认识的单词,他就会提示我们并会列出一个可以用来替换的列表来供我们进行选择.他的功能就相当于非常流行的非自由软件包的拼写检查.
HTML(html-helper 模式)
如查我们发现我们要不时的写一些HTML文件,我们可以试一下html-helper-mode.正如他的名字所展示的,这种模式可以为手工编写HTML代码的人提供许多的帮助.
TeX(tex-mode)
如果我们要用TeX来编写文档,要Emacs加入颜色并高亮显示反斜线(/),花括号以及其他的一些字符是相当有帮助的.tex-mode可以小心为我们处理这些事情.
SGML(sgml-mode)sgml-mode提供了SGML文档的基本内容:确认,高亮显示,前向标记,后向标记以及更多的内容.他是Emacs的标准部分.
3.4其他模式
当然还有许多其他的可以使得生活简单的模式.下面是一些流行模式的例子:
版本控制(vc模式)
vc模式与大多数流行版本控制(RCS,SCCS,CVS)可以简单的完成文件的储入与读取,管理发行版本等.他是Emacs的标准的部分并且在Emacs的文档中进行了说明.
Shell模式
为什么要切换到另一个X 窗口或是虚拟控制端仅为了执行几个Shell命令呢?在Emacs中来完成这样的工作并且省去我们的麻烦:-)
M-x shell将会在Emacs的缓冲区中装入一个shell.我们可以在这个缓冲区中完成大多数的我们在shell提示符下完成的工作,因为Emacs在屏幕下是与我们真正的Shell进行交互.这也是Emacs中的标准部分,我们也可以在Emacs的文档中查看到相关的内容.
Telnet和FTP
为什么要切换到另一个X窗口或是虚拟终端来运行telnet或是ftp呢?在Emacs中来完成这样的工作并会省去我们的麻烦.
就像是在Emacs中运行Shell一样,我们也可以运行telnet和ftp.输入M-x telnet或是M-x ftp来亲自的进行试验.
Man
为什么要切换到另一个X窗口或是虚拟终端仅是为了读一个手册页呢?我们可以在Emacs中完成这样的工作并省去我们的麻烦.
就像在Emacs中运行Shell一样,我们可以读一个手册页.我们可以输入M-x man来亲自的试验一下.
Ange-FTP
引用ange-ftp文档中的一段话:
这个软件包试着在GNU Emacs中尽量简单和透明的使用FTP来访问文件和目录.处理普通文件的子集扩展到与FTP进行交互.
这就意味着我们可以处理我们本地机子上的文件一样来处理远程机子上的文件.所以如果我们需要编辑一个不同机子上的文件,只是告诉Emacs来打开他(使用一个稍微不同的路径语法),Emacs会很好的处理登陆信息并取回信息.然后当我们用C-x C-s来保存文件时,ange-ftp会将这样的保存写回远程主机.
这个稍微不同的路径语法如下面的形式.一个名为myfile的文件,在user目录下,在一个名为my.host.org的主机上,这样我们就可以打开(C-x f)文件:
/user@my.host.org:~user/myfile
这也是Emacs发行版本的标准部分,我们可以在Emacs文档中查找到相应的内容.
4自定义Emacs
实际上Emacs的自定义功能是通过Lisp模式完成的.我们可以修改Emacs操作方式的变量或是在Emacs中加入新的功能(或者是覆盖已存在的功能,用我们自已的功能来进行替换)
4.1临时自定义
当我们要试验Emacs的自定义时,我们也许以临时的方式来运行.如果我们遇到了临时的麻烦,我们可以通过C-x C-c来退出Emacs并且再一次来运行他.如果我们希望永久来使用这样的更改,我们可以将这样的设置加入我们自已的.emacs议论扣,这样在我们启动Emacs时这样的更改就会起作用.我们会在下一部分来这样的内容.
变量赋值
最简单的方法是通过改变Emacs中的变理来实现的.我们可以通过类似于下面的代码来实现这样的改变:
(setq variable-name new-value)
在这里variable-name是我们要改变的变量名而new-value是我们要赋于变量的值.(用Lisp中的说法就是将变量与值进行了绑定).在Lisp中setq的功能与其他编程语言中的赋值运算符(=)相类似.
下面我们来看一下.emacs文件中的格式:
(setq-default tansient-mark-mode t)
tansient-mark-mode变量可以控制当我们标记一个区域时是否高亮显示.在许多GUI程序中,如果我们拉动鼠标选中一段文本区域他变会以反白或是其他的颜色来显示.如果我们设置了transient-mark-mode变量,Emacs也可以完成这样的功能.
一个什么样的值?
大多数的程序语言有真值或是假值.在C/C++中一个非零值被认为是真值.在Perl中,一个非空或是非零值为真.在Lisp中,也有着同样的内容,但是名字和符号都是不同的.
真会写成t而假则会写成nil.然而也像其他语言一样,任何非真值会被认为真.
要得到transient-mark-mode作用的完整描述,我们可以使用在线帮助.我们可以输入C-h v或是M-x describe-variable然后输入transient-mark-mode.如果我们要偷懒,我们可以使用Tab的自动完成功能.我们只是输入变量的一部分然后按下Tab键.
另一个人们常用要设置的变量则是fill-column.他告诉Emacs进行换行时的屏幕宽度(而auto-fill-mode要使用这个值).要设置这个值,我们输入:
(setq fill-column 20)
但是这样的设置并不会真正的起作用.我们需要告诉Emacs为我们输入的表达式赋值.要这样做,将光标放在表达式的结尾然后输入C-x C-e,这样就会调用eval-last-sexp功能.当我们做这样的工作的时候,我们就会注意到20(或是我们输入的其他值)就会在屏幕的下部的mini-buffer中回显给我们.这就是我们赋值表达式的返回值.
如果我们要看一下我们的设置是否可以正常的工作,我们可以输入一或两个句子.如果我们打开了auto-fill-mode,我们就会注意到Emacs会在20列的地方进行换行.如果不是这样,我们在输入一些文字以后,输入M-q就可以调用fill-paragraph功能.这样就会实现文本的换行.
文件关联
我们可以配置我们的Emacs在我们打开某一类型的文件时会自动完成一些事情(就像一些GUI程序,当我们打开某一类型文件的图标时就会自动进入某一个程序)例如,也许我们会希望当我们每一次打开一个以.txt为扩展名的文件时Emacs会自动切换到text-mode.所以下面我们叫Emacs当我们打开一个名为README文件时自动进入text-mode
(setq auto-mode-alist (cons '("README" . text-mode) auto-mode-alist))
如果我们没有写过太多的Lisp程序,我们也不需要知道更为详细的内容.在这里变量auto-mode-alist包含一个匹配列表.每一个表达式包含一个常规表达式和Emacs的模式名字.如果我们打开的文件与这个常规表达式相匹配(在这里为字符串README),Emacs就会启动我们指定的模式.
上面的趣味语法是因为实际上我们在模式列表中加入另一个匹配对.我们并不希望为auto-mode-alist的值赋一个我们并不确定是否已经丢失的值.
如果我们希望在每一次打开一个以.html或是.htm结尾的文件时Emacs可以自动切换到html-helper-mode时,我们可以在我们的.emacs文件中加入下面的话:
(setq auto-mode-alist (cons '("//.html$" . html-helper-mode) auto-mdoe-alist))
(setq auto-mode-alist (cons '("//.htm$" . html-helper-mode) auto-mode-alist))
4.2使用.emacs文件
在我们使用了Emacs一段时间并且对我们所使用的自定义有了一定的了解以后我们也许就会希望永久的自定义一些事情(或者是至少是在我们改变了主意以前是这样).如果我们发现我们在使用Emacs来处理我们日常的工作,我们就会注意到随着时间的推移我们的.emacs文件在变大.这是一件好事,因为这就是说明我们可以配置我们的Emacs按照我们所希望的方式来进行工作.但是却有许多的软件产品不允许我们来这样做.
也许现在我们还并没有意识到在我们每次起动Emacs的时候,他会在我们的主目录下搜索.emacs文件.在这个文件中我们可以放置任何我们希望可以自动运行的Lisp代码以及一些我们在这里讨论到的自定义功能.
另一个Emacs的.emacs的例子如下:
(setq inhibit-startup-message t)
inhibit-startup-message变量可以控制在每次起动Emacs的时候是否显示欢迎信息.但是也许过了一段时间以后我们厌倦了这样的信息,所以我们可以选择将他关掉.
作为一个练习,我们可以试着创建一个.emacs文件然后加入这一行.退出然后重启Emacs我们就会看到改变后的效果.
然然是当我们当我们阅读一个Emacs的模式(或是软件包时),这个文档会建议我们在.emacs中加入一些代码,这样就可以使得模式或是软件包可以以某一方式正确的运行.
GNU Emacs FAQ(C-h F)包含一些与.emacs相关的内容,我们可以从中得到帮助.
4.3自定义包
随着Emacs变得流行并且不断的发展,有一些人就提出:"应该有一个更好的办法来使得Emacs初学者可以自定义他们的Emacs".这样就诞生了customize.
Customize提供了一些直观的方法来自定义Emacs的部分.如果我们想要试一下,我们可以访问我们的Help菜单中的Customize子菜单,或是输入M-x customize.
Customize可以组织本地组,如"Editing","Programming","Files"等的自定义.一些组还包含子组.
如果我们使用了自定义的界面做了一些改动,Emacs会将这些改动保存到我们的.emacs文件中,而我们也可以手工来修改Emacs为我们所做出的修改.
4.4 X窗体显示
像任何X程序一样,Emacs也要使用X资源.这就意味着我们可以控制初始颜色,启动位置以及其他的一些X配置,就如同我们平常对xterm,nxterm所做的一样.
如下面的一个~/.Xdefaults文件:
emacs*Background: DarkSlateGray
emacs*Foreground: Wheat
emacs*pointerColor: Orchid
emacs*cursorColor: Orchid
emacs*bitmapIcon: on
emacs*font: fixed
emacs.geometry: 80x25
我们可以查看X手册页得到更为详细的信息.
在Debian中,~/.Xdefaults似乎并不使用.然而使用Debian的人们可以将我们的设置放在/etc/X11/Xresources/emacs,这样我们就可以得到像在RedHat中同样出色的颜色.
5流行的包
在Emacs中可以得到各种不同的模式,也有许多不同的附加的软件包.在这里我们称之为包是因为他们要比模式的内容丰富得多.他们通常包含一些其他的实用程序或者说他们是如此之大以致于称之为模式是没有正确的做出判断.在其他的一些情况下,他们是扩展或是集成了其他的Emacs的模式和包的软件.但是这样的区别并不是很明显.
5.1VM(Mail)
引用VM FAQ中的一段话:
VM(View Mail)是Emacs的一个子系统,可以允许我们在Emacs中阅读和处理电子邮件.用来处理普通事的命令期望一个邮件用户代理,例如产生回复,向磁盘保存信息,删除信息等待.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值