Mark操作

Table of Contents

1 Mark文本

1.1 从当前位置开始Mark

三种等同的方式:

  • C-Space(空格)
  • C-@
  • M-x set-mark-command

注意:通常C-Space被输入法给占据了。

C-g取消标记。

更多还在补充中…

2 矩阵(Rectangle)操作(列操作)

2.1 在行首插入字符:

如下文本,比如在每行行首插入字符“.”:

xxxlllxxx
xxxlllxxx
xxxlllxxx
xxxlllxxx
xxxlllxxx
xxxlllxxx
xxxlllxxx
xxxlllxxx
xxxlllxxx

1、标记(C-Space或C-@)这段文本

2、M-x string-insert-rectangle

Mini Buffer提示“String insert rectangle (default ):”,输入要插入的字符“.”并确认,插入结果如下:

.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx

2.2 只保留行首字符

继续2.1操作结果,让那段文本每行只保留行首字符“.”。

1、标记2.1的操作结果

2、C-x r t(或M-x string-rectangle)

Mini Buffer提示“String rectangle (default .): ”,确认并回车,结果如下:

.
.
.
.
.
.
.
.
.

2.3 删除文本列

现在文本内容改成如下:

.>>>lllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlll<<<

我们需要将带有lll那3列删除掉。

1、从第一行、第一个“l”开始标记文本到最后一行的最后一个“l”,如图:

1.png

2、C-x r k(或M-x kill-rectangle),结果如下:

.>>>xxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxx<<<

注意:标记开始位置和结束位置限定了列宽(即要操作哪几列)

现在,用同样的方式删除结果中行首字符“.”。

1、从第一行第一个“.”标记到最后一行的第一个“.”,如图:

2.png

2、C-x r k,结果如下:

>>>xxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxx<<<

2.4 2.4 抽出列

继续2.3的文本:

.>>>lllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlllxxx
.xxxlll<<<

现在将中间带“l”的3列抽出。

1、从第一行第一个“l”开始标记到最后一行的最后一个。

2、C-x r k(或M-x kill-rectangle)来删除这3列

3、移动到新位置,C-x r y(或M-x yank-rectangle)

结果如下:

.>>>xxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxxxxx
.xxx<<<

lll
lll
lll
lll
lll
lll
lll
lll
lll

2.5 替换列

文本如下:

.>>>~~~xxx
.xxx~~~xxx
.xxx~~~xxx
.xxx~~~xxx
.xxx~~~xxx
.xxx~~~xxx
.xxx~~~xxx
.xxx~~~xxx
.xxx~~~<<<

现在将中间带“~”的三列替换成“*”。

1、从第一行第一个“~”开始标记到最后一行最后一个“~”

2、C-x r t(或replace-rectangle)

根据Mini Buffer提示,输入“*”并确认,结果如下:

.>>>*xxx
.xxx*xxx
.xxx*xxx
.xxx*xxx
.xxx*xxx
.xxx*xxx
.xxx*xxx
.xxx*xxx
.xxx*<<<

2.6 2.6 在行首插入数字

这是Emacs24增加新功能,非常棒。文本如下:

lllllllllllllll
xxxxxxxxxxxxxxx
lllllllllllllll
xxxxxxxxxxxxxxx
lllllllllllllll
xxxxxxxxxxxxxxx

现在给这段文本每行行首插入“行号”(递增的数字)。

1、标记这段文本

2、C-x r N(或M-x rectangle-number-lines)

结果如下:

1 lllllllllllllll
2 xxxxxxxxxxxxxxx
3 lllllllllllllll
4 xxxxxxxxxxxxxxx
5 lllllllllllllll
6 xxxxxxxxxxxxxxx

如果想把间隔的空格替换成其他字符(比如顿号),用2.5小节讲的替换方法即可。

2.7 空出列

文本如下:

llllllllll-_-.-_-.-_-xxxxxxxxxx
llllllllll-_-.-_-.-_-xxxxxxxxxx
llllllllll-_-.-_-.-_-xxxxxxxxxx
llllllllll-_-.-_-.-_-xxxxxxxxxx
llllllllll-_-.-_-.-_-xxxxxxxxxx

现在需要把中间的表情字符给替换成空,并保持长度不变。如果用2.5小节的替换方法,必须先算出要替换文本的长度,然后再替换成相应个数的空格才行。

1、标记表情符号

2、C-x r c(或M-x clear-rectangle)

结果如下:

llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx

2.8 删除行首空字符

文本如下:

llllllllll           xxxxxxxxxx
                     llllllllll           xxxxxxxxxx
                        llllllllll           xxxxxxxxxx
                        llllllllll           xxxxxxxxxx
                          llllllllll           xxxxxxxxxx

很乱的一段文本,现在需要删掉每行行首的空字符,让它对齐。

1、标记所有内容

2、M-x delete-whitespace-rectangle

结果如下:

llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx
llllllllll           xxxxxxxxxx

类似Vim中的left命令

2.9 行首插入同等长度的空格

文本如下:

lxlx
lxlx
lxlx
lxlx
lxlx
lxlx

现在每行有4个字符,需要在行首插入同等宽度的空格(4个空格)

1、标记文本

2、C-x r o(或M-x open-rectangle),

结果如下:

|    lxlx
|    lxlx
|    lxlx
|    lxlx
|    lxlx
|    lxlx

注:“|”不是本次操作插入的字符,是因为空格贴出来显示不直观而做的“界限”符号

3 CUA Mode

cua-mode是一个支持可视化列操作的mode。

启动cua-mode很简单:

M-x cua-mode

然后开始进行列选择:

M-x cua-set-rectangle-mark

由于功能和上一节介绍的列操作差不多,所以就不详细说了,可见官方CUA Mode的官方文档:http://www.cua.dk/cua.html