如何对可视块中选定的文本应用功能

How to apply function on text selected in visual block

我经常操作包含 mac 这种格式地址的 ascii 文件:DEADBEEFDEADBEEF 并且经常需要将它转换成这种格式 de:ad:be:ef:de:ad:be:ef。大多数时候我有一个 sed 表达式在处理定义明确的文件时自动执行此操作,但碰巧我必须去手动执行它所以我做了这个功能:

function ConvertMac() range
    s/\v(..)(..)(..)(..)(..)(..)(..)(..)/\L:\L:\L:\L:\L:\L:\L:\L/g
endfunction

仅当文件在按列组织的文件中包含所有 mac 地址且第一列为 mac 时,此方法才有效。当我 select 任何列中的可视块,甚至 mac 不同列中的地址时,我想让它工作。

完整示例:

我们有以下包含 4 列的文件,我想将其中的第 3 列更改为我之前提到的格式:

1    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 1
2    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 2
3    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 3
4    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 4
5    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 5
6    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 6
7    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 7
8    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 8
9    DEADBEEFDEADBABE   DEADBEEFDEADBEEF 9
10   DEADBEEFDEADBABE   DEADBEEFDEADBEEF 10
11   DEADBEEFDEADBABE   DEADBEEFDEADBEEF 11

使用上述 vim 函数,select 在可视块模式下输入第 3 列并调用命令 '<,'>call ConvertMac(),这将产生:

1 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 1
2 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 2
3 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 3
4 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 4
5 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 5
6 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 6
7 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 7
8 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 8
9 :  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 9
10:  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 10
11:  : d:ea:db:ee:fd:eadb:ab:e :  :de:ad:be:efDEADBEEF 11

这里的问题是它没有考虑视觉块 selection,甚至匹配模式 space.

中的第一个字符

我想要的是仅在模式 space 中考虑视觉块 selection,因此结果将是:

1    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 1
2    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 2
3    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 3
4    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 4
5    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 5
6    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 6
7    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 7
8    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 8
9    DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 9
10   DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 10
11   DEADBEEFDEADBABE   de:ad:be:ef:de:ad:be:ef 11

好的,我经过一番挖掘发现,要在视觉选择中进行替代,必须提供 '\%V' 标志:

function ConvertMac() range
    '<,'>s/\%V\v(..)(..)(..)(..)(..)(..)(..)(..)/\L:\L:\L:\L:\L:\L:\L:\L/g
endfunction

这个有效