2

これは、ファイル内の 2 行ごとの削除に関する質問の続きです。

Vimでそれを行う方法:

前:

aaa
bbb
ccc
ddd
eee
fff

(たとえば、視覚的な選択の一部です。)

後:

aaa
ccc
eee
bbb
ddd
fff

このマクロ スタイルを行うにはどうすればよいですか (1 行おきに削除しますが、削除された行が順番に貼り付けられるように、削除された行をバッファに保存します)。

また、視覚的な選択でこれを行うことができれば、(特定のファイルを解析するために) 本当に便利です!

4

4 に答える 4

3

1. 並べ替える行がバッファに存在する唯一の行である場合、コマンドを使用できます

:g/^/+m$

2. 一般に、これらの行が他のテキストで囲まれている場合は、並べ替える行のターゲット範囲を選択してから実行することができます。

:exe"'<,'>g/^/+m"line("'>")

または、最初の行を除いて並べ替えるすべての行を選択してから実行します

:'<,'>-g/^/+m'<-

代わりは。いずれの場合も、並べ替えは1回の実行で効率的に実行されます。

于 2012-07-06T13:15:32.193 に答える
2
  1. 入力:let @e=''<CR>してレジスタを空にeします (以前の内容は気にしないと仮定します)。

  2. にカーソルを合わせますaaa

  3. qa(または の代わりに任意の文字)を入力aして、マクロを記録します。

  4. 1 行下に入力j"Eddし、レジスタに追加しながら削除しeます。

  5. 入力qして録音を停止します

  6. 全体を視覚的に選択します。

  7. でマクロを適用すると:'<,'>norm @a<CR>、1 行おきに削除されます。

  8. タイプし"epます。

于 2012-07-06T06:10:12.473 に答える
2

そのためのマクロは本当に必要ありません。

結果を格納するための一時的なレジスタ、たとえば register が必要ですe( romainl によって提案されています)。

  1. レジスターを空にします (大文字のレジスター名を使用するため、上書きではなく追加を意味するため、レジスターは空でなければなりません)
    :let @e=''ENTER
  2. 作業する領域を視覚的に選択します (つまり、 をaaa通る線fff)
  3. 1 行おきに削除し、その行を register に追加しますe:
    :g/^/+d E
    これで、 registereは削除されたコンテンツを保持します
  4. eを使用して必要な場所にレジスタを貼り付けます"ep

討論

  • 大文字のレジスタ名を使用しているため、使用する前にレジスタを空にする必要があります。これは、レジスタに追加することを意味します (セクション名前付きレジスタを参照してください:he registers) 。

  • go と入力:he :globalして、信じられないほど強力な:gコマンドについて詳しく学びましょう:v

  • 実際の回答の 99% は、残念ながら受け入れられていませんが、参照されている質問に対する優れた回答で既にカバーされています。必要な唯一の拡張機能は、削除された行を捨てるのではなく蓄積することです (正確には、最後に削除された行をデフォルト レジスタに格納します)。

于 2012-07-06T06:32:33.337 に答える
2

このコマンドを試してください:

:'<,'>g/^/+m$

それらをファイルの最後に移動します。その後、簡単に元に戻すことができます。

于 2012-07-06T07:12:02.783 に答える