将关键字参数映射到Google文档字符串的宏

时间:2019-08-13 14:41:25

标签: vim keyword kwargs vim-macros

我正在尝试编写我的第一个vim宏。 目标是将包含关键字的行映射到Google文档字符串格式。

所以输入是:

'keyword' : value,

,期望的输出将是:

keyword (value) :

所以我认为最简单的方法是定义一个宏。 在控制台模式下,我从行首使用wdwwD成功删除了关键字周围的所有内容。 但是将其绑定到宏(另外添加j0以获得新行)将产生以下输出:keyword' : value

我也尝试过f'r f'Dj0,但结果相同。 因此,似乎我做错了什么,但是重复执行序列会产生所需的输出,但是即使那是应该的,也没有将其绑定到宏,对吗?

我的例子是

Battery_config = {
        'charging_efficiency' : 0.8, 
        'discharging_efficiency' : 0.99,
        'hourly_self_discharge': 0.005
}

1 个答案:

答案 0 :(得分:2)

  

所以我认为最简单的方法是定义一个宏

您的意思是正常模式序列。但是有一个问题:您的行可能以“逗号”结尾,也可能没有。因此,起初它很想做这样的事情:

nnoremap <Leader>d ^"ayi'$"byBS<C-R>a<Space>(<C-R>b)<Space>:<Esc>

说明:

  1. ^ ---转到第一个非空白字符
  2. "ayi'-将yank关键字插入reg'a'(在引号内添加引号)
  3. $ ---移至行尾
  4. "byB-将值拖入reg'b'(向后拖WORD)
  5. S ---清除行并切换到插入模式(还需要set autoindent来保留行缩进)
  6. <C-R>a (<C-R>b) : ---最后输入keyword (value) :
  7. <Esc>-恢复正常模式

但是,它在'hourly_self_discharge': 0.005上失败了,修复起来并不容易(当然,您可以做^"ayi'$"byiW:let @b=trim(@b,',')<CR>S<C-R>a<Space>(<C-R>b)<Space>:<Esc>,但是比以前更丑陋)。

另一点是,我们希望能够处理任意视觉选择而不会破坏其他数据。因此,在Ex模式下使用正则表达式似乎更有利可图:

noremap <Leader>d :s/\v'(\w+)'\s*:\s*([0-9.-]+),?/\1 (\2) :/<CR>

说明:

  1. noremap ... ---现在它应该可以在普通模式和可视模式下正常工作!
  2. :s/\v.../.../<CR> ---使用“非常魔术”模式代替
  3. '(\w+)'-将关键字捕获到第一个子匹配中
  4. \s*:\s*-将冒号与周围的可选空格匹配
  5. ([0-9.-]+) ---(希望)将值捕获到第二个子匹配项中
  6. ,? ---可选逗号
  7. \1 (\2) :-从子匹配中组成输出字符串

现在尝试ggVG<Leader>d一次处理整个文件。