Mark 操作

Table of Contents

1. Mark 文本

1.1. 从当前位置开始 Mark

三种等同的方式:

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

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

C-g 取消标记。

更多还在补充中…

2. 矩阵(Rectangle)操作

矩阵 mark 即对同行、同列的文本进行操作。Emacs 24 以后,直接 C-x 或 M-x rectangle-mark-mode 启用矩阵选择,然后就能按列选取数据。

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. 抽出列

继续上面的文本:

.>>>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. 在行首插入数字

这是 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.7. 空出列

文本如下:

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

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

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