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

标签 vim

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

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/

相关文章:

regex - 积极的后向断言和用 Vim 替换?

vim - 关闭文件而不退出 VIM 应用程序?

vim 使用带环境变量的 gf 选项

regex - VIM 不 make = be ?在正则表达式中

regex - 必要时使用正则表达式向 csv 文件添加逗号

vim - 在 Vim 中,如何将代码块向右移动?

Vim 函数插入带有传递参数的静态文本

vim - 如何在 Vim 中缩进一段 C 代码?

vim - 将命令范围传递给函数

bash - Vim 从 bash 脚本运行命令并退出而不会使 shell 处于错误状态