現在の行ではなく、カーソルの上/下の行を削除するにはどうすればよいですか?


11

現在の行より上の行(またはn行)を削除するコマンドはありますか?上記=電流は含まれていません。

dkつまり、現在の行を削除しない代替手段はありますか?o/ Op/のP動作に似ていますが、削除を伴います。

現在、を実行していますkdd。これは、カーソルを1行上に移動して削除します。私は何ができるnnoremap <Leader>d kddnnoremap <Leader>D jdd-が、カーソルを移動しない代替を持つことは良いオプションのように思えます。そのようなものはありますか?


あなたの問題があなたのマッピングがカーソルを動かすことであるならnnoremap <Leader>d kddj、なぜあなたはそうしませんnnoremap <Leader>D jddkか?
statox

kddjまたはを使用するとjddk、列の位置は保持されません。それが大きな問題だと言っているのではありませんが、それは迷惑です。レコードの場合、kddjカーソルを元の位置から1行下に移動します。そして、少なくとも私が最初の非空白文字に戻るのでjdd-、より良い代替手段のようjddkです。削除したい行の下の行が空の場合、行の先頭に残ります。
MartinTóth

マップにmakdd`aを使用してみませんか?マークを設定して、後でマークを戻します。ただし、使用頻度の低い文字に変更することもできます。
PhilippFrank 2015

@PhilippFrankまたは ``を使用して、カーソルを元に戻し、レジスタを占有しないようにすることもできます(私が使用するものではない:))。
MartinTóth15年

いいえ、動作しません。kはジャンプではないため、「」を使用して戻ることはできません。
PhilippFrank 2015

回答:


30
:-d

現在の線より上の線を切り取ります。


:-5d

現在の行の上から5行目を切り取ります(ただし、カーソルは移動します)。


:-5,-d

現在の行の上にある5行をカットします。


:+,+5d

現在の行の下の5行をカットします。


2
それでもカーソルは移動します。
PhilippFrank 2015

1
カーソルの移動は避けられません。できる最善の方法は、カーソルを移動してから戻すことです。
romainl 2015

ありがとうございました!このような「vim way」は私が探していたものです。これを「」と組み合わせて、カーソルを元の場所に戻します。
MartinTóth15年

5

EDIT私は彼の答えに@Romainlによって提案された内蔵の機能を知りませんでした。もちろん、-d及び+d方法が好まれるべきで、それはに機能を追加するより方法が簡単です、あなたのよう.vimrc

多分あなたにそのような何かを追加することはあなた.vimrcが望むものかもしれません:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

これらの関数は、現在の行の下または上の行を削除し、削除前の位置に戻ります。

関数のDeleteOver()場合normal k、削除すると元の行の番号が変更されるため、削除後に1行上に移動する必要があります。DeleteUnder()

これを追加することもできます .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

関数を呼び出すマッピングを作成します。


カーソル位置を保存/復元する代わりに、nostartoflineオプションを設定解除/復元することもできます。
リッチ

5

小さな削除レジスタ「-」を使用すると、n行より上の行を削除した後にカーソル位置を復元できます。

たとえば、d0dgk"-P1行より上の行を削除し、カーソルを元の位置に戻します。

  1. d0カーソルから行の最初の文字までの文字を削除します。0は専用モーションなので、カーソルの下の文字は削除されません。そして、削除された文字は小さな削除登録者に入れられます "-。

  2. dgk1行以上を削除します。これは行gk単位で排他的ではないため、現在の行を離れます。

  3. "-P 小さな削除レジスタからテキストを置きます "-。

それは一種のハックです。ただし、ex以外のコマンドを探している場合は、それを使用することを検討してください。


素敵な解決策!したく"-Pないと思いますが"-p。後者はテキストを少し混乱させます。
ジェームズ

@DJMcMayhemそうですね。正解しました。指摘いただきありがとうございます。
MS.Kim

2

おそらく、ジャンプするのを恐れないなら、ワークフローを改善するでしょう:)

例:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

あなたの行動(ノーマルモード、カーソルが上です_): /I want Enter 5dd Ctrl-o。それでおしまい。

もちろん、行全体を削除したい場合はromainlの回答が最適であり、オフセットを簡単にカウントできます(たとえば、相対行番号を使用)。上記は、より一般的な「行動する」方法です。ジャンプとして数えるものを使用して、そこに行きます。つまり、テキストを変更した後は、いつでも戻ることができます。

たとえば、絶対行番号を使用する場合、/I want Enterをのようなものに置き換え78ggたり78G、その行番号に直接ジャンプしたりできます。


0

ms-kimソリューションに基づいて、列の位置を節約する少し異なるバリエーションを開発しました。

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS:この投稿も参考にしています。


@ MS.Kimではなく@statoxを意味しますか?
リッチ

-1

ファイル全体で重複する行を削除する場合は、次のようにします。

:g/any part of the string/d

例:

コマンドモード

:g/I want to delete/d

最初に文字列のリストが必要な場合:

:g/I want to delete/p

3
これが質問にどのように答えるかは本当にわかりませんか?
マーティンTournoij
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.