如何对可视块中选定的文本应用功能
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
这个有效
我经常操作包含 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
这个有效