Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配支架的vim连接线_Vim - Fatal编程技术网

匹配支架的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答案中的单行问题

逐步:

  • qqq
    清除“q”宏(避免与以前的宏定义混淆)
  • 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