首页 > 解决方案 > 将关键字参数映射到谷歌文档字符串的宏

问题描述

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

所以输入是:

'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
}

标签: vimkeywordkeyword-argumentvim-macros

解决方案


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

你的意思是正常模式序列。但是有一个问题:您的行可能以“逗号”结尾,也可能不以“逗号”结尾。所以一开始很容易做这样的事情:

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.-]+),?/\1 (\2) :/<CR>

解释:

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

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


推荐阅读