行を数えずにテキストの大きなブロックを削除するにはどうすればよいですか?


91

vimでは、大きなテキストブロックを削除するか、ヤンク/プットする必要があります。

テキストの行を数えて、50dd50行を削除するようなものを入力できます。

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


4
終わりがどこにあるかをどのように知っていますか?終了を説明できる場合は、その時点まで削除できます。move最後までできることを説明できれば。その後、最後まで削除することは、最後まで移動することと同じです。
マーティンヨーク

@Loki、最後に移動するのは通常、ページダウンと矢印キーを使用して、そこに到達するまでです。それができることは、第一又は第十の空白行であってもよい第一の閉じ括弧です。一番下の行は、かなり異なります。

2
この回答も確認してください:stackoverflow.com/a/16407391/164835-
ケント

回答:


111

ブロックの開始行に移動し、タイプしますma(マーク「a」。もちろん、異なる文字を使用できます。また、異なる文字に複数の文字を使用することもできます。 。

次に、最後の行に移動して、d'a(「a」をマークするにはdelete)またはy'a(「a」をマークするにはヤンク)(a)と入力します。

これにより、現在の行からマークされた行までのすべての行が削除/ヤンクされます(包括的)。

その後、pまたはなどの通常の貼り付けコマンドを使用して、別の場所に貼り付けることができますP

あなたの環境が後者に恵まれないという偶然の機会に、viと同様に互換性vimがあります。


(a)たとえば、呼び出したい関数の定義をコピーして貼り付けるなど、他の場所を探す必要がある場合、これを使用してファイル内の場所を保存します。

同じ方法で現在の行をマークするだけで、ma探しているものを見つけるためにさまよいます。

それを見つけてレジスタにコピーしたら、'a前に保存した行「a」に戻って貼り付けます。


9
これには視覚モードを使用することもできますよね?
jmc

3
これはjmc の1つの方法ですが、標準の viに視覚モードがあるかどうかはわかりません。

5
約1年前に視覚選択からマーキングと相対行番号に移行してから、viモーションコマンドは視覚選択よりもはるかに高速で効率的であることがわかりました。キーを押すたびに後者の方簡単になりますが、v本当に必要なのか、それともより良いモーション方法があるのか​​を自問します。
スキマスイッチ

1
ええ、同じように、@ Sukimaは、GUIを使用していても、マウスを使用するほど効率が良くなるのは興味深いことです。キーボードにとどまることができれば、自分のほうが速くなります。

3
本当に長い行で何かを編集する場合、これのバックティックバージョンも非常に便利になるかもしれません(行全体ではなく、行内の場所を参照します)。
msouth

65

Vimでは、ビジュアルラインモードを使用します

  1. 削除するテキスト/コードのブロックの一番上の行にカーソルを置きます
  2. プレスV(大文字の「V」:Shift+ v
  3. 削除するテキスト/コードのブロックの一番下にカーソルを移動します
  4. 押す d

テキストの大きなブロックを削除する場合は、カーソルがどの列にあるかを心配する必要がないため、単純な視覚モードよりもこの方法をお勧めします。


3
手順3では、オブジェクトの動きを使用してより速く移動できます。たとえば}、段落全体または)文を選択するために使用できます。さらに、それらについて読むことができます:h object-motions
mxlian

2
またとサブを検索すると/something<CR>、あなたの選択ブロックの最後に到達するための非常に効率的な方法である
mxlian

1
これは私の好みの方法です。ただし、代わりに繰り返し押しjてカーソルを下に移動する必要はなく(手順3)、行番号Gを入力してから、その行まで選択することもできます。例:V150Gd
ランヒルジュードクーレイ


39

構造がわかっている大きなテキストブロックを簡単に削除できます。

段落の場合は、次を使用しますd{(たとえば、段落の数でプレフィックスを付けることができます)

括弧内のコードブロックの場合は、次を使用します。 d%

ファイルの最後までテキストが表示される場合は、次を使用します。 dG

終了方法がわかっている場合は、:d/を使用し、終了テキストの後に続けて入力しますEnter(正規表現も使用できるため、可能性は無限です)。

または、ビジュアルモード(V)を使用し、モーションキーを使用してテキストをすばやく選択し(byなど{)、削除します(d)。

または、Lie Ryanが提案したように、d/search-string/e現在のカーソルから検索された文字列までのテキストを削除するために使用します。

参照::help dおよび:help motion詳細については。


2
またd/search-string/e、現在のカーソルから検索文字列自体を含む検索文字列の最後までc/search-query削除し、削除後に挿入モードになります。d/with を使用するset incsearchと、適切なテキスト範囲で操作しているかどうかを対話式に把握でき、検索クエリの入力を停止して必要以上の入力を避けることができるため、適切な組み合わせです。
ライライアン

4
またda(外部)またはi(内部)とオブジェクト指定子を使用すると非常に便利です。以下のようなオブジェクトwの単語のために、p段落のための、(またはbのために(...)[のために[...]{またはBのため{...}などのビジュアル・オペレータのためのドキュメント
シャーバズ

22

モーションやテキストオブジェクトを使用できます。たとえば、を使用して、カーソルから次の空白行までをすべて削除できますd}。カーソルが段落内にある場合、段落はdipまたはで削除できますdap。カーソルがHTMLタグ内にある場合は、ditまたはで削除できますdat

これらのニーモニックは、「d elete i nside」と「d elete a round」(段落/タグ/括弧)です。


11

私は通常やる

:<start>,<end>d

指定された行を含む、指定された開始行番号と終了行番号の間のすべての行が削除されます。

startおよびの両方endが、絶対行番号、パターン、または別の位置からのオフセットであることに注意してください。

また、Vimの範囲ドキュメントの表示に関するdoubleDownのコメントも参照してください。有用なヒントがあります。

例:

次のファイルがあるとします。

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

次に、コマンドを使用する:2,3d:/fox/,/over/d:/quick/+1,/lazy/-1or またはor を使用する:+1,+2dと、最初の行にいる場合:-1,.d、または3行目にいる場合は、次のようになります。

1. The quick brown
4. lazy dog.

しかし、これはまだ行を数える必要があるということですか?または、あなたの答えを誤解しましたか?
マーティントゥールノイジ

7
行を数える必要はありませんが、行番号を知る必要があります。
jmc

まずない:set rulerし、見つけるために、テキストの上&下に移動startし、end行番号、そしてやる:<start>,<end>d
roblogic

1
また、相対行番号を使用することができます:+12,+24d
rpattabi

2
実際には、あなたがのために行番号のペア、パターンのペア、または混合ペアを使用することができます<start>し、<end>このために。参照については、を参照してください:h [range]。ですから、実際にはあなたが考えていたよりもかなり柔軟です。
doubleDown

5

処理している区切りブロック(例:コードまたはXML / HTMLタグ)の場合、カーソルをブロックの先頭に配置し、ビジュアルモードを使用して%コードのブロック全体をすばやく選択してからヒットできます。dそれらを削除します。


5
また、あなたが使用することができdap、段落を削除するにはda(da{da[、括弧、中括弧、または角括弧でdelimetedブロックを削除します。htmlの場合dat、タグを削除し、文字列da'da"削除します。ありdipdi(区切り文字内のすべてのものを削除し、無傷の区切り文字を残すなどの変異体は、。または、vap(resp vip)を使用して、すべての(各内部)段落を選択できます。(そしてandがva(ありvi(ます。)さらにcap、and cip(またはca(and ci()があり、削除して挿入モードに移行します(つまり、「change」)。そしてyapヤンクに
jmc

以前のコメントで説明した@jmcのバインディングのいくつかは、Tim Popeによるaround.vimプラグインからのものだと思います。インストールすることをお勧めする素晴らしいプラグインですが、これらのバインディングはデフォルトのvimインストールの一部ではないことを意味します。
ヘギン

5

他のすべての良いアドバイスとは別に、現在のカーソル位置から画面上の最後の表示行までのすべてを削除するためにd+ Shift+ Lを追加しています。コマンドを繰り返し実行すると、比較的早く停止します。


5

numbers.vimのプラグインは、このために非常に便利です。これは、各行の前に行番号を付ける拡張された方法です。'number'およびのように'relativenumber'、両方が1つになりました!

インストール後にデフォルトで有効になりset numberますが、vimrcをまだ持っていない場合は、奇妙な方法で動作するため、vimrc に追加することもできます。

では、通常モードではのようになります:set relativenumber

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

相対行番号が表示されますが、カーソルが置かれている行を除き、絶対行番号(この場合は7)が表示されます。

その後、挿入モードに切り替えるとnumber、常に絶対行番号を表示することで設定されたかのように動作します。

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

さらにいくつかのオプションといくつかのコマンドがあります(ホームページを確認してください)が、ほとんどの人はデフォルトで機能するはずです。


最初は、この答えはトピックから少し外れていると思っていましたが、プラグインをインストールしたので、ゲームチェンジャーだと言わざるを得ません。私は手動で交換していましたが、余分な精神的なステップは、私がそれらの動きを使うことをためらうことを意味しました。ありがとうございました!
スキマスイッチ

1
これは、1つのInsertEnter / InsertLeave autocmdで相対的な行番号を切り替えることができるように思えます。何か不足していますか?
ベン

私はパーティーにとても遅れていますが、@ Benは正しいです、これはほんの2、3のオートコマンド行です。たとえば、vimrcでset numberset relativenumber次にautocmd InsertEnter * :set norelativenumber、そしてautocmd InsertLeave * :set relativenumber
Bレイヤー

4

別のアプローチは、特定のパターンに削除しようとしている場合、単にタイプすることができますd/delimEnter


2

通常の入力手順にd加えてモーションを使用できます(他の回答で既に説明したとおり)。EasyMotionプラグインは、問題をすばやく簡単に解決できる新しいモーションを提供します。

画面上の現在のカーソル位置から任意の単語の末尾まで削除したい場合、モーションキーは<Leader><Leader>e(通常のeモーションと同様)になります。次に、問題の単語の末尾に表示される強調表示された文字を入力します。線の動きもあるので、現在の線を問題の線まで削除できます<Leader><Leader>j

私は自分の持っている<Leader>にキーセットを,。したがって、完全なコマンドはd<Leader><Leader>e{強調表示された文字}です。

から:help easymotion

EasyMotionは、vimでいくつかのモーションを使用するはるかに簡単な方法を提供します。それは取る<number>のうち<number>、Wまたは<number>Fを{char}、すべての可能な選択肢を強調表示し、あなたがターゲットに直接ジャンプする一つのキーを押すようにすることによって。

使用可能なモーションの1つがトリガーされると、カーソルの前後に表示されるすべてのテキストがフェードされ、モーションターゲットが強調表示されます。

編集:

EasyMotionのgithubリポジトリhttps://github.com/Lokaltog/vim-easymotionにあります

easymotionを使用している人々に関するこのredditは、楽しい読み物かもしれません。


1

問題を解決できる簡単な解決策があります。

削除するテキストブロックの先頭にカーソルを置き、実行しますd50gg

これにより、現在の位置からテキストの50行目までのすべての行が削除されます。

EQ:カーソルが行にある場合は46d50gg削除させていただきます4行を。


1
Gviでも動作するため、ggの代わりに使用することをお勧めします。もちろん、行先の:set number行番号を見つけるのに常に役立ちます。
Random832

この質問の要点は、削除する行数がわからないということです。
200_success

200_success、投稿した回答で削除する行数を知る必要はありません。あなたが知っているすべての「削除しますかどのラインに」である
Geee

1

行を強調表示する視覚モードを使用します。

  1. 削除するテキスト/コードのブロックの一番上の行にカーソルを置きます
  2. Shift+を押すv
  3. 削除するテキスト/コードのブロックの一番下にカーソルを移動します
  4. 押す d

必要なものを削除するために右列にカーソルを置く必要がある視覚モードを単に使用するのに比べて、行全体を削除するため、コードのブロックを削除するこの方法を好みます。


3
基本的に@ 200_successまでに答えを繰り返します。
マーティンシュレーダー

1

私はrelativenumberいつも持っているのは好きではないので、ビジュアルモードのときだけ有効にするようにVimを設定しました:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

これにより、タスクが簡単になります。

V49jd

打った後V、ターゲットラインがどれだけ離れているかを見ることができるからです。

これは長い目で見れば煩わしいかもしれません(relativenumberを有効/無効にするとテキストが左右に移動します)が、これまでのところかなり楽しんでいます。


1
使用すると思いますv<Esc>d50jか?
マーティントゥルノイ

おかげで、私は実際にそれを間違って書いていました。実際にはV、行単位の操作を行うことがわかっている場合に開始し、d自信を深めるために最後まで残すことができます。
joeytwiddle

私の答えは、別の答えで提供されているnumbers.vimプラグインの貧乏人の近似であるようです。;-)
joeytwiddle

1

私にとってうまくいったのはvi

  1. :set number 削除したいところまで行の番号を表示する;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. 削除を開始する必要があった行に戻ります

  3. 通常モードでの現在の行からの削除の使用> d1290G
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.