我正在尝试编写我的第一个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
}
答案 0 :(得分:2)
所以我认为最简单的方法是定义一个宏
您的意思是正常模式序列。但是有一个问题:您的行可能以“逗号”结尾,也可能没有。因此,起初它很想做这样的事情:
nnoremap <Leader>d ^"ayi'$"byBS<C-R>a<Space>(<C-R>b)<Space>:<Esc>
说明:
^
---转到第一个非空白字符"ayi'
-将yank关键字插入reg'a'(在引号内添加引号)$
---移至行尾"byB
-将值拖入reg'b'(向后拖WORD)S
---清除行并切换到插入模式(还需要set autoindent
来保留行缩进)<C-R>a (<C-R>b) :
---最后输入keyword (value) :
<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>
说明:
noremap ...
---现在它应该可以在普通模式和可视模式下正常工作!:s/\v.../.../<CR>
---使用“非常魔术”模式代替'(\w+)'
-将关键字捕获到第一个子匹配中\s*:\s*
-将冒号与周围的可选空格匹配([0-9.-]+)
---(希望)将值捕获到第二个子匹配项中,?
---可选逗号\1 (\2) :
-从子匹配中组成输出字符串现在尝试ggVG<Leader>d
一次处理整个文件。