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”,如图:
2、C-x r k(或 M-x kill-rectangle),结果如下:
.>>>xxx .xxxxxx .xxxxxx .xxxxxx .xxxxxx .xxxxxx .xxxxxx .xxxxxx .xxx<<<
注意:标记开始位置和结束位置限定了列宽(即要操作哪几列)
现在,用同样的方式删除结果中行首字符“.”。
1、从第一行第一个“.”标记到最后一行的第一个“.”,如图:
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