2011年10月9日星期日

Emacs 中的简单排版

Tabs的使用

emacs中的Tab默认长度是8个字符,而且Tabs的行为有点智能,它并不是简单地插入一个制
表符,而是会依照上行的非空白字符的位置,来选择光标的移动位置。比如:
输入:TAB TAB Hello World,得到:“\t \t Hello World”,接着按下ENTER另
起一行,再按下Tab,此时光标会直接跳到与Hello中‘H’对齐的那一列,而不是简
单地插入一个制表符。
通常情况下,这正是我们所需要的行为,但当我们正需要一个Tab时,这种“智能“的判
断会给我们造成困扰。这时,可以使用C-q TAB。

我们还可以对TAB的一些特性进行定制。比如把tab的长度设置为常用的4字符:

(setq-default tab-width 4)

因为TAB会根据非空白字符的位置来移动光标,当需要移动的距离不是TAB字符长度的倍数,
会插入制表符和空格符来满足要求。应用这样规则的文本在用别的编辑器打开时,因为
TAB长度的差异,可能会使排版变得难看,所以更好的方法是当使用TAB键时不要插入制表符
\t,而是插入同等长度的空格符。可以用以下语句实现要求:

(setq-default indent-tabs-mode nil)


Autofill mode与M-q


Autofill 和 M-q 都与一个变量有关系,那就是default-fill-column,它的作用是设定排版
时每行的最大长度,这样排版出来的文章才会显得整理。设置default-fill-column为80,因
为它刚好是我屏幕的一半,这样分屏时也挺不会折行 :)

(setq default-fill-column 80)

Autofill 是一个mini mode,它会使输入超过default-fill-column时自动换行,免去用M-q
命令排版的麻烦。可以在.emacs文件中加入以下语句:

;;所有模式都默认开启auto-fill
(setq-default auto-fill-function 'do-auto-fill)

M-q 的函数是 fill-paragraph,会对所在段落进行排版,主要操作是去除多余的空白字符,
并在超过default-fill-column处加入换行。需要注意的一点是,默认情况下,段落间的标志
是相隔一空行,所以如果只是用ENTER另起一行,在用 M-q 排版时会被当作是同一段落。

fill前缀


Autofill 在换行时,可以添加一些前缀(prefix)。前缀的自动识别由变量
adaptive-fill-regexp 决定,emacs在断行时自动识别出符合的前缀,新起的一行会添加该
前缀。默认情况下空格与制表符都包括在能被识别的前缀里,所以如果新起的一行会保持与
上一行相同的缩进,甚是方便,充分体现了emacs 的强大。

也可以在你需要使用的前缀后敲入"C-x .",则光标之前的字符串会被当作前缀,换行时就会
添加该前缀。利用这个功能,我们可以方便地写出类似下面这样的排版:
EMACS太强大了:我同意
EMACS太强大了:我举双手赞成
EMACS太强大了:我坚决支持
EMACS太强大了:呵呵
另起一行,再输入一次"C-x .",就会取消这个手动设置的前缀。

更详细的介绍可以参考这里

居中


居中是在排版中常见的任务,Emacs提供了函数来实现这个任务:
center-line 绑定键 M-o M-s 使当前行居中
center-paragraph 绑定键 M-o M-S 使当前段居中
center-region 使选中区域居中

缩进

按照上述的设置和使用,在编写时应该能写出符合要求的排版。如果在输入完后,才决
定需要对某段文字进行缩进,这时可以使用C-M-\ (indent-region),它对选中的区域缩进一
层。注意,如果需要缩进多层,不该使用该命令,不然会使排版变得很糟糕。有更适合的命
令来实现多层的缩进,那就是C-x TAB (indent-rigidly),默认情况下,该命令会缩进一个
字符,可以配合C-u 使用。

没有评论:

发表评论