`
wsql
  • 浏览: 11745507 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

译 GNU Emacs Manual - [2] Characters, Keys and Commands 字符集, 键 和 命令

 
阅读更多

译者: Crazybaby

字符集, 键 和 命令


这章会解释下由Emacs输入的命令和文件内容的字符集,一些基础键和命令的概念,即Emacs怎么"解释"你的键盘和鼠标输入.

2.1 不同用户的输入


GNU Emacs是专门为键盘设计的, 因为这是最有效的编辑方式. 当然你可以用鼠标进行编辑, 和其它编辑器一样,你可以使用菜单栏和工具栏和使用滚动条进行滚动. 但是如果你依然使用这些编辑方式,你将不能最有效的使用Emacs. 所以这本手册主要讲怎么使用键盘进行编辑.你可以通过Shell命令'emacs -nw'启用Emacs,这样就可以强制键盘进行练习,因为这样启动 鼠标就不能用了.

Emacs使用ASCII字符集扩展作为键盘的输入,另外它也接受非字符的输入事件,这些包含功能键和鼠标按钮操作.

ASCII包含128个字符, 有些字符被分配作为图形符号,如'a' 和 '=',剩下的作为控制符号,如 Control-a (通常使用C-a作为缩略写法) ,C-a 通过名字可以得出你必须先按住Ctrl键 然后再按a .

一些ASCII控制字符都有一些特殊的名字 和 很多终端都有特殊的键 你可以输入它们 如: RET, TAB, DEL 和 ESC键. 空格符号通常称为SPC,即使严格来说它是一个空白的图形字符.

Emacs扩展了数千个打印字符的ASCII字符集(请见第 19 章 [International] 173 页) 额外的控制字符 和 一些极少数可以和任何字符结合的修饰符.

在ASCII终端上,只有32个控制字符,这些控制字符是一些字符的变种和 ‘@[]\^_’ , 另外, shift作为控制键是无意义的 , C-a 和 C-A是同样的字符 ,Emacs把这两个键等同对待.

Emacs的字符集有空间包含各种打印字符的变体 , 识别 C-A 和 C-a.图形终端尽可能的输入所有字符, 比如 C--(这是Contol-减法) 和 C-5 在图形界面终端下 都是Emacs上有意义的命令.

另外一个字符集扩展是额外的修饰位.只有一个修饰位是常用的,它被称为Meta. 每个字符有一个Meta变种; 拿例子来说 比如 Meta-a(通常被写成M-a) ,M-A (这个不同于M-a, 但是这个在Emacs下是相等的) 还有 M-RET 和 M-C-a. 最后一个意味着 你需要安装CTRL和META两个修饰符,我们通常把M-C-a 写成 C-M-a,这样会更好,为了符合传统惯例.

通常有些终端只有一个META键,允许你按住Meta字符, 比如按Meta-a 需要先按下META键并保持住再按下a.Meta使用起来和Shift键差不多,事实上,这个键被被标记为ALT 或 EDIT. 在Sun键盘上 ,他上面会有一个方块刻在上面

译者: 我的键盘上的元字符 上面就是有个方块在上面, 如图:



如果你没有META键, 你仍然可以通过使用ESC开始的两个字符序列.因此,你可以通过键入ESC A来代替M-a . 你可以通过输入ESC C-a 来代替C-M-a. ESC不同于Meta键 , 你不能按住ESC键再按下一个字符, 你应该按下然后再放开,再按下一个字符. ESC也可以在终端上使用,如果你已经养成这个习惯.

Emacs定义了一些其它修饰符键可以用于任何字符的输入. 这些有 SUPER, HYPER 和 ALT, 我们通常写成 's-' , 'H-' 和 'A-' .因此, s-H-C是Super-Hyper-Control-x的缩写. 不是所有的图形终端都提供这些键,实际上很多终端都有ALT键,这是一个真正的META键. 标准的Emacs的绑定不包括任何字符与这些修饰符.但是你可以自己来定制这些键.

如果你的键盘上这些修饰键一个都没有,你可以输入C-x @; C-x @ h来增加 "hyper" 标记 ,C-x @ s增加super标记, C-x @ a增加 alt 标记. 比如 C-x @ h C-a 是Hyper-Control-a的一种输入方式(不幸的是没有办法增加使用C-x @两次同样的字符) .

键盘上不是所有的键都有字符的,比如功能键和方向键.鼠标按钮也不是字符. 然后, 你可以修改这些事件与修饰键 CTRL, META, SUPER 和 ALT 就像键盘字符一样 .

输入字符 和 非输入字符统称为输入事件.请看这本手册中的 "Input Events(输入事件)" 这一节 来完全的了解lisp,如果你不会lisp编程,但是想要简单定义一些字符和非字符事件,请看 第 32 章 [自定义] ,第 377 页.

ASCII终端不能除ASCII字符集以外的任何东西. 这些终端使用的字符序列来代表每一个功能键. 但是, 这些对于Emacs用户来说是无形的,因为键盘输入后 会捕获这些特殊的序列,并将它们转换成功能键的事件,.

在图形终端显示下,像Meta-Tab这些切换窗口的快捷键, 这些可能会组织 Emacs 的 Meta-SPC, C-M-d 和 C-M-l. 如果你有这些问题 ,我们推荐你自定义你的窗口管理器 来关闭这些冲突的键 或者 重新组合这些Emacs上的快捷键 使Emacs不要用到它们.

2.2 键

一些Emacs命令序列是由一个字符或者一个事件调用的;例如,像C-f 在buffer 向前移动一个字符,但是Emacs还拥有两个或两个以上的事件调用的命令.

如果一个事件的序列是调用一个命令,它就是一个完整的键. 完整的键包含 C-a , X , RET, NEXT(一个功能键), DOWN(方向键), C-x C-f 和 C-x 4 C-f. 如果没有足够长的时间去完成这个键,我们称它们为一个前缀键. 比如 C-x 和 C-x 4 都是前缀键. 每个键的序列要么是个 完整的键 要么是 个前缀键.

在标准的Emacs键绑定中, 大多数单个字符都可以组成完整键. 及少数的键是前缀键. 一个前缀键的组合可能是个完整键也可能还是前缀, 比如 C-x 是个前缀键, C-x和下一次按键将会组合成2个事件的键序列.大多数的键序列都是完整的键,包括C-x C-f 和 C-x b. 极少数的不是, 比如 C-x 4 和 C-x r 这些是3事件键序列. 这些键序列的长度是没有限制的,但是实际上使用人很少使用超过4个键的序列.

你不能把输入事件作为完整键的一部分.比方说,有2个事件序列 C-f C-k 就不是一个组合键,因为C-f本身就是一个完整键,所以不能把C-f C-k作为单独意义上的命令,C-f C-k是两个键序列,而不是一个.

综上所述,Emacs的前缀有 C-c, C-h, C-x, C-x RET, C-x @, C-x a, C-x n, C-x r, C-x v, C-x 4, C-x 5, C-x 6 , ESC, M-g 和 M-o (F1 和 F2是C-h 和 C-x 6的别名). 这个清单描述了标准的键绑定,如果你想自定义Emacs,你可以使用新的前缀键, 或者 一些 标准的键(大多数人都不建议) 请参见 3.4 节 [key Bindings 键绑定] 第 393 页

如果你自定义了 或者 删掉了 前缀键,这些可能会改变一些键序列.比如说,如果你重定义 C-f 作为一个前缀, C-f C-k 将成为一个键 (完整的,除非你把它们都定义为前缀). 相反的, 如果你删除了C-x 4 这个前缀定义, C-x 4 f 和 C-x 4 +任何东西都不起作用.

2.3 键和命令

本手册的段落,会告诉你一些特殊的键的操作. 但是Emacs不会告诉你键的意义,相反,emacs会分配命令的名字,然后给出这些键绑定的名字和含义.

每个命令都有一个程序员喜欢的名字,这些名字通常由几个英文单词和破折号组成; 比如 next-line 和 forward-word. 一个命令也是一个lisp定义的函数;这就是命令怎么工作的.在Emacs lisp中 一个命令就是一个lisp 程序和一些特殊选项来传入参数,以用来和用户交互.关于命令和lisp函数的更多信息,请参见本手册中的 "什么是函数"这一节 .(在这里的定义都是简化过的)

键和命令的绑定被记录在一张表格中,这种形式被称为键映射 .请参见 32.4.1节 [Keymaps键映射],第 393 页.

当我们说"C-n 垂直的向下移动一行时" 这句话时,这里隐藏了一些微妙的日常使用中无关紧要的事情,但重要的是Emacs的定制性. next-line的命令做了一个垂直向下的操作. 所以正因为C-n有这样的效果那是因为绑定了next-line这个命令. 如果你把C-n重新绑定到forward-word这个命令上,C-n将会向前移动一个单词.重定义键是定制最重要的一种方法.

在手册剩下的内容中,我们尽量让事情变的简单.我们像解说C-n这个命令一样,即使严格来说这个键绑定了一个命令. 通常我们说明一个命令的名字,其实真正工作的是在括号里面的命令运行了. 比方说, 我们说的"C-n(next-line)命令向下移动了" 意味着命令next-line向下移动了一行,正常情况来话,next-line和C-n进行了映射.

自从我们讨论到自定义, 我们应该告诉你下关于变量. 通常,关于一个命令的描述是这样的:"要想改变它,设置下 numble-foo 这个变量" 一个变量通常来用来存储一个值.这本手册的大部分变量都是为了定制的:Emacs的一些变量或者其它用于部分检查的变量根据你的设定的值执行不同的事件.现在你可以忽略变量的有关信息直到你对自定义感兴趣.你可以阅读些关于变量的基本信息(请参见 32.3节[Variables变量],387页 和一些特殊的变量的意义.

2.4 文本字符集

Emacs buffers中的文本是一个字符序列,简单来说,这些都是ASCII字符,每一个是由8位字节进行存储.包括ASCII的控制字符(八进制代码000至037,和0177) 还有一些打印字符(代码040 到 0176)都是允许的. 其它一些修饰符标志是不允许在缓冲区的 如 Meta.

但多字符集被激活的时候,非ASCII打印字符也可以显示在buffers中, 它们的字符代码从256开始,8进制为0400,里面的每个字符表示成两个或多个字节.序列.请参见 第 19 章 [International国际] , 第 173 页. 单字节字符代码是从128 至 255 依然可以显示在多字节缓冲区中.然后,非ASCII控制字符是不能显示在buffer中的.

一些ASCII控制字符在文本中有特殊的用途也有特殊的名称. 比如说,换行符(八进制 012)是用于作为在缓冲区的结束行的,制表符(八进制代码011)是使用缩进到下一个制标位栏(通常为每8列). 详细请看 11.14 章节 [Text Display 文字显示] 第76页.

如果你禁用了多字节字符,那么你可以使用唯一的非ASCII字符,通常使用八进制代码 0200 至 0377 . 详细请看 第19.8章节 [Unitbyte mode] 第 190 页.

- 本章 完
by Crazybaby

本Manual所有翻译: http://blog.csdn.net/crazyjixiang/article/category/871530 (会慢慢翻译全部,并且整理完整 以pdf 形式share给大家)





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics