vim - Vim 拆分函数参数
问题描述
我发现我经常做重构:
def function(param1, param2, (...), paramK):
至
def function(
param1,
param2,
(...),
paramK,
):
并尝试为其编写映射。我从
command! Split normal! qqqf(a<cr><esc>qqf s<cr><esc>@qq@qf)i<cr><esc>
qqq - reset content of macro q.
f(a<cr><esc> - find bracket, make newline and return to normal mode.
qq - start to record macro q.
f s<cr><esc> - change space to newline.
@q - run macro recursively.
q@q - end recording and run.
f)i<cr><esc> - add last newline before closing bracket.
我的想法是,该宏在找不到空间时会失败,但这是有问题的。它提出了一些问题。
1)如何检查某些动作是否成功?例如如何检查当前行是否有空格?
2)有更好的主意来实现我想要的吗?也许是一些插件或清除功能?
3)我的想法有什么问题?当我手动运行这个组合时,它可以工作,但是在调用 :Split 时它不会。
解决方案
关于为什么它不像手动键入时那样工作:
当你输入 时normal! <esc>
,Vim 将其解析为“输入字母<
, e
, s
, c
, >
”。您可能可以通过键入在其中插入文字转义键<c-v><esc>
,但这在配置中可能看起来有点奇怪。相反,更好的方法是使用:exe
命令 ( :help :exe
):
exe "normal! \<esc>"
被字符串\<esc>
插值成为文字转义键。因此,将转换为使用您正在寻找的键的调用。你也需要以同样的方式逃脱。我也会使用而不是,我不完全确定正常空间是否可以在这里工作。在那之后,希望您得到与手动键入时相同的结果。exe "normal! ..."
normal!
<cr>
\<space>
至于您要解决的实际问题,我确实有一个插件:splitjoin。默认情况下,它会像这样拆分您的示例:
def function(param1,
param2,
(...),
paramK):
pass
但是您可以更改设置以根据自己的喜好进行调整。或者,从 Jordan Running 的链接中,您似乎也可以使用argwrap插件,这对于特别是参数拆分可能更可靠(splitjoin 处理更广泛的情况,但可能对参数没有那么好?不确定.)
推荐阅读
- c# - C# - 多线程 TCP 服务器/客户端
- apache-spark - 火花读取具有特定列的兽人
- sql - 查询其他 shema syscolumns 表
- vim - 在 vimrc 中设置拼写异常
- sql - SQL 语句。如果一个或多个条件为真,则返回行
- java - @EnableJpaAuditing 和 LocalSessionFactoryBean
- python - 为什么 Numba pycc 编译会中止?
- ios - 无法登录 StackOverflow iOS 应用
- android - RxJava - 将列表的结果映射到另一个列表
- python - UltiSnips 生成带有固定大小框环绕文本的 python 文档字符串