我经常将文本行转换为数组。例如,这个:
Monday
Tuesday
Wednesday
变成:
[
'Monday',
'Tuesday',
'Wednesday',
]
我可以制作一张 map 来改变其中一行(例如
Monday
到 'Monday',
),如下所示::nnoremap gsa ^i'<Esc>A,
我想要做的是让该命令采取运动或文本对象,以便我可以像
gsaip
一样执行它或 gsip3j
.我怎样才能做到这一点?
最佳答案
您可以使用 'operatorfunc'
与 g@
有一张 map
运动。帮助下给出了完整的解释和示例
:map-operator
话题。基本上你设置你想要的功能
调用您的 map 并使用 g@
. Vim 将等待一个 Action 然后设置
商标'[
和 ']
并调用您的函数。
在你的函数中,你可以发挥创意,在这里我做了一个快速的
示例说明如何将这一原则应用于您需要的内容。
:nnoremap <silent> gsa :set opfunc=TransformToArray<cr>g@
function! TransformToArray(type)
if a:type == 'line'
let s=line("'[") " saving beginning mark
']s/\(\s*\).*\zs/\r\1]
exec s ",']-1s/\\s*\\zs.*/ '&',"
exec s 's/\(\s*\)\zs\ze /[\r\1'
elseif a:type == 'char'
" ...
endif
endfunction
关于Vim:创建需要移动的自定义命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42438795/