vim - 将关键字参数映射到谷歌文档字符串的宏
问题描述
我正在尝试编写我的第一个 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
}
解决方案
所以我认为最简单的方法是定义一个宏
你的意思是正常模式序列。但是有一个问题:您的行可能以“逗号”结尾,也可能不以“逗号”结尾。所以一开始很容易做这样的事情:
nnoremap <Leader>d ^"ayi'$"byBS<C-R>a<Space>(<C-R>b)<Space>:<Esc>
解释:
^
--- 转到第一个非空白字符"ayi'
--- 将关键字拉入 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
一次处理整个文件。
推荐阅读
- javascript - 如何使用 ChartJS 3 的默认动画选项为插件设置动画?
- python-3.x - 为什么我不能乘以范围的特定部分?
- list - 拆分字符串列表并将元素提取到新列表
- r - bigstep 包“maxp>= n 不正确”错误
- azure - Azure ACS - 是否有 REST API 调用通过 groupId 查询以确定调用状态?
- python - 列表本身的索引号可以用作 Python 中的整数吗?
- filter - 从 Firestore 数据库中过滤字符串在 SwiftUI 上发送错误
- c - 使用 C 的 Zlib 和 Gzip:不正确的标头检查 (Z_DATA_ERROR)
- c# - 将 MvxRecyclerView 对象中的 ItemClicked 传递给新视图
- json - Flutter 上的 Json 序列化无法分配给“Map”类型的变量
'