免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1927 | 回复: 0
打印 上一主题 下一主题

[新手入门] (转贴)Emacs 编辑环境,第 6 部分: 自定义您的 Emacs 环境 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-02 09:42 |只看该作者 |倒序浏览
Emacs 编辑器的系列的第 6 部分,虽然对于这个编辑器还不是很熟悉,但是感觉它确实很强大,而且可以定制的东西太多了,如果有时间可以好好的跟着这个教程研究一下。呵呵。
原文:http://www.ibm.com/developerwork ... a=dgr-cn-cu&amp
Emacs系列文章:http://www.ibm.com/developerwork ... a=dgr-cn-cu&amp

设置 Emacs 变量
                要对您的 Emacs 环境中的某些方面进行自定义,最快捷且最简单的方式就是设置 Emacs 变量。变量 可以影响 Emacs 中各个方面的工作方式;它们是 Emacs Lisp 符号,通过名称对其进行引用,并且通常具有一个缺省值。有些变量可以包含数值或者字符串,而其他的变量则是“真”或者“假”:如果将一个变量的值设置为 nil,那么它的值是“假”,值 t 表示“真”。
                在 Emacs 会话中,您可以在任何时间更改任何变量的值。进行这种操作,可以为特定的缓冲区设置局部变量,可以更改仅应用于当前会话的全局变量,或者测试不同值的行为。
                例如,在本系列文章的第 2 部分教程(请参见参考资料)中,您学习了 fill-paragraph 函数(绑定于 M-q),该函数在光标处填充段落。fill-column 变量中包含了这个函数将要填充的宽度,和其他的 Emacs 变量一样,您可以显示其内容并对其进行更改。
                首先,使用一个新文件的缓冲区启动 Emacs:
               
$ emacs bee
               

                现在,在您的新缓冲区中插入一行文本:
               
The busy bee has no time for sorrow.

                通过键入 M-q 运行 fill-paragraph 函数,以便填充当前段落(即您刚刚插入的行)。
                当您键入这个内容的时候,看起来似乎没有出现什么变化,这是因为 Emacs 用于在缓冲区中填充文本的缺省宽度(以字符为单位),比您刚刚键入的段落要长。您可以通过观察 fill-width 变量的内容来进行证实。
                显示变量的值
                使用 describe-variable 函数以得到变量的值。当您运行这个函数的时候,Emacs 将打开一个新窗口,该窗口中包含该变量的给定当前值。如果有的话,还将提供关于该变量的描述。这个函数与 C-h v 按键进行了绑定。
                通过键入 C-h vfill-width,可以尝试获得 fill-width 变量的值。
                在完成了这个操作之后,您将在 Emacs 会话(包含清单 1 的文本)中看到一个新的窗口。
               
清单 1. 显示 fill-width 变量值的 Emacs describe-variable 函数的输出
                    

fill-column's value is 70

Documentation:
*Column beyond which automatic line-wrapping should happen.
Automatically becomes buffer-local when set in any fashion.

You can customize this variable.

                从这个输出中您可以看到,直到到达第 70 个字符,fill-paragraph 函数才划分出一个新的行,所以您所键入的简短段落的长度并不足以进行自动换行。
                设置变量
                与任何 Emacs 变量一样,您可以更改 fill-column 的值。可以使用 set-variable 函数来完成这个任务,当您运行该函数的时候,它会请求输入变量的名称和您希望给它赋的值。
                尝试将 fill-column 的值设置为 10,如清单 2 中所示。
               
清单 2. 使用 Emacs set-variable 函数更改 fill-column 变量的值
                    
                    M-x set-variable Enter
                    
Set variable: fill-column Enter
                    
Set fill-column to value: 10 Enter
                    
               

                现在,再次填充该段落:确保光标位于您刚刚键入的行的末尾处,然后键入 M-q 以运行 fill-paragraph 函数。
                请注意,如何填充该段落以使得其中所有的行都不超过 10 个字符,如清单 3 中所示。
               
清单 3. 在将 fill-width 变量设置为 10 之后进行自动换行的示例段落
                    
The busy
bee has no
time for
sorrow.

                在将 fill-column 的值设置为 4 之后,再次尝试这个操作,使用清单 2 中给定的过程。
                在使用另一个 M-q 填充该段落之后,您将看到这些单词进行了不同的自动换行,如清单 4 中所示。
               
清单 4. 在将 fill-width 变量设置为 4 之后进行自动换行的示例段落
                    

The
busy
bee
has
no
time
for
sorrow.

                因为 fill-column 是一个局部 变量,所以您对它做的任何更改都仅应用于当前缓冲区。在一个 Emacs 会话中,每个缓冲区都有它自己的 fill-column 变量;这些变量中的任何一个都可以设置为不同的值。
                尝试选择您所插入的所有文本,并将其粘贴到一个新的缓冲区:
               
C-space M-< M-w C-x b cee Enter C-y

                在键入了该内容之后,您应该拥有一个刚填充的段落的副本(从 bee 缓冲区复制到新的、名为 cee 的缓冲区,并且尚未进行保存)。
                键入 M-q 以填充它。填充的内容仅占用一行,看起来与您在开始时键入的单行内容相同。
                通过请求 Emacs 显示变量的内容,您还可以验证在两个缓冲区中 fill-column 的值是不同的。
                键入 C-h v fill-column Enter                     以显示这个缓冲区的 fill-column 变量的值,它应该为 70。
                在完成了这个操作之后,请求 Emacs 显示 bee 缓冲区的 fill-column 变量的值:键入 C-x b Enter C-h v fill-column Enter                     以验证它仍然设置为 4。如图 1 中所示,其中所显示的 *Help* 缓冲区同样可以告诉您这个变量的局部值与全局值是不同的。
                                    
图 1. 在缓冲区内对 Emacs 的 fill-column 变量进行了局部更改之后,显示它的值
                                   
                使用并了解一些常见的 Emacs 变量
                Emacs 提供了许多影响并改变其行为的变量。表 1 列出了一些经常进行修改的变量,并描述了它们的功能。
               
表 1. 常见 Emacs 变量汇总
                变量描述                            auto-mode-alist                        如果设置为 nil,那么将关闭根据文件名扩展自动选择主要模式的功能。它的缺省值是一些文件名扩展和相应模式的列表。                            auto-save-default                        如果没有将其设置为 nil,那么 Emacs 则根据预设的时间间隔,自动地将经过更改的缓冲区保存到相应的文件。它的缺省值是 t。                            auto-save-interval                        包含调用 Auto-save 模式(如果它被设置为“真”)之后经过更改的字符的数目,其缺省值是 300。                            calendar-latitude                        包含用户工作站位置的纬度值,采用度数表示;其缺省值是 nil。                            calendar-longitude                        包含用户工作站位置的经度值,采用度数表示;其缺省值是 nil。                            calendar-location-name                        包含用户工作站所在位置的位置名(如城市、州或省、国家/地区)的值,其缺省值是 nil。                            colon-double-space                        如果没有将其设置为 nil,那么填充文本的命令将在冒号后面插入两个 空格而不是一个。其缺省值是 nil。                            command-line-args                        包含在当前 Emacs 会话中所执行的命令行中使用的参数列表。                            command-line-default-directory                        包含执行当前 Emacs 会话的目录的路径名。                            compare-ignore-case                        如果没有将其设置为 nil,那么在运行 compare-windows 函数的时候,Emacs 将忽略大写字母和小写字母的区别,如在本系列文章的第 5 部分教程中所描述的(请参见参考资料)。其缺省值是 nil。                            confirm-kill-emacs                        如果设置为 nil,那么 Emacs 在退出的时候不请求确认;否则,可能自定义 Emacs Lisp 函数以完成退出验证工作,如 y-or-n-p(请参见使得简短的回答成为可能部分)。其缺省值是 nil。                            default-justification                        设置缺省的对齐风格。该值可能是 left、right、center、full 或者 none 中的一个。其缺省值是 left。                            default-major-mode                        为新的文件或者缓冲区选择缺省主要模式。其缺省值是 fundamental-mode。                            display-time-24hr-format                        如果设置为 t,那么 Emacs 将采用 24 小时军用格式来显示时间,而不是采用带有 AM 或者 PM 后缀的标准 12 小时格式。其缺省值是 nil。                            display-time-day-and-date                        如果没有将其设置为 nil,那么 Emacs 以当前星期几、当前月份和日期的格式来显示时间,而不仅仅显示小时和分钟。其缺省值是 nil。                            fill-column                        包含各行中的列数(从此处开始填充文本到下一行)。其缺省值是 70。                            initial-major-mode                        指定启动时用于 *scratch* 缓冲区的主要模式。其缺省值是 lisp-interaction-mode。                            inverse-video                        如果没有将其设置为 nil,那么 Emacs 将对显示的颜色取反(如果可能的话)。其缺省值是 nil。                            kill-ring                        包含 Emacs 剪切环的内容,如本系列文章的第 3 部分教程中所描述的(请参见参考资料)。                            kill-ring-max                        设置剪切环中所允许的条目数。其缺省值是 60。                            kill-whole-line                        如果没有将其设置为 nil,那么 kill-line 函数(绑定于 C-k)将剪切当前行以及 其尾部的换行符(如果是在该行的开头处执行这个函数)。其缺省值是 nil。                            make-backup-files                        如果没有将其设置为 nil,Emacs 将进行任何更改之前保存缓冲区的备份(使用相同的文件名,但在文件名后追加了波浪符 (~))。                            mark-ring                        包含该缓冲区的当前标记环的内容,如本系列文章的第 3 部分教程中所描述的(请参见参考资料)。                            mark-ring-max                        包含标记环中所允许的条目数。其缺省值是 16。                            mouse-avoidance-mode                        包含描述 mouse-avoidance 模式类型的值,如本系列文章第 5 部分教程中所描述的(请参见参考资料)。其缺省值是 nil。                            next-line-add-newline                        如果没有将其设置为 nil,那么只要按下向下箭头键,Emacs 就会在该缓冲区的末尾添加一个新行。其缺省值是 nil(在更新的 Emac 版本中)。                            scroll-bar-mode                        包含 Emacs 框架侧边缘(放置滚动条的位置)的值:right 或 left。如果设置为 nil,则关闭滚动条。其缺省值是 left。                            scroll-step                         包含使用 scroll-down 和 scroll-up 函数(在缺省情况下,分别绑定于 PgDn 和 PgUp 键)在缓冲区中移动的行数。如果设置为 0,那么在滚动的时候,Emacs 使光标位于窗口的中心位置。                            show-trailing-whitespace                        如果没有将其设置为 nil,那么 Emacs 将显示当前缓冲区中的行尾处的任何空白字符。其缺省值是 nil。                            visible-bell                        如果没有将其设置为 nil,那么 Emacs 将使得该框架闪烁,而不是鸣响系统警铃。其缺省值是 nil。                            x-cut-buffer-max                        设置剪切环的字符的最大数目,该剪切环同样存储于 X Window System 的剪切缓冲区中。其缺省值是 20000。


自定义您的 Emacs 键绑定
                正如您所知道的,Emacs 函数绑定于各种称为键绑定 的按键组合;标准的 Emacs 绑定易于使用和记忆(绑定中所使用的键,通常存在与记忆相关的提示),而且使用起来速度很快(因为在设置它们的时候,考虑到您仅需要最少的手动工作,就可以迅速地键入任何给定的按键组合)。
                但是如果您不喜欢这些绑定,您也可以对它们进行更改。您可以自定义 Emacs 的所有键绑定:如果您需要的话,您可以使 A 键入字符 Z,或者使得 C-f 向后移动光标,使得 C-b 向前移动光标。尽管这些更改对于大多数用户来说或许并没有多大用处,但是存在一些重新配置,您个人可能会认为是非常便捷的。而且,与提供了缺省绑定的函数相比,Emacs 中包含更多的函数,许多可能的键盘按键组合还没有绑定于任何函数。
                如果您频繁地使用一个特定的函数或者函数组,并且它们没有绑定于任何按键(或者如果它们所绑定的按键使用起来没有其他的按键方便),那么您可以重新定义它们。或者如果有一个函数您并不使用,那么您可以删除它的绑定,释放该按键,使其可以为其他函数所用。
                                    global-set-key 函数将给定的函数绑定于给定的按键,并使得它在所有的模式和缓冲区中都有效。接下来将使用它进行大量的自定义和修复。
                修复 Home 和 End 键
                在 Emacs 中,通常按两种方式对 Home 和 End 键进行配置:要么,它们将光标移动到当前行的开头和结尾;要么,它们将光标移动到当前缓冲区的开头和结尾。
                查看您绑定到这两种方式中的哪一种:在您的 bee 缓冲区中,按 HomeEnd 各几次。
                现在您知道了这两种键绑定的方式,请尝试更改它们的绑定:
               
  •                         如果您的 Home 和 End 绑定于移动光标到当前 的开头和结尾,那么键入:
                            
                                M-x global-set-key Enter
                               
    Set key globally:
                                    Home
                               
    Set key <home> to command: beginning-of-buffer
                                M-x global-set-key
    Set key globally:
                                    End
                               
    Set key <home> to command: end-of-buffer
                            
  •                         如果您的 Home 和 End 绑定于移动光标到当前缓冲区 的开头和结尾,那么键入:
                            
                                M-x global-set-key
    Set key globally:
                                    Home
                               
    Set key <home> to command: beginning-of-line
                                M-x global-set-key
    Set key globally:
                                    End
                               
    Set key <home> to command: end-of-line
                            
                在这个缓冲区中,测试 Home 和 End 几次,然后在 cee 缓冲区中尝试它们以证实您刚刚所做的更改是全局范围的:
               
                    Home
                    End
                    Home
                    End
C-x b cee
Enter
                    Home
                    End
                    Home
                    End
               

                修复 Del 键
                在 Emacs 的某些配置中,Del 键与 Backspace 键绑定于相同的函数,delete-backward-char。这并不是大多数人所想要的和期望的值;对于大多数软件,Del 键都用于删除光标后面的 字符,而不是前面的字符。
                测试您的 Del 键:
               
  •                         键入 C-x b *scratch* Enter                            ,以移动到临时缓冲区。
  •                         键入一些文本:
                            
    Delete me
  •                         键入 M-b 使得光标位于字符 m 上。
  •                         按下 Del
                如果您的 Del 键绑定正确,那么将删除 m。如果您删除的是这两个单词之间的空格,那么可以使用下面的操作修复您的 Del 键:
               
                    M-x global-set-key
Set key globally:
                        Del
                    
Set key C-d to command: delete-char
               

                创建自定义键
                要为当前没有定义的按键定义一个新的绑定,可以运行 global-set-key 函数,给出新的按键,然后给出要运行的命令。
                例如,在缺省情况下,M-F1 按键是未定义的。通过按住 Alt(或者您键盘中的任何 Meta 键),再按 F1 键,然后同时释放这两个键,就可以键入这个按键。尝试这个操作,当您在进行这个操作的时候,唯一应该发生的事情是 Emacs 发出警示声,指出这个按键还没有定义任何函数。
                您可以定义这个按键,以运行 phases-of-moon 函数,该函数将打开一个显示当前月亮盈亏的新缓冲区窗口。
                尝试下面的操作:
               
                    M-x global-set-key
Set key globally: M-F1
Set key <M-F1> to command: phases-of-moon
               

                尝试您新定义的键绑定:键入 M-F1。在完成这个操作之后,您应该看到打开了一个新的缓冲区窗口,并显示了当前月亮的盈亏。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP