Vim:创建需要移动的自定义命令

sde*_*n28 6 vim

我经常将文本行转换为数组。例如,这个:

Monday
Tuesday
Wednesday
Run Code Online (Sandbox Code Playgroud)

变成:

[
  'Monday',
  'Tuesday',
  'Wednesday',
]
Run Code Online (Sandbox Code Playgroud)

我可以制作一张地图,改变其中一行(例如Monday'Monday',),如下所示:

:nnoremap gsa ^i'<Esc>A,

我想要做的是让该命令采取运动或文本对象,以便我可以像gsaip或一样执行它gsip3j

我怎样才能做到这一点?

sid*_*yll 5

您可以使用'operatorfunc'withg@ 来制作带有运动的地图。帮助在:map-operator主题下给出了完整的解释和示例 。基本上,您可以在地图中设置要调用的函数并使用g@. Vim会等待一个动作,然后设置标志'[,并']电话通知功能。

在您的函数中,您可以发挥创意,这里我只是简单地举例说明了如何将这一原则应用于您需要的内容。

: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
Run Code Online (Sandbox Code Playgroud)