`
sunting_bcwl
  • 浏览: 93636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Effective Emacs 转

阅读更多
[转]EFFECTIVE EMACS(中文)
Posted on 2011-11-04 19:57 labyrinth 阅读(269) 评论(0) 编辑 收藏 
【从veryfai和DelphiNew的blog上得来】
10个提升你的Emacs生产力的条款, 原文在此:
http://steve.yegge.googlepages.com/effective-emacs
__BEGIN__
------------------------------------------------------------------------------

引言
Emacs是世界上最好的文本编辑器(之一)。不仅是编程,精通Emacs,也会让您更有效地写作和编辑电子邮件,起草文稿,写博客, 编辑HTML、XML文件等。
文中所列条款并非都是对Emacs的定制,其中有些是调整你的桌面环境以更好地跟Emacs无缝结合工作。
理解Emacs的关键是要明白她的所有设计都是出于效率考虑的,其中包括“动作的效益”。高素养的音乐家深知“动作的效益”是成为世界级演奏家的关键,任何多余的动作都是浪费精力而且会产生不良效果。
使用鼠标可以说是最违反*动作效益的行为,因为你不得不将手抬离键盘…摸索鼠标…点击定位…这大大影响了动作的连贯性和速度。
与Emacs好手相比,图形化IDE用户就相当于业余的音乐家,带着些许郁闷笨拙地把玩着自己的乐器。一般IDE都有又炫又酷的对话框,让新手有一些操控的快感,但却很难与之交互(见条款 6)。真正的程序员需要的是能给他们更多操控的权力。
精通Emacs必须经过一个长期的过程。这个过程包括学习Lisp、定制Emacs使她更符合你的设想,通过这个过程,你会更渴望有更多定制、更多的自动化,所以,哪怕你已经精通了Emacs,你对她的定制和扩展也不会停息的。
条款 1:把Caps-Lock和Control键互换!
在Windows和Mac键盘上,那个Ctrl键居然被远远地放在左下角,而Ctrl对于Emacs的使用却是如此的重要,如果你不把 Ctrl 放到一个更舒服的位置,你就很难成为一位Emacs艺术大师。这位置应该与你的基本手位在同一线上,那么,Caps Lock是最佳选择。其实在大部分的Unix工作站键盘上,这个位置放的就是Ctrl键,原因同上。
要在Windows 2000或者XP中实现这个互换,需要修改注册表。从开始菜单中选择“运行”,输入regedit并回车。在左边的树状视图中,找到:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlKeyboard Layout

点击 KeyboardLayout 项,使之获得焦点。再从“编辑”菜单中选择新建一个二进制值,命名为 “Scancode Map”,它的类型应该显示为 REG_BINARY。
然后选择这个新建的”Scancode Map”值项,在“编辑”菜单中选择修改二进制值,在编辑对话框中,输入以下数值:

0000: 00 00 00 00 00 00 00 00
0008: 03 00 00 00 3A 00 1D 00
0010: 1D 00 3A 00 00 00 00 00

选择 OK 关闭对话框,退出注册表编辑器。注销后重登入,你的caps和ctrl键应该就互换成功了。也可能需要重启一次。
在Linux的X-Windows中,可以使用xmodmap工具。在你的主目录新建一个名为.xmodmap的文件,如果已经存在则只需修改。向该文件加入以下内容:

!
! Swap Caps_Lock and Control_L
!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

保存,再向你的 ~/.bash_profile 文件加入一行:
xmodmap ~/.xmodmap
在Mac OS X(Panther和Jaguar)中,你需要安装一个修改过的键盘驱动,听起来有点吓人,但是很有效。
关于此驱动的讨论。如果你用的不是Mac笔记本,可以通过编辑一个XML文件来实现,参考这里。
其它系统参考这里。
条款 2:不用Alt来调用M-x
Alt-x是最常用的Emacs组合键之一,每次使用时你都得把左手蜷缩起来。任何一个你得重复上千次的动作都应该是流线型的,所以你希望可以通过Ctrl键来调用M-x。(前提是你已经完成条款 1)
要习惯于使用Ctrl键的另一个重要原因:Alt键并不可靠也并不是跨平台的标准键。比如,当你通过telnet或者ssh远程登录时,在一些系统 类型和终端设置下,Alt-x可能失效。与其为不同的系统设置而头痛,还不如直接弃用Alt键,代之以一个任何时候都有效的组合键。
我用的键序列是Ctrl-x Ctrl-m。注意,当你调用一个使用相同修饰键的2键序列时,你只需按住修饰键,再依次敲击其它两个键即可。所以现在调用M-x的方法是:按住Ctrl不放,敲x,然后敲m。
要启用Ctrl-x Ctrl-m序列,只需将以下内容加入你的.emacs文件中:

(global-set-key "C-xC-m" 'execute-extended-command)
(global-set-key "C-cC-m" 'execute-extended-command)

第二行设定Ctrl-c Ctrl-m也调用同一命令,以增加这个键序列的容错性。当不小心把Ctrl-x按成Ctrl-c时,仍然有效。这两组按键都没有默认的Emacs绑定,所以不用当心你的设置产生冲突。
你应该把这个按键序列练到习惯为止,到时你会自然地想弃用Alt-x了。(Alt键在其它命令中还是会用到的,后面会提及)
顺便说一句,如果你想把这招发挥到极致,那么在你按Ctrl-x时最好不要用你的无名指来敲x键。我习惯于用左手食指来敲,但你可能会觉得用中指会 更舒适。这是因为当你用小指去按那个变成Ctrl的Caps-Lock时,你的手并不处于键盘的基本位置。关键是要使用尽可能少的肢体伸展,其次是尽可能 少的手指动作。你应该多试验,直到找出让你自己觉得最舒服的方式。
条款 3: 使用 backward-kill-word 而不是 Backspace
Emacs高手一般都尽量避免使用Backspace键,因为它离基本键位太远了。输入错误的时候,如果你打字的速度很快(一分钟打50个词以上)的话,把整个词删掉重打比用Backspace费力地倒删到出错的地方再从一半打起更有效率。
加入以下内容到你的.emacs文件中:

(global-set-key "C-w" 'backward-kill-word)
(global-set-key "C-xC-k" 'kill-region)
(global-set-key "C-cC-k" 'kill-region)

请注意Ctrl-w已经默认绑定到kill-region了,这是个相当重要的命令,你得把kill-region重绑定到其它按键序列。我选用 Ctrl-x Ctrl-k(然后再加一个容错版的Ctrl-c Ctrl-k)。在我以前工作过的公司里,很多Emacs高手都是这样设定的。重绑定Ctrl-x Ctrl-k后你失去了edit-kbd-macro的快捷键,但是这个命令极其少用,所以你根本不会觉得少了什么。
这样做还有一个额外的好处:许多Unix命令行shell都提供类似Emacs的命令行编辑键,而Ctrl-W通常是backward-kill-word的默认绑定。如此,你的习惯和shell是一致的。
你打字越快,越能体现此招的价值。逐渐地,你会对如何最快地更改各种输入错误形成一种感觉。我的方式是这样的:
1.如果我在一个长单词中打错了一两个字符,而此时我的光标刚好就在错误的旁边,我就用backspace键。
2.如果错误字符在光标前面15到20个字符以上的距离,那我一般就使用Ctrl-w直接杀回去,然后重新输入。
3.如果错误字符在更远处,但仍在光标所在行,就用Alt-B跳回到错词,再Ctrl-b定位到词中出错的字符。
较远的错误,我会使用快速导航来回到出错位置:条款 4涉及一部分这个技术。
使用Ctrl-w绑定backward-kill-word的话,有件事情你可得小心了:Ctrl-w在很多Windows程序中是强行绑定到“关闭窗口”上的。
条款 4:使用递增式搜索来进行快速导航
高效地光标定位是成为Emacs高手的关键之一。IDE用户把他们太多的时间花在摸索鼠标上了,根本没想过用其它方法来实现光标导航,更没意识到自 己的方法是多么的低效。在一个高手的手里,Emacs能成为世界上最强大、最高效的文本编辑工具,在很大程度上是因为她可以让你不用鼠标完成几乎所有的事 情。
Emacs高手总是设法让他们的会话窗口尽可能高,最好是能垂直地填满整个屏幕,因为垂直的屏幕空间在你查看一个文档时可以说是最宝贵的空间了。当你在屏幕查看多行的文本时,使用递增式搜索往往比用其它方式来精确定位光标快得多。
养成使用Ctrl-r(isearch-backward)和ctrl-s(isearch-forward)来在文档中进行移动的习惯。当你要向前或者向后移动5行左右,而且你又看得到移动的目的地时,你应该使用递增式搜索(i-search)。
要想高效地做到这一点,你并不需要搜索光标目的地确切的单词。让你的目光掠过目标点的周围区域,选择一个看起来唯一性比较强而且比较好敲的单词,然 后递增地搜过去。如果你选的词唯一性差点,那可能要多按几次Crtl-r或者Ctrl-s。但是放心,Emacs会把已匹配的单词高亮显示,如果你看到匹 配的单词太多,那就按一下Ctrl-g,然后重找一个词来递增导航。
一旦你掌握它之后,再怎么强调这一招数的强大都不会过份。掌握它,你只需不断地重复直到你的手指“自动地”去以这种方式导航光标。这时,Emacs就好像你身体的延伸一样,你可以想都不用想就把这些精妙的按键敲出来。这类似于你开车久了,许多精妙的技术就像本能反应一样。
条款 5:使用临时Buffer
Emacs最强大的功能之一就是她可以迅捷地生成一个不与任何一个文件关联的buffer。一旦你习惯了使用这一技术,你就会明显地感觉到其它编辑器这一功能性的不足。
要想建一个临时buffer,直接切换过去就是了!Ctrl-x b调用命令switch-to-buffer,你立即拥有了一个草稿本,你可以在上面做笔记、存储临时结果、或者其它有助于解决你手头问题的事。
如果你打算维护多个临时buffer,你可以给它们起些好记的名字,比如:foo, bar, baz, buh…等等
如果你要同时参考多个buffer的内容,你可把Emacs屏幕水平或者垂直地分割开来。(见条款 6)
由于临时buffer并不与任何一个文件关联,删除它们就跟创建它们一样方便,直接Ctrl-k调用kill-buffer命令即可。
要保存临时buffer的内容也很方便,使用Ctrl-x Ctrl-w调用write-file命令。输入一个文件名,保存即可。
条款 6:精通有关buffer和window的命令
你会经常做一些需要打开多个窗口的编辑工作的。Emacs使用一套与其它应用程序有些许不同的术语。一个buffer是指一个包含文本的逻辑空间, 这个空间有可能会与一个文件或者进程关联;一个window是屏幕上显示着一个buffer(或者这个buffer的一部分)的可见区域;一个 frame(框架)才是操作系统术语里所谓的window(窗体):一个包含标题栏等要素的独立窗体。
下面是几个需要重点掌握的命令:
Ctrl-x 2: split-window-vertically — 把你的当前window切成上下两个等高并且显示同一buffer的window(在你改变其中一个让它显示其它buffer之前)
Ctrl-x 3: split-window-horizontally — 不常用,把当前window切成左右两个等宽window。
Ctrl-x +: balance-windows — 让所有可见的window近似等高。如果你刚用ctrl-x 2两次,那你就有两个1/4高的window和一个1/2高的,使用这个命令可以让这三个window等高。
Ctrl-x o: other-window –把光标移动到window列表的下一个window当中去,一般会把光标移到window下面一个window,或者回滚到最顶的window。
Ctrl-x 1: delete-other-window — 让光标所在的window填充整个frame;其它的window暂时隐藏。请注意buffer是由buffer-list维护的,所以无论什么时候运行这个命令都是安全的。
Ctrl-x Ctrl-b: list-buffers — 在“*Buffer List*”中显示所有已打开的buffer列表。
对话框:所有罪恶的根源
几个特别的设计决策促成了Emacs的无比强大。其中一个就是:Emacs没有对话框!实际上,这是Emacs在只能显示文本的终端中也能提供完备功能的一个必要条件。但却意外般成为促使Emacs异常强大的关键特性之一。
对话框很废!对新手,经常会有聚焦的问题,很多设计糟糕的程序甚至会因为对话框而无法刷新。对话框在你定制的视频模式下面从来就不会表现良好。比如 说,当通过双显卡设置双显示屏显示内容时,Windows中的应用程序对话框总是从你预料外的视窗上弹出来,这种愚笨无比的体验实在令人厌烦。
这种问题甚至在单一显示器的机器上也会出现。即使是像Microsoft Office套件这般设计精良的应用程序,模式对话框问题依然存在,而且有时会隐藏在一堆打开的窗口背后,使得整个程序失去响应,直到你找到那个无赖的对话框。
由于一些很奇怪的原因,对话框一般都是大小固定的。这与应用程序窗体正好相反:它们几乎都是可改变大小的,因此,程序设计师要煞费苦心来保证UI在 窗体大小改变时能很好地调整各要素的空间。但是对话框默认都是大小固定的,也许这是因为在大多数的操作系统中,窗口管理器在设计之初压根儿就没把对话框考 虑在内,只是在设计完成之后再草率加入的补丁功能(猜猜偶怎知道这个的^_^)。TMD,在Java Swing中,对话框也是一团糟。
提及对话框上的按钮也是令人来气。对话框在GUIs里至少都有25年历史了,但是至今没有一个统一的标准来规定对话框上该有些什么按钮以及按钮该如 何放置。有些对话框把按钮放在标题栏里、有些放在底下、有些放在右边。当你用标题栏中的窗体控件来关闭对话框时,很难100%保证它真的会按你想的那样去 做。
对话框的问题远不止于“聚焦”、“改变大小”、“定位”这么简单。对话框是无法具备主程序UI的功能的。比如你定义了键盘宏(在Emacs里–或任 何程序,如Excel或Word里),那它们在对话框中是无效的。如果对话框有滚动条,那你除了用滚动条之外再没其它办法可以导航了。
举个例子,请你打开IE,在”工具“菜单中选择”Internet选项“并切换到”高级“标签页。就在这儿了:你所有的全局自定义的IE选项都可怜巴巴地列在这儿。如果你想找某个特定的选项,那就乖乖地滚动来寻找吧。休想用”编辑/查找“,因为这是个对话框模式。
救星:Buffers
在Emacs中,所有的输出都写入buffer里,而所有的buffer都是Emacs的”一等公民“。你至爱的所有导航快捷键,包括增量搜索,在 所有buffer里都是可用的。在Emacs中没有所谓的”模式buffer“,所以你可以在任意buffer中选择和拷贝文本,在其它window上工 作并不会影响你拷贝的内容。这些buffers是不可见的;”对话框“输出会一直保留在buffer列表中,直到你删除它。
在其它的程序中你很难找到像Emacs buffer这样的体验。一旦你领会到这种模式是多么的强大和一致,任何其它程序都会令你有些许失望的,因为你会感觉出它们的UI是多么碍事。
当你精通了buffer和window,并对它们的操作自如的时候,你已步上Emacs大师之路了。
条款 7:丢弃UI
你不需要菜单栏。它只不过是给那些找不着北的新手用的拐杖而已。同样,你也不需要有大图标的工具栏和滚动条。这些东西都是给失败者提供的,而它们却占用了宝贵的屏幕空间。在.emacs中用下面的代码把它们全关了:
(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
(if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(if (fboundp 'menu-bar-mode) (menu-bar-mode -1))

关掉这些东西,你不会丢失什么功能的,在下一个条款中我们将谈及如何高效定位。

(2006/01/02加入的注解)最近看到一个人回复,此君因为条款7而对本文全篇不爽。显然,他就是那种非常习惯于使用鼠标啊菜单啊之类东东的人,因 此,觉得被称为“找不着北的新丁”很不爽。此君进一步阐述,说有无数的研究表明使用鼠标更加快捷。于是乎我也觉得自己应该把事情说清楚一点好:条款接下来 的部分是全新的,这多亏了这位不忿的读者的Blog。
首先要说的是,我也常常希望emacs能有一个更猛一点儿的显示引擎(译注:这方面Xemacs做得可以),可以有像其它桌面应用程序一样的GUI和图像 功能。然而未能如愿啊;我的博客文章"The Emacs Problem"(译注:自己google一下吧)对此有所阐述。当然,我也乐于看到emacs没加入这种功能。。诶,我说这些是想表明,我不是个没头没 脑的反GUI份子。

滚动条:是可有可无的
由于用键盘就能达到同样效果,一般我都把emacs的滚动条关掉。然后,滚动条也有个好处:它可以很形象地显示出你在文本中的编辑位置及文本的长度;在状 态区(译注:指mode line)的%-指示器不是那么好读取--无数研究都表明,确实如此。比如,这也是为什么美军在他们的反应堆中使用类似的比例量变尺。我们看数字时常出 错,而读比例尺时不会~
所以,如果你觉得滚动条让你很爽,那我也没意见。就只是想提醒你,它会促使你去摸鼠标,而某些操作(比如跳转到文本头部)用键盘会更快,对此没必要做什么用户调查的。如果做一些计时试验的话,哪怕一些很耍赖的人,也不得不承认用键盘来导航更快捷。
假定我们打算在一个很长的文本缓冲区的头部和尾部都插入包含80个连字符(-)的一行,而你现在又在文本缓冲区中间编辑。这个例子有些做作,但我还真是做 过一些需要包含全部文本内容的剪辑工作。用键盘的话,我三秒就可以完成,并且完全回到编辑状态。我要按的键盘序列是:"C-x t C-u 8 0 - RET C-x e C-u 8 0 -"
如果你用鼠标,没有什么简易的方法能让你在3秒内做到这些事情。你想啊,你得往返两次去摸鼠标,抓住滚动柄,他它拖到第一行,这时候光标还不一定在行首,他就是说,你还得小心地点到那个位置去。

当然,如果你勤加练习,可能5秒钟就得搞定,但何苦呢?如果经常要做这个,你应该写个宏啊。

鼠标用例(only 1):区域选择
有些操作明显用鼠标更快。在emacs之外与你的窗口系统交互,如果另一个程序没有类似emacs的键盘导航功能,用鼠标一般会更快捷。但是在emacs内部时,我能想到的鼠标比键盘方便的操作就是:区域选择,尤其是你打算选一个矩形文本时。
有时区域选择也是用键盘更好。比如,设定mark位置,然后用ctrl-n来选行,用ctrl-f一次多选一个字符。键盘的按键重复率是和硬件设定相关 的,有时会觉得很慢。我自己的显示设定在一屏中可以包含大约100行。如果从中间移到屏幕底部,大约要用5秒。如果用鼠标来回操作,需要4秒。所以在可见 区域选择时,用鼠标也不是很超值。
但是,如果我是想选比一屏还要多的文本,或者选区的开头和结尾都在行内位置时,用鼠标就又可靠双快捷了。我也乐于使用。
使用鼠标跟关掉UI不是一个事儿,只不过是相关的事情,所以就搁一块说罢了;我20年前就做过这样的计时试验了。我衷心地建议你把菜单关掉~

菜单:丢了它!
用菜单来探索,了解更多的emacs功能是不错的。不幸的是,它比较容易产生误导,让你认为emacs的功能就那么多了。其实,很多emacs扩展并没有 什么菜单支持――只有非常细心的扩展模块设计者才会花时间去添加菜单支持。所以如果你想只用菜单来了解emacs,你会错过很多很多功能的。
菜单的另一个问题,有点儿类似于之前我们提到的对话框:它没有很强的伸缩性能。如果你用菜单来给用户提供1500个选项,这个菜单的显示搞不好会把窗口整 死的;便如果用Emacs的buffer来做,小case啦,还有很诸如漂亮布局和分组显示等额外的好处。你用M-x list-colors-display或者M-x list-faces-display就知道我说的东东了。。
菜单还有一个(大)问题,它没有自动补全~当你查看到一个比较深的子菜单层级中,以不小心进错一个子树时,很容易觉得自己是迷路了。没有什么探索方法比较可搜索的帮助系统更加灵活了,在MS的程序中是这样,在emacs中也是。
最后,一旦你记住一个菜单功能了,每次你要使用时,你都得重新点击(搞不好还得进入子菜单)来调用。你调用次数越多,浪费的时间也就越多(相对于使用键盘来说)。
所以我觉得emacs菜单不好:不能展现emacs全部的功能;不能给出提示帮助你找到你想要的功能;选择一多时菜单又撑不住(所以相比于树视图之类的组件,它不算是一个很通用的UI机制。);当你知道怎么用时,用起来又很慢。

简单来说呢就是:关掉菜单!就像那些闪亮的按钮一样~诶~~任何重要到要提供一个快捷按钮的操作,都应当有个快捷键。
条款8:掌握最重要的帮助功能

要找出当前buffer中所以的按键功能,输入M-x describe-bindings。它显示一个包含按键及被绑定命令的列表。
你把光标移动到相应的命令上,按回车,emacs会显示那个命令的帮助。
想知道一个按键操作是干什么的,使用M-x describe-key,然后按入你感兴趣的按键序列。如果你输的序列是有绑定的,emacs会直接转到那个按键的帮助信息中。
如果你对某个功能感兴趣,想找出相应的命令,并且你已经心里有个大约的命令名,那么你可以用M-x apropos,然后再输入一个正则表达式(参见条款9)来搜索命令名。所以的emacs命令(也包括函数和属性表)都存在一个全局表中,以备M-x apropos检索。
比如:你想找一个功能,可以把一个buffer放到buffer列表的最末端,你就可以用M-x apropos-command,再输入“buffer”,就显示出所有200来个包含有buffer这词的命令。在这个列表里面靠前的有一个命 令,bury-buffer,它的文档写道:
bury-buffer         M-x bury-buffer RET Command: Put BUFFER at the end of the list of all buffers.(译注:帮助真的是英文,要养成看E文的习惯啊)
瞧!这不就是你要找的吗?用好(regexp)正则表达式的话,你很容易就可以限定搜索显示的范围。
要说最最重要的emacs帮助命令,当属M-x info,这命令会开启emacs内置的交互式,菜单驱动的Info引擎。你应该学学怎么用Info。它包含数千页的文档,而且是超文本链接的(很不巧, 是web出现之前的emacs自有链接风格),所以比man页要易读得多。一旦你掌握了Info系统的导航键,用起来铁定比用浏览器看HTML帮助要快, 即便是看本地文件也是如此。一方面,是因为emacs info有跨info文件搜索的功能,另一方面,就只归功于emacs有相比于浏览器更好的文本导航能力。
条款9:掌握Emacs的正则表达式
最好的办法,就是买本Friedl的书《Mastering Regular Expressions》。绝对值!任何一位程序员都该有一本,管你用什么语言什么编辑器。
emacs的正则表达式有些大伙儿都不太喜欢的特质,但这并不是不可克服的,一旦你学到手,你的编辑功力会精进的喔~
与正则表达式相关的命令中,最重要的是 isearch-forward-regexp和 isearch-backward-regexp。默认设定下,分别绑定于 ESC C-s和 ESC C-r,但这么按有点儿僵。任何要用到Escape键的操作都很僵,而且如果是在我的Compaq电脑上,Alt-Ctrl-s这个按法emacs无法截 获,因为它是弹出系统诊断对话框的热键。
由于使用频繁,我把自己的isearch-*-regexp命令绑定到 Alt-r 和 Alt-s上了。alt-s一般没有默认绑定,alt-r默认为我不怎么使用的move-to-window-line,因为我用条款4的方法在编辑窗口移动。
有些mode坚决要重绑定alt-r和alt0s,这很烦人――害我要使用per-mode的招数来重绑定。但我没办法把所以的mode都招呼到。如果有哪个哥们儿知道怎么防止这两个键被任何mode重绑定,麻烦你教我一下,我会非常感激的。
另外两个也很重要的正则表达式命令是 replace-regexp 和 query-replace-regexp。它俩功能差不多,提示你输入一个正则表达式和替换字符串,只是 query-replace-regexp 要求你在每一个可能的替换发生时输入y或者n。
我跟 query-replace-regexp 关系很铁,以至于还得给它起个外号(别名~):
(defalias 'qrr 'query-replace-regexp)
这样一来,我就用 M-x qrr 就可以使用这个功能了。
其它有用的命令还有 M-x list-matching-lines -- 可以把buffer中匹配某一regexp的行全列出来; M-x apropos -- 就是那个把所以匹配的命令都列出来的帮助命令
emacs正则表达式最常被问到的是:“怎么在正则表达式或者替换字符串读取时输入回车呢?” 如果仅仅简单地直接打回车,那emacs会认为你把regexp输完了。(这也是推荐qrr而不是 replace-regexp的原因啊――――在你非常有信心一次试写就可以把正则表达式写对之前,至少,我还没到那个境界)。
回答是:要输入一个 ^j (译注:也就是Ctrl-j) 字符。在你要输入表达式或者替换串的时候,如果你要输回车符,选按Ctrl-q然后再按Ctrl-j。Ctrl-q是emacs的"quote"命令,它 不执行下一个按键,而是把它插入到当前buffer或者minibuffer当中。
还有一些其它与regexp相关的知识:
  * 在elisp代码中,你写两次转义("//"),而在minibuffer输入时,你只写一次转义就OK了。
  * 由于emacs代码有很多要匹配括号,所以emacs反转了括号的语义,在emacs的regexp中,"(",")"匹配实际的括号,而"/)","/("则用以建立匹配组(字串)。
  * 在替换串中,使用/1 /2 ...来插入匹配组中的字符串
  * 如果你输入的regexp没有正确工作,把结果undo掉,重新输一次命令,当提示输入表达式时,使用上下箭头按键可以找出你之前输入过的记录。这样可以习省时间开销和防止混乱。
条款10:掌握一套细致的文本处理命令
emacs提供很多小巧实用的命令来对文本进行外科手术作业,极大地提升了编辑效率。
如果是初学者,不要经不住诱惑把ctrl-k重绑定到一个删除整行的命令上。我知道,这是很多其它编辑器的"删行"命令。但相比于kill-line的默 认行为,这显行很粗造。默认行为,删除到行末而不把行末换行符删除,会让你有更细致的操控,当你在对全盘文本进行外科手术作业时这会提高效率的。相信我: 所有的emacs用户都用过那些只支持鲁莽"kill-whole-line"的编辑器,他们早就用过了,但还把kill-line的默认行为设成现今这 个样子,不是没有原因的。
键盘宏记录
我可以毫不夸张地说,emacs的宏是全宇宙最酷的东东了。从感觉上讲,它们是一种特定用途的细致操作,因为你当即把它们做出来,然后就当即用来解决手头 特定的问题。只要你觉得自己要进行一组特定的,有迹可寻的操作,而且不止一次(比如10次,15次)时,写一个键盘宏,这真的非常简单高效。
先试运行一下宏是有益的。首先把光标移到你第一个要改动的地方,按下Ctrl-x ( 启动宏记录。继续你的编辑操作,确保你的光标刚好在下一行(或者说下几行,视情况而定),这样就可以按模式运行了。用Ctrl-x )来结束宏录制。再来就是用Ctrl-x e(call-last-kbd-macro)来调用宏了。。
有时,定义一个可靠的宏算得上是一种技艺――你得学会在添加操作之前,使用 beginning-of-line和 end-of-line 这样的锚点来保证宏操作在一个可确定的位置上。
递增搜索可以很方便地跳过下一个位置。如果你在记录宏时使用了isearch,那么宏调用时,isearch也会被执行,非常方便。
在记录宏时有时会有些小的失误,这不要紧,直接改正这个失误,继续录宏。在宏调用时,这个失误会反复出现,然后反复被改正,而且很快,你几首注意不到。
用宏的技巧是很死的:确保你的宏完成它的任务,并且不要放弃,哪怕有时录一个正确的宏比你手工编辑还慢。因为下一次你就会快很多,久而久之,会成为你的本能反应。键盘宏是emacs最强大的功能之一,它让你的生活更美好~~~
最捂一个有关宏的招数:有时候你得调用它们几百次,而且不止在一个文件中,可能在多个文件中。这时你应该把 call-last-kbd-macro 绑定到一个单次按键中,比如f5啦。这时你可以翘起二郎腿,反复地按那个键,再看看编辑器上文本的变化有没什么意外即可。所以把综绑定到一个很远的按键也 是可行的:
(global-set-key [f5] 'call-last-kbd-macro)

调换XXX的功能
虽然看起来很古怪,但一旦你习惯了它们,你就会发现调换功能出奇地有用。可能最突出要是默认绑定到alt-t的transpose-words了:它的作用有两个,一个是调换连续的两个词,一个是把单词在句子中拖来拖去。
transpose-words对mdoe特定的语法和词法边界是有感知的,比如。把光标放到下面两个词的中间:
([this])-is
然后按alt-t,结果变为:
([is])-this
你可以在连字符,html标签,和其它标点符号之间调换单词。这是一个急你所需的灵活功能。
当你调换两个词时,比如"dog food",左过的词与右边的词互换了(这里假定你把光标放到两个词中间),变成"food dog"。但是这时的光标是还是在被移到右边来的这个词(food)的右边。所以如查你不停地按调换键,那个词就不断地在句子中向右边爬行驶。我不知道有 什么内置的方法可以让一个词往左边爬的,但是如果要写一个的话,也一点也不难。。相应的eclipse插件,可能就得要5000行代码,分布在60个文件 中,得花个9天时间来编写和调试了。。。
你还可以调换字符,行,句子,段落。无论你在编写纯文本还是程序时,这些都是很有用的,试验并试着记住它们,目标是形成本能反应~
下次要写的东东…
一开始我有点想写50个条款的,就像Scott Meyers的力作《Effective C++》那样写50个条款。但最终我还是放弃了用一次休息时间就写出50个tips的相法,并把题目中的50改成了10。我至少花了两个小时坐下来写了这 篇文章。要是一个eclipse用户的话,很可能会愿意花更多时间在文档中找寻可以帮助写blog的重构工具。
下面列一下接下来想到的,有用的条款吧:
   1。 fill-paragraph (alt-p) -- 智能地帮你把文本分行,这是必备良药啊,在注释里面都能用。
   2。 gnuserv: 自动用emacs来开启特定文档(包括你浏览器的"view source")。
   3。 M-x dired: 一个很强的文件/目录管理工具,它提供了一些其它工具完全没有的强大功能(至少据我所知),比如用regexp把某个用户组的文件重命名。
   4。 whitespace处理命令:C-x C-o(delete-blank-lines), delete-trailing-whitespace, tabify 和 untabify 等等。。。。
   5。 nxml-mode: 唯一让你在处理xml时编辑如飞的方法,作者是xml高手James Clark;完全把其它基于IDE的XML编辑器比下去了。。
   6。 picture-mode: 搞ascii艺术时最好用的东东。
   7。 minibuffer管理: 掌握递归编辑,在各种情况下怎样中断退出,命令补全及其它各种输入技巧。
   8。 不费吹费之力的导航: 绑定一些各个方向移动光标的命令:以字符为单位,以词为单词的。使用alt加某个字符的快捷键组合。
   9。 区域管理: 选一个不太难看的区域高亮颜色。
   10。 矩形区域命令: 这是另一组很神奇的命令(译注:不过很多编辑器现在也都有这功能了)。
   11。 emacs shell: 高效使用emacs shell的技巧。
   12。 align-regexp: 我新收藏的命令,最近才学到的,几乎天天都用到。
   13。 frame初始化: 如何在每次打开emacs时,自动根据显示器尺寸把emacs窗口设定好。
   14。 使用goal column: 每个emacs强人都该知道的。
   15。 设定fill column: 最大发挥 fill-paragraph 和 fill-region的功能。
   16。 优化操作系统设定: 设定键盘重复率,设定好的emacs字体,等等。
   17。 浏览编辑归档文件: tar,gzip,zip,jar等等。这没什么奇怪的。
   18。 高级绑定: 学习绑定的语法,home/end等其它不常绑定的按键,学习如何特定于buffer来绑定按键。
   19。 掌握 kill ring, 包括用 Derek upham的新mode来查看它的内容。
   20。 掌握 Info: 定制你的Info目录,查找和添加新的Info文档,高级导航及书签功能。
   21。 使用好 M-x customize: 学习它的运作,以及怎么避免使用它。
   22。 工具程序: M-x calendar, M-x calc, 及其它。

这个列表会一直增长下去……呵呵,在某天我会再把它们写出来吧。
就这么多了,我得睡觉啦~~~。

后面是对这个blog的回复,也有一些不错的建议喔~
++

Comments -----------------------------------------------------------------------------------------------------

Some random comments:
To yank at the i-search prompt, use M-y instead of C-y. The emacs info node on Incremental Search talks about the rebinding of C-y, C-w, etc at the i-search prompt.
To repeat execution of the last kbd macro, after hitting C-xe to run it once, keep hitting just the 'e' key for repeated execution.
Zap-to-char (M-z) is incredibly useful if you need to change myDatafileHandler to myStreamHandler and point is at D (the first char to change). Simple M-z e to zap the "Datafile" part and type in the replacement. This is not orthogonal to the backward-kill-word (bound to C-backspace for me since that works in windows browser windows as well as everything else) so there's a feel needed for which is optimal when, which for me mostly depends on where point is already.
Posted by: Ami F. at January 23, 2005 07:12 PM
"Swap Caps-Lock and Control": Or you could just get yourself a keyboard that's already swapped, or that lets you swap them in hardware. The Happy Hacking Keyboard is an example of the former. I like the Avant Stellar keyboard for the latter.
"Binding Alt-r and Alt-s": Try setting up a minor mode with the definitions you want. Then stick that keymap on the *front* of MINOR-MODE-MAP-ALIST.

Other tips:
Use `iswitchb' mode. It's faster for switching between buffers, and it provides more feedback.
Use P4 mode. But be sure to download a more recent version than what we have installed.
Emacs' integration with X11 selections is written to work well with xterm's sucky default policies. That means it works badly with modern apps and badly over slow network connections (say, a VPN from home). I have written a new set of commands to make Emacs talk to the clipboard, and they make life much easier.
Posted by: Derek U. at January 24, 2005 07:37 PM
Doing the swapping of control/cap-lock key can be done in //HKEY_CURRENT_USER/Keyboard Layout instead of under //HKEY_LOCAL_MACHINE.
Posted by: Chris W. at January 27, 2005 07:52 AM
I disagree with your agressive rebinding of keys. I used to rebind almost all my emacs keys so they would be more familiar to a windows user (Ctrl+C does copy, Ctrl+V is paste, etc). However, I found myself at a loss when I tried using my neighbor's computer with the default emacs installed.
Always learn default emacs keybindings first, then over-write them as you find appropriate. For example, I rebound Ctrl+J to be the goto-line macro. By default, Ctrl+J enters a newline. F7 is not bound to anything by default, so I made that bound to the compile macro (that keybinding actually comes from Visual Studio). That is about the extent of the keybindings I need/use. And, if I have to use a non-customized emacs, I can still get work done.
Cheers,
-Brian
Posted by: Brian M. at January 27, 2005 10:29 PM
To not pursue aggressive editor and keyboard customizations because other people stick to the standard is a bogus argument, in my opinion. Firstly, how often do you really use a terminal other than your own? And even then, how often do you write just scads of code there? When I do this, it's usually for just a couple of quick edits. So, why optimize for that 1% of time when you're not at your own setup? Secondly, if it does annoy me enough to care, I can always just load my rc file remotely. I use vim and have my .vimrc hardlinked into my /workplace directory so I can just say vim -u /net/ericw/workplace/.vimrc if I really need my magic. I'm certain the same can be done in emacs.
Customization is one of the main selling points of powerful editors, and our wrists are two of our most valuable assets as developers, so I don't understand why people eschew customization just because they fear that small percentage of the time when they won't have it.
Posted by: Eric W. at January 28, 2005 07:34 PM

Brian, I'm afraid I'm with Eric on this one.
I have friends who have nonstandard keyboards, in some cases to avoid repetitive-stress injury. I can't type at their workstations. I have this little secret, though, that works like a charm. I say: "uh, you type."
OK, not much of a secret, but it's gotten me by.
Everyone customizes their environment. Some SDEs use fonts so small I actually can't read them. Some use custom window managers with non-CUA hotkeys and behavior. People use Windows, Linux, MacOS. There are different Unix shells with different default keybindings and aliases. Should we tell everyone they have to use plain-vanilla Windows installations with no customizations?
You're effectively arguing that we should all reduce ourselves to the least common denominator of productivity. This argument has been debunked in other domains (e.g. should we make people with good vision wear blur-inducing glasses, so nobody feels like they're at a natural disadvantage?), and it doesn't hold water in ours either.
You're welcome to use the default bindings yourself, of course. But I wouldn't get on a bandwagon that tries to discourage people from getting better at their jobs. It's a slippery slope that I think you want to avoid.
Anyway, we now issue laptops with wireless iVPNs, so you can even bring your environment with you. It's just not an issue anymore.
Posted by: Steve Yegge at January 28, 2005 09:30 PM

I just want to know the tips you allude to in number (8) of your "Tune in next time..." section. How do you do the up/down/left/right browsing? I've been trying to train myself to use C-n, C-p, C-f, C-b and friends, but its awkward, and it isn't getting easier. Also, can I plllleeeeasssseee see your .emacs file
Posted by: Charles G. at February 18, 2005 01:47 AM

On March 4 2006, Luke Gorrie wrote:
Howdy,
I know it's bad form to comment on a blog entry without having read it thoroughly but I will take a chance because your eternal salavation is at stake.
I use C-h for backspace in Emacs and move `help-command' elsewhere:

(global-set-key "/C-h" 'backward-delete-char-untabify)
(define-key isearch-mode-map "/C-h" 'isearch-delete-char)
(global-set-key [(hyper h)] 'help-command)
and this also works in the shell along with C-m, C-j, C-i, etc.
Offered for your consideration. :-)

On March 5 2006, Anupam Kapoor wrote:
hi,
regarding tip #7, imho, its better to just disable it via Xresources,
rather than loading it all up and making it invisible (as you have
shown) via:
,----
| ! better to turn this off here than in .emacs
| ! where it has already been loaded.
| emacs.menuBar: off
| emacs.toolBar: off
|
| ! no scrollbars fur me
| emacs.verticalScrollBars: off
`----
kind regards
anupam
On March 9 2006, Scott Anderson wrote:
Steve,
Great article.
Reading section 7, I became amused by the person who claimed that
"countless studies" (or whatever) had proven that the mouse was
faster.
I'm guessing he never studied GOMS, which is a method of decomposing
UIs into their basic operations and then performing objective
complexity and time analysis.
A quick typist can hit about 10 keys per second, or .1s per key. To
use a mouse there are four movements involved: move from the keyboard
to the mouse, move the cursor to a location, perform some operation at
the location, then move the hand back to the keyboard.
Moving the hand takes about .4s. Moving the mouse cursor on the screen
takes .5s. So without even doing anything, you've used 1.3 seconds. A
mouse click takes .1 seconds, and if you're dragging something, you
measure the click down, the drag, and the release, adding up to
another .7 seconds.
So let's say I want to highlight a line for copy:
mouse:
.4 move to mouse
.5 move cursor to first character
.1 depress button
.5 drag to highlight (and this is optimistic, depending on how good
you are with finicky targets like highlighting)
.1 release button
.4 move to keyboard
.2 copy (alt-w, ctrl-c, whatever. count control keys as a separate keypress)
2.2 seconds to perform.
kb scenario 1: best case: already at beginning of line
.2 mark (ctrl-space)
.2 end-of-line (ctrl-e)
.2 copy
.6 seconds to perform, or nearly 4 times as fast.
kb scenario 2: worst case: requires navigation: 30 lines down, line
starts with "Reading"
.9s move to start of line (ctrl-r readi ctrl-r)
.2 mark (ctrl-space)
.2 end-of-line (ctrl-e)
.2 copy
1.5s, still faster
As it turns out, the only thing a mouse is really good for is
something involving a gross motor movement, like moving a window or
the like. Unless you're a crappy typist.
Anyway, good article, and I'm looking forward to reading the rest of
them.
Regards,
-scott

Back to Stevey's Drunken Blog Rants     image of my email address, steve dot yegge at ye olde gmail
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics