5

我有一个工具可以产生这样的输出 -

(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

4 回答 4

8

我的看法:

 qqqqqv%:join
 j@qq@q

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

一步步:

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

q原谅's的丰富。我承认戴上它j会更直观,但我总是使用q这样的即发即弃宏,因为它使最初的 clear-and-record ( qqqqq) 很容易记住(而且因为大多数其他键已经有宏他们)。:-)

编辑:划掉最后一段。我就像疯子一样反复敲击同一个键。;-)

于 2013-04-17T13:45:05.500 回答
3

这将是使用宏的一种方法:

qjo<ESC>k0v%Jjq100@j

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

于 2013-04-17T13:34:25.177 回答
3

我认为这:s条线对你有用:

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

同样对于您问题中的示例,这也有效..(但将第一行留空)

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

编辑

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

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

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

编辑2

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

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

:g/^(/.,/\n\ze(\|\%$/j
于 2013-04-17T14:34:29.007 回答
1

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

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

它由以下部分组成:

搜索以括号开头的行:

g/^(/

从那里到以括号或空行开头的下一行

,/^(\|^$/

回到之前的那一行

-1                    

加入这些行:

j

如果你想一次做一个然后去第一个开括号和 v%j (输入视觉,选择匹配的括号,加入选定的块)

于 2017-10-13T11:26:12.590 回答