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

Macro to map keyword arguments to google doc strings

我正在尝试编写我的第一个 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
}

So I assume the easiest way would be to define a macro

你的意思是正常模式序列。但是有一个问题:你的行可能会也可能不会以 "comma" 结尾。所以一开始很想做这样的事情:

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

解释:

  1. ^ --- 转到第一个非空白字符
  2. "ayi' --- 将关键字抽入 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.-]+),?/ () :/<CR>

解释:

  1. noremap ... --- 现在它应该可以毫不费力地在正常模式和可视模式下工作!
  2. :s/\v.../.../<CR> --- 使用 'very magic' 模式替代
  3. '(\w+)' --- 将关键字捕获到第一个子匹配中
  4. \s*:\s* --- 匹配冒号和可选的 space around
  5. ([0-9.-]+) ---(希望如此)将值捕获到第二个子匹配中
  6. ,? --- 可选逗号
  7. () : --- 从子匹配中组成输出字符串

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