11

vim でブロック選択を使用して行末から削除しようとすると、異常な動作が発生します。

だから私はそのようなテキストを持っているとしましょう:

delete this char:x
and this:x
also this:x
and then this:x
lastly this:x

yすべての行に追加したい場合は、次のことができます。

  • でブロック選択を開始C-v
  • ですべての行を選択します4j
  • で行末に移動$
  • で追加を開始A
  • 目的のテキストを入力しますy

取得するために:

delete this char:xy
and this:xy
also this:xy
and then this:xy
lastly this:xy

しかし、追加する代わりに最後のステップで削除しようとするxと、次のようになると予想されます。

delete this char:
and this:
also this:
and then this:
lastly this:

私は結局:

delete this char:
and this:x:
also this:x:
and then this:x:
lastly this:x:

私が理解している限りでは、最初の行の最後の文字を他のすべての行に追加し:ます (この場合は )。欠落している行 (この場合は ) を削除するのではありませxん。

マクロや代用物を使ってこれを行うことができますが、そのような動作の背後にある理論的根拠はよくわかりません。ブロック選択でこれを行う方法はありますか?

4

4 に答える 4

11

試しました:{range}normalか?これはうまくいくはずです:

:'<,'>normal $x

('<,'>入力すると、ビットが自動的に入力されます:。)

于 2013-01-05T02:27:46.487 に答える
6

$ C-v 4j x

  1. 行末に移動$
  2. ビジュアルブロックを切り替えるC-v
  3. 降りる(あなたの場合は4倍)4j
  4. そのようなものを削除しますx

編集:(任意のインデントについてコメントに反応する)

それは単純なマクロで行うことができます。マクロはあなたが考えることができるほど難しくはありません:

  1. マクロの記録を開始します。名前を「a」にします。qa
  2. 行末に移動$
  3. 1文字削除x
  4. で一行下がるj
  5. マクロを終了しますq

次に、マクロを適用します20@a。-マクロを記録しているときに行ったのと同じ20倍の処理を行います。

于 2013-01-04T22:21:52.487 に答える
2

あなたが自分で言ったように、目標を達成するには他の方法があり、実際にはもっと良い方法があります。:sまたはq(macro)または:g/.../norm $x. :s/.$//gは非常に簡単です。

Ctrl-V は、このジョブには適していません。その名はビジュアルブロック。最後の x を削除したいのですが、それら (x のみ) がブロック内にありません。

ただし、本当に ctrl-v を使い続けたい場合は、ブロック内の「x」を作成するために、いくつかの追加作業を行う必要があります。Align プラグインがインストールされている場合は、次のことができます。

Vトリックを実行するすべての行を選択 ( ) し、

<leader>t:

次に、テキストは次のようになります。

delete this char : x
and this         : x
also this        : x
and then this    : x
lastly this      : x

Ctrl-Vx を削除するには、その方法を知っておく必要があります。

それから

:%s/ *:/:/g

「:」の前に埋め込まれたスペースを削除するには

しかし、私はそれが良い方法だとは思いません。

于 2013-01-05T00:26:43.397 に答える