Bagaimana cara menghapus baris di atas / di bawah kursor, tetapi bukan baris saat ini?

11

Apakah ada perintah untuk menghapus garis (atau n baris) di atas yang sekarang? Di atas = saat ini tidak termasuk.

Yaitu, apakah ada alternatif dkyang tidak menghapus baris saat ini? Mirip dengan cara o/ Odan p/ Pbekerja, tetapi dengan penghapusan.

Saat ini, saya sedang melakukan kdd, yang menggerakkan kursor satu baris ke atas dan menghapusnya. Saya bisa melakukannya nnoremap <Leader>d kdddan nnoremap <Leader>D jdd-, tetapi memiliki alternatif yang tidak memindahkan kursor sepertinya pilihan yang lebih baik. Apakah ada?

Martin Tóth
sumber
Jika masalah Anda adalah bahwa pemetaan Anda memindahkan kursor, mengapa Anda tidak melakukannya nnoremap <Leader>d kddjdan nnoremap <Leader>D jddk?
statox
Menggunakan salah satu kddjatau jddk, posisi kolom tidak dipertahankan. Saya tidak mengatakan itu masalah besar, tapi itu menjengkelkan. Sebagai catatan, kddjpindahkan kursor 1 baris di bawah posisi semula. Dan jdd-sepertinya alternatif yang lebih baik jddkkarena setidaknya saya kembali ke karakter non white space pertama. Jika baris di bawah yang ingin saya hapus kosong, saya tertinggal di awal baris.
Martin Tóth
Bagaimana dengan menggunakan makdd`a untuk peta Anda? Tetapkan sebuah tanda dan kembalikan setelah itu ... Anda mungkin ingin mengubahnya menjadi karakter yang lebih sedikit digunakan.
PhilippFrank
@ PhilippFrank Atau saya dapat menggunakan `` untuk mendapatkan kursor kembali dan tidak menempati register (bukan saya menggunakan :)).
Martin Tóth
Tidak itu tidak berfungsi, k bukan lompatan, jadi Anda tidak dapat kembali menggunakan ``.
PhilippFrank

Jawaban:

30
:-d

memotong garis di atas garis saat ini.


:-5d

memotong garis ke-5 di atas garis saat ini (tetapi menggerakkan kursor).


:-5,-d

memotong 5 baris di atas garis saat ini.


:+,+5d

memotong 5 baris di bawah garis saat ini.

romainl
sumber
2
Tapi itu masih menggerakkan kursor.
PhilippFrank
1
Anda tidak dapat menghindari menggerakkan kursor. Yang terbaik yang dapat Anda lakukan adalah memindahkan kursor dan memindahkannya kembali .
romainl
Terima kasih! "Cara vim" semacam ini adalah apa yang saya cari. Saya akan menggunakan ini dalam kombinasi dengan `` untuk mendapatkan kursor kembali ke tempat semula.
Martin Tóth
5

EDIT Saya tidak tahu fitur bawaan yang disarankan oleh @Romainl dalam jawabannya: tentu saja -ddan +dmetode harus lebih disukai karena cara yang lebih sederhana daripada menambahkan fungsi ke.vimrc

Mungkin menambahkan sesuatu seperti itu ke Anda .vimrcbisa seperti yang Anda inginkan:

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

Fungsi-fungsi ini menghapus garis di bawah atau garis di atas yang sekarang dan kembali ke posisi sebelum penghapusan.

Untuk fungsi, DeleteOver()kita perlu naik satu baris normal ksetelah penghapusan karena penghapusan mengubah jumlah baris asli yang tidak cocok denganDeleteUnder()

Anda juga dapat menambahkan ini ke .vimrc

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

Untuk membuat pemetaan yang memanggil fungsi.

statox
sumber
Alternatif untuk menyimpan / mengembalikan posisi kursor adalah dengan menghapus / mengembalikan nostartoflineopsi.
Rich
5

Jika kita menggunakan register penghapusan kecil "-, kita dapat mengembalikan posisi kursor setelah menghapus n baris di atas.

Misalnya, d0dgk"-Pmenghapus di atas 1 baris dan mengembalikan kursor ke tempat semula.

  1. d0menghapus karakter dari kursor ke karakter pertama dari baris. Karena 0gerakan eksklusif, karakter di bawah kursor tidak dihapus. Dan karakter yang dihapus dimasukkan ke dalam regsiter penghapusan kecil "-.

  2. dgkmenghapus di atas 1 baris. Ini akan meninggalkan garis saat ini, karena gktidak secara linier dan eksklusif.

  3. "-P menempatkan teks dari register delete kecil "-.

Ini semacam peretasan. Tetapi jika Anda mencari perintah non-ex, pertimbangkan untuk menggunakannya.

MS.Kim
sumber
Solusi bagus! Meskipun saya pikir Anda "-Ptidak mau "-p. Yang terakhir mengacaukan teks sedikit.
James
@DJMcMayhem Anda benar. Saya mengoreksi jawabannya. Terima kasih telah menunjukkannya.
MS.Kim
2

Mungkin Anda akan meningkatkan alur kerja Anda jika tidak takut untuk ... melompat :)

Contoh:

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.

Tindakan Anda (mode normal, kursor pada _): /I want Enter 5dd Ctrl-o. Itu dia.

Tentu saja, jawaban romainl adalah yang terbaik jika semua yang Anda ingin hapus seluruh baris, dan Anda dapat menghitung offset mereka dengan mudah (menggunakan linenumbers relatif misalnya). Di atas adalah cara yang lebih umum untuk "bertindak": pergi ke sana, menggunakan sesuatu yang dianggap sebagai lompatan: ini berarti Anda selalu dapat melompat kembali, setelah Anda memodifikasi teks.

Misalnya, jika Anda menggunakan nomor baris absolut, Anda dapat mengganti /I want Enterdengan sesuatu seperti 78ggatau 78Guntuk melompat langsung ke nomor baris itu.

VanLaser
sumber
0

Berdasarkan solusi ms-kim, saya telah mengembangkan variasi yang sedikit berbeda yang menghemat posisi.

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: Saya juga menggunakan posting ini sebagai referensi.

SergioAraujo
sumber
Apakah maksud Anda @statox daripada @ MS.Kim?
Rich
-1

Jika Anda ingin menghapus garis duplikat di seluruh file, lakukan saja hal berikut:

:g/any part of the string/d

Contoh:

Dalam mode perintah

:g/I want to delete/d

Jika Anda hanya ingin daftar string pada awalnya:

:g/I want to delete/p
pengguna11509
sumber
3
Saya tidak begitu yakin bagaimana ini menjawab pertanyaan yang diajukan?
Martin Tournoij