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ください。これを付けるj方がより直感的であることは認めますが、最初のクリアアンドレコード ( ) を覚えやすくするため (また、他のほとんどのキーには既にマクロがオンになっているため) 、私は常にqこのようなファイア アンド フォーゲット マクロに使用します。qqqqq彼ら)。:-)

編集:最後の段落をスクラッチします。狂ったように同じキーを連打するのが好きです。;-)

于 2013-04-17T13:45:05.500 に答える
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
于 2013-04-17T14:34:29.007 に答える
1

ファイルの最後の行が空白の場合は、次を使用できます。

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

以下で構成されています。

ブラケットで始まる行を検索します。

g/^(/

そこから、括弧または空行で始まる次の行まで

,/^(\|^$/

その前の列に戻る

-1                    

これらの行に参加します。

j

一度に 1 つずつ実行する場合は、最初の開いているブラケットと v%j に移動します (ビジュアルに入り、一致するブラケットを選択し、選択したブロックに参加します)。

于 2017-10-13T11:26:12.590 に答える