10

次のドキュメントを編集しているとします (* = カーソル):

Lions
Tigers


Kittens
Puppies


*


  Humans

周囲の空白を削除するために使用できるシーケンスは次のとおりです。

Lions
Tigers


Kittens
Puppies
*
  Humans

注:この正確なケースだけでなく、任意の数の空行を処理する答えを探しています。

EDIT 1:行番号が不明で、カーソルが入っているスパンのみに影響を与えたい.

EDIT 2:エッジの先頭の空白を保持する必要があることを示す編集済みの例

ありがとう

4

6 に答える 6

11

簡単。通常モードでは、dipO<Esc>それを行う必要があります。

説明:

  • dip空白行でそれと隣接するすべての空白行を削除します。
  • O<Esc>新しい空の行を開き、通常モードに戻ります。

cip<Esc>@Lorkenpeist で提案されているように、さらに簡潔にすると、これらの 2 つのステップを 1 つにまとめることができます。

于 2013-03-12T20:10:27.020 に答える
7

考えられる解決策は:join、範囲を指定してコマンドを使用することです。

:?.?+1,/./-1join!

説明:

  • [range]join!行を結合し[range]ます。!余計なスペースを入れない手段。
  • 開始点は、最初の文字まで逆方向に検索し、次に 1 行下に検索することです。?.?+1
  • 1in+1が想定できるので、これは省略できます。?.?+
  • 終点は、次の文字を順方向に検索し、次に 1 行上を検索することです。/./-1
  • 前と同じように1想定できるので、/./-
  • 同じパターンを前方検索のみに使用しているため、パターンは省略できます。//-
  • コマンドは次の:joinように短縮できます:j

最終的な短縮コマンド:

:?.?+,//-j!

便利な関連コマンドを次に示します。

1) 空行をすべて削除するには:

  • :g/^$/d
  • :v/./d

2) すべての空行を 1 つの空行に絞り込みます。

  • :v/./,//-j

詳細については、次を参照してください。

:h :j
:h [range]
:h :g
:h :v
于 2013-03-12T19:13:55.307 に答える
3

簡潔な答え: ()V)kc<esc>

通常モードでは、入力()するとカーソルが最初の空白行に移動します。 (カーソルを非空白行の前のブロックの先頭に)移動し、カーソルを末尾 (具体的には、そのブロックの後の最初の空白行) に移動します。d)次に、次の非空白行の先頭までのすべてのテキストをシンプルに削除します。したがって、完全なシーケンスは()d).

編集:そうです、次の非空白行の先頭にある空白を削除します。d)試してみる代わりにV)kdVビジュアル ライン モードに入り)、最初の非空白行にジャンプし (行頭の空白をスキップします)、kカーソルを 1 行上に移動します。この時点ですべての空白行を選択したのでd、選択を削除します。

最後に、O(大文字の O) と入力してからエスケープし、新しい空白行を作成して、削除した行を置き換えます。dO<Escape>あるいは、 with を置き換えるとc<Escape>、キーストロークが 1 つ少なくても同じことが行われるため、シーケンス全体は()V)kc<Esc>.

于 2013-03-12T18:41:29.900 に答える
1

更新された質問の後、これらの回答は無関係です。

これはあなたが聞きたい答えではないかもしれませんが、範囲を利用します。最初の空行 (たとえば 55 としましょう) と最後から 2 番目の空行 (おそらく 67) の行番号を見てください。次に、実行します:55,67d

または、ファイル全体に 1 行だけ空行が必要な場合もあります。その場合、1 つまたは複数の空行の出現に一致させ、それらを 1 つの空行に置き換えることができます。

:%s/\(^$\n\)\+/\r/

この答えは機能します:

通常モードを使用したいだけの場合は、何かがある最後の行を検索できます。例えば、

/.<Enter>kkVNjd
于 2013-03-12T18:30:17.850 に答える
1

私はあまりテストしませんでしたが、あなたの例ではうまくいくはずです。もっとエレガントな解決策があるかもしれません。

function! DelWrapLines()
    while match(getline('.'),'^\s*$')>=0
        exe 'normal kJ'
    endwhile
    exe 'silent +|+,/./-1d|noh'
    exe 'normal k'
endfunction

それをソースして試してください:call DelWrapLines()

于 2013-03-12T18:55:23.620 に答える
0

この質問は既に解決済みですが、「sed & awk, 2nd Ed.」で優れた解決策を見つけました。(O'Reilly) 共有する価値があると思いました。vim はまったく使用せず、代わりに sed を使用します。このスクリプトは、1 つまたは複数の空白行 (これらの行に空白がないと仮定) のすべてのインスタンスを単一の空白行に置き換えます。コマンドラインで:

sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile

sed は実際にファイルを編集するのではなく、編集した行を標準出力に出力することに注意してください。この入力をファイルにリダイレクトできます。

sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile > tempfile

ただし、 に直接書き込もうとするとmyfile、ファイルの内容全体が削除されるだけであり、これは明らかに望んでいるものではありません。出力を に書き込んだ後tempfile、ただただmv tempfile myfile! 複数の空白行のすべてのインスタンスは、単一の空白行に置き換えられます。

さらに良い:

cat -s myfile > temp
mv temp myfile

猫ってすごいですよね?

最高:

vim 内で実行する場合は、vim 内の行の範囲でシェル コマンドを実行する vim の便利な機能を使用して、複数の空白行のすべてのインスタンスを 1 つの空白行に置き換えることができます。

:%!cat -s

それだけで、ファイル全体が再フォーマットされます。

于 2013-04-06T03:43:58.257 に答える