vim-行を数えずに大きなテキストブロックを削除する方法


193

vimでは、テキストの大きなブロックを削除(またはコピー)することがよくあります。テキストの行を数え、(たとえば)50dd50行を削除するように言うことができます。

しかし、削除する行数を知らなくても、この大きなテキストブロックを削除するにはどうすればよいでしょうか。


1
ウィンドウが十分に大きい場合は、相対行番号がここで役立ちます。ウィンドウの上部にカーソルを置き、削除する最後の行(たとえば、n)の相対行番号を見つけて1行追加し、その番号を入力してから、ddと入力します。例えば、N = 50であれば、その後51dd。または、モーションコマンドを使用します50d<down arrow>
BallpointBen

「相対行番号を見つける」-または、:set rnuVimを使用すると、すぐにこれが実行されます。あなたがいる行には絶対番号が付けられますが、カーソルの上下の行には対称的に1、2、...の番号が付けられます(そしてカーソルの移動、ファイルレベルのイベントなどで更新されます)
John P

回答:


287

私はvimの第一人者ではありませんが、私がこの状況で使用するのは「ビジュアルモード」です。コマンドモードで、「V(大文字)」と入力します。次に、上下に移動して、削除するブロックを強調表示します(通常のすべての移動コマンドが機能します)。次に、xまたはで削除しdます。


2
奇妙な。ここではLinux(vim 7.3.50)とWindowsのgVimで動作することを知っています。そして、他の答えで判断すると、他の人のために働きます。多分あなたのいくつかの設定が.vimrcそれを機能させていますか?
マット

OK、私はあなたが使用して視線モードに入ることができることを認識していなかったいくつかの理由Shift- v...私が使用しようとしていたCTRLだけでなくとしてキーを。したがって、これは機能し、おそらく最も便利な方法です。
ジャスティンエティエ2011年

7
ビジュアルモード(CTRL- v)とビジュアルブロック(Shift- v)の2つのビジュアルモードがあることを明確にしたい場合があります。
Justin Ethier 2011年

2
私はこれをたくさんします。しかし、私は常にそれが不正行為であり、理想的とは言えないvimだと考えています。
ジム・ミッチェナー、2011年

9
実際には3つのビジュアルモードがあります。ビジュアルモード(文字ベースの{v})、ビジュアルラインモード(ラインベースの{Sv})、およびビジュアルブロックモード(ブロックの選択を許可{Cv})
Tom Regner

293

開始行に移動して、ma「a」と入力します。次に、最後の行に移動して入力しますd'a(削除して「a」をマークします)。

これにより、現在の行からマークされた行まで(すべて)のすべての行が削除されます。それはまたと互換性がありますviだけでなく、vimあなたの環境が後者に恵まれていないことをオフのチャンスに、。


3
このすごい岩!より良い解決策を探す前に、何かを(ラインを数えるなど)何時間だけやるのが嫌いです。ありがとう!
ryanjdillon 2013

1
本当に素晴らしい私は常にブロックを削除するためにビジュアルモードを使用していますが、この方法の方が+1です
hish

4
これは、500k +行を削除するためのビジュアルモードよりも便利だと感じました
Michael-Where's Clay Shirky

本当に実用的な答え。私はそれを使用して、サーバー内のメールをファイル/var/mail/usernameから一括で削除し、最後のメールをそのまま残しています。マークを付けてから、たとえば50.000行に移動するために50000続けて入力しgg、その間のすべての行を削除します。魅力のように動作します!
otmezger 2015

1
@horta、vimギガバイトファイルを編集するためのツールとしてはおそらく使用しません- awkとその兄弟のようなテキスト処理ツールを選ぶ傾向があります:-)
paxdiablo

46

あなたは、(いくつかのコマンドも削除オプションで使用可能です)また、ビジュアルモードを使用することができ vip vap、段落を選択するために、v2ap2つの段落の選択し dap、作品をd2apも。の[ ]ようなブロック内で削除できますda[

参考までに:オブジェクトのタイプ。vimドキュメントから:セクション4。 4。http //vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [、da {、da "はすべてプログラマーにとって便利です
Rene Wooller、2015

1
ありがとう!dap「段落を削除する」と覚えておくのはとても簡単です
Tropilio

38

ここにはもっと良い答えがたくさんありますが、完全を期すために、上記のすばらしい答えのいくつかを読む前に、私が使用していた方法について触れておきます。

24-39行目から削除したいとします。あなたはexコマンドを使うことができます

:24,39d

を使用して行をヤンクすることもできます

:24,39y

そして、24〜39行目を見つけて置き換えます

:24,39s/find/replace/g

11

行番号をオンにすると、現在の位置から行NNを削除set numberできますdNNG。したがって、削除したい行の先頭に移動し、それを単にd50G削除したい最後の行であると想定することができます。


10

ある程度は、その大きなブロックが何であるかによって異なります。たぶんあなたはそれdipを行うだろう場合に段落を削除することを意味するだけです。


先端をありがとう。残念ながら私はここでコードを扱っており、通常はそれよりも細かい制御が必要です。
ジャスティンエティエ2011年

1
私もコードを使用しており、論理ブロックを空の行で区切っています。このヒントはちょうど私の日を作りました。3つのキーストロークで大きなロジックブロックを削除できるようになりました。
miniml

'd'は削除を意味し、このコンテキストの 'p'は段落を意味するため機能します
user98761

7

いくつかの可能性がありますが、最適なのは作業するテキストによって異なります。

2つの可能性が思い浮かびます。

  • ビジュアルモードに切り替えます(VS-V、...)、カーソル移動やプレスでテキストを選択しますd
  • 段落全体を削除するには: dap

私はそれについて知っていて、ディスとディップよりもdapを頻繁に使用していますが、それは常にブロックとブロックの後に続く空白行を削除しますが、ブロックと空白行を削除する方法でしたその前に来る?
Funkodebat 2013年

段落のあるテキストの途中で、結果に構文上の違いはありませんか?もしあれば、新しい質問で例を挙げて、あなたが望むものを書くことをお勧めします。
Tom Regner 2013年

6

ブロック全体が画面に表示されている場合は、relativenumber設定を使用できます。:help relativenumberを参照してください。7.3で利用可能


私はそれが使い始めるまで、se rnuがどれほど便利であるかを理解していませんでした-50ddとナビゲーション50jを知るのに最適
rshdev '20

3

カーソルをブロックの最初または最後に置いて、ビジュアルモード(shift-v)に入ることができます。次に、目的のブロックが強調表示されるまで上下に移動します。最後に、yを押してテキストをコピーするか、dを押してテキストを切り取ります。


奇妙かもしれませんが、これから私は行のある中点からテキストを選択し、同じ行で各行の終わりまで下にある複数の行を選択する方法を見つけました。まさに私が探していたもの。
nanker 2014年

3

ここで既に説明した他のモーションに加えて、/{pattern}<CR>モーションもあるので、fooを含む行を削除したい場合は、を実行できますdV/foo<CR>Vこれは、デフォルトで/は文字単位であるため、行単位でモーションを強制するためのものです。


3

行を数えるのは面倒すぎますが、「段落」を数えるのはそれほど悪くありません。'{'と '}'は、それぞれカーソルの前後の最初の空行にカーソルを移動します。カーソル移動操作は削除と組み合わせることができ、他のいくつかの回答は同様のアプローチを使用しています(行にはdd、ドキュメントの末尾にはdGなど)
。次に例を示します。

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

カーソルがコメントブロックの上から始まる場合、 'd}'はコメントブロックを削除し、 'd2}'はコメントブロックとコードブロックの両方を削除します。カーソルがコードブロックの下から始まる場合、 'd {'はコードを削除し、 'd2 {'は両方を削除します。もちろん、最初にカーソルを移動することで、1つのブロックをスキップできます: '{d {'または '} d}'。

空白と一貫性がある場合、または段落を一目で数えることができる場合、これはうまくいくはずです。興味があれば、Vimのヘルプファイルにカーソルトリックがあります。


1

非常に大きな数値を入力してdd、カーソルの下にあるすべての行を削除する場合は、を押すこともできます。


デフォルトでは最終行に移動するためdG、ドキュメントの最後まで削除するを使用する方が簡単かもしれませんG
andyg0808 2014年

1

テキストのブロックを削除する

カーソルがブロックの先頭にあると仮定します。

V/^$<CR>d (where <CR> is the enter/return key)

説明

  • 「linewise-visual」モードに入ります: V
  • 次の空の行まで強調表示します。 /^$<CR>
  • 削除: d

キーバインド

より堅牢なソリューション:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

説明

  • 検索の折り返しを無効にする: :set nowrapscan
  • Dキーを再マッピングします(次のコマンドに)::nnoremap D
  • 「linewise-visual」モードに入ります: V
  • 次の空/空白行またはEOFまで強調表示します。 /^\s*$\\|\%$<CR>
  • 削除: d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.