vim连接线以匹配括号

时间:2013-04-17 13:21:42

标签: 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 (>= 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))))

我在VIM中使用了以下命令来生成必要的输出,具体取决于我想要加入的行数 -

:.,+3join

我想知道,如果我可以自动执行此操作而不是手动执行此操作。 这里的关键点是,在每一行上,打开的括号数将等于关闭的括号数。

4 个答案:

答案 0 :(得分:7)

我的看法:

 qqqqqv%:join
 j@qq@q

使用join代替J解决了Daan答案中的单行问题。

一步一步:

  • qqq清除'q'宏(以避免与之前的宏定义纠缠在一起)
  • q开始录制
  • q表示这是我们正在录制的'q'宏
  • v用于视觉标记
  • %跳转到匹配的大括号
  • :用于命令模式,作用于当前标记的区域
  • 加入行
  • join(加上ENTER)
  • j向下一行
  • @q调用'q'宏(递归)(如果我们先没有清除它,我们会在这里调用旧的定义,这不是我们想要的)
  • q结束录制
  • @q执行宏,该宏将在文件结束处停止(当j移动错误时)

请原谅q的丰富内容。我承认把这个放在j会更直观,但我总是使用q这样的即发即弃宏,因为它会使初始清晰记录(qqqqq )这么容易记住(因为大多数其他键已经有了宏)。 : - )

修改:抓一个最后一段。我喜欢像疯子一样反复敲击同一把钥匙。 ; - )

答案 1 :(得分:3)

我认为这条:s行对您有用:

:%s/\v\n\s+(\()/\1/

对于你问题中的例子,这也有效..(但是将第1行留空)

:%j|s/(check/\r&/g   

修改

刚才我没有把1d放在那里。现在它来了:

如果你想删除第一个空行,试试这个:

:%j|s/(check/\r&/g|1d

<强> EDIT2

感谢Nikita Kouevda指出了空白问题。还有修复(见下面的评论)我只是忽略了创建的空间:join。

我会添加另一条短线,也可以使用,不用担心空格:

:g/^(/.,/\n\ze(\|\%$/j

答案 2 :(得分:2)

这是使用宏来实现它的一种方法:

qjo<ESC>k0v%Jjq100@j

这里的基本想法是,您可以使用v%J选择并加入(...)区域中的所有行。唯一需要注意的是,它不适用于单行语句,因此我们确保始终添加一行(o<ESC>)。最后,我们将它全部包装在一个宏中,它可以工作!

答案 3 :(得分:1)

如果文件的最后一行是空白,则可以使用:

:g/^(/,/^(\|^$/-1j

由以下内容组成:

搜索以括号开头的行:

g/^(/

从那里到以支架或空行开头的下一行

,/^(\|^$/

回到之前的那一行

-1                    

加入这些行:

j

如果你想一次做一个,那么转到第一个开放式括号和v%j(输入视觉,选择匹配括号,加入选定的块)