匹配支架的vim连接线
我有一个工具可以产生这样的输出-匹配支架的vim连接线,vim,Vim,我有一个工具可以产生这样的输出- (check (= Start (+ (if (<= takeA giveA) 0 1) (if (<= takeB giveB) 0 1) (if (<= takeC giveC) 0 1) (if (<= takeD giveD) 0 1)))) (check (and (>= takenBefore_A 0) (<= takenBefore_A 4))) (check (and
(check (= Start
(+ (if (<= takeA giveA) 0 1)
(if (<= takeB giveB) 0 1)
(if (<= takeC giveC) 0 1)
(if (<= takeD giveD) 0 1))))
(check (and (>= takenBefore_A 0) (<= takenBefore_A 4)))
(check (and (>= givenBefore_A 0) (<= givenBefore_A 4)))
(check (= risk_A
(+ Start 1 (- takenBefore_A givenBefore_A))))
(check (= takenBefore_A
(+ (if (<= takeB takeA) 1 0)
(if (<= takeC takeA) 1 0)
(if (<= takeD takeA) 1 0))))
(check (= givenBefore_A
(+ (if (<= giveA takeA) 1 0)
(if (<= giveB takeA) 1 0)
(if (<= giveC takeA) 1 0)
(if (<= giveD takeA) 1 0))))
(check (and (>= takenBefore_B 0) (<= takenBefore_B 4)))
(check (and (>= givenBefore_B 0) (<= givenBefore_B 4)))
(check (= risk_B
(+ Start 1 (- takenBefore_B givenBefore_B))))
(check (= takenBefore_B
(+ (if (<= takeA takeB) 1 0)
(if (<= takeC takeB) 1 0)
(if (<= takeD takeB) 1 0))))
(check (= givenBefore_B
(+ (if (<= giveA takeB) 1 0)
(if (<= giveB takeB) 1 0)
(if (<= giveC takeB) 1 0)
(if (<= giveD takeB) 1 0))))
(check (and (>= takenBefore_C 0) (<= takenBefore_C 4)))
(check (and (>= givenBefore_C 0) (<= givenBefore_C 4)))
(check (= risk_C
(+ Start 1 (- takenBefore_C givenBefore_C))))
(check (= Start (+ (if (<= takeA giveA) 0 1) (if (<= takeB giveB) 0 1) (if (<= takeC giveC) 0 1) (if (<= takeD giveD) 0 1))))
(check (and (>= takenBefore_A 0) (<= takenBefore_A 4)))
(check (and (>= givenBefore_A 0) (<= givenBefore_A 4)))
(check (= risk_A (+ Start 1 (- takenBefore_A givenBefore_A))))
(check (= takenBefore_A (+ (if (<= takeB takeA) 1 0) (if (<= takeC takeA) 1 0) (if (<= takeD takeA) 1 0))))
(check (= givenBefore_A (+ (if (<= giveA takeA) 1 0) (if (<= giveB takeA) 1 0) (if (<= giveC takeA) 1 0) (if (<= giveD takeA) 1 0))))
(check (and (>= takenBefore_B 0) (<= takenBefore_B 4)))
(check (and (>= givenBefore_B 0) (<= givenBefore_B 4)))
(check (= risk_B (+ Start 1 (- takenBefore_B givenBefore_B))))
(check (= takenBefore_B (+ (if (<= takeA takeB) 1 0) (if (<= takeC takeB) 1 0) (if (<= takeD takeB) 1 0))))
(check (= givenBefore_B (+ (if (<= giveA takeB) 1 0) (if (<= giveB takeB) 1 0) (if (<= giveC takeB) 1 0) (if (<= giveD takeB) 1 0))))
(check (and (>= takenBefore_C 0) (<= takenBefore_C 4)))
(check (and (>= givenBefore_C 0) (<= givenBefore_C 4)))
(check (= risk_C (+ Start 1 (- takenBefore_C givenBefore_C))))
我想知道,我是否可以自动完成这项工作,而不是手动完成。
这里的关键点是,在每一行上,打开的括号数将等于关闭的括号数。这将是使用宏执行此操作的一种方法:
qjo<ESC>k0v%Jjq100@j
Q0V%Jjq100@j
这里的基本思想是,您可以使用v%J
选择并连接(…)
区域中的所有行。唯一需要注意的是,它不适用于单行语句,因此我们确保始终添加额外的一行(o
)。最后,我们将其全部封装在一个宏中,它可以正常工作 我的看法:
qqqqqv%:join
j@qq@q
使用join
而不是J
解决了Daan答案中的单行问题
逐步:
清除“q”宏(避免与以前的宏定义混淆)qqq
开始录制q
声明我们正在录制的是“q”宏q
用于视觉标记v
跳转到匹配的大括号%
用于命令模式,作用于当前标记的区域:
(加回车)用于连接行join
向下一行j
调用“q”宏(递归)(如果我们没有先清除它,我们会在这里调用旧定义,这不是我们想要的)@q
结束录制q
执行宏,宏将在文件末尾停止(当@q
移动错误时)j
q
。我承认把它放在j
上会更直观,但我总是使用q
来触发并忘记这样的宏,因为它使初始值清晰,并且记录(qqqq
)很容易记住(因为大多数其他键上都已经有宏了)。:-)
编辑:划掉最后一段。我只是喜欢像疯子一样反复敲打同一把钥匙 我认为这条
:s
行适合您:
:%s/\v\n\s+(\()/\1/
同样对于你问题中的例子,这也很有效。。(但将第1行留空)
编辑
刚才我没有把1d
放在那里。现在是:
如果要删除第一个空行,请尝试以下操作:
:%j|s/(check/\r&/g|1d
EDIT2
感谢Nikita Kouevda指出空白问题。还有修复(见下面的注释)我忽略了由:join创建的空间
我将添加另一条短线,这也很有效,而不必担心空间:
:g/^(/.,/\n\ze(\|\%$/j
如果文件的最后一行为空,则可以使用:
:g/^(/,/^(\|^$/-1j
由以下部分组成:
搜索以括号开头的行:
g/^(/
从那里到以括号或空行开始的下一行
,/^(\|^$/
回到前面的队伍
-1
加入这些行列:
j
如果您想一次做一个,请转到第一个打开的括号和v%j(输入visual,选择匹配的括号,加入选定的块)关于
:join
的好消息!我有以下映射:mapq@j
有时自己也会敲打qq.:)第一次替换并不能消除多余的空白。我怎么能忽略这一点,因为您的join and replacement方法非常好。@Peter使用:%s/\n\s\+(/(/
)折叠空格。@Kent反向查找可以避免空行(例如:%s/^@),但每行仍然有尾随空格。我相信:%s/\((检查\)/\r\1/g
解决了这两个问题。第1行:我放置了分组(
放在错误的地方。+
之后将跳过所有空格。@NikitaKouevda thx。我原以为管道会指向1d
。但我没有放在那里,因为重点是j和s
。你的后面看也行。@NikitaKouevda注意到你的空格注释。:j
将删除空格,除非你发出砰[!]
-1
j