Bisakah saya menghapus seluruh baris, kecuali baris terputus?

33

Operasi yang cukup umum bagi saya di vim, karena saya kompulsif-obsesif dan ingin menjaga file saya bebas dari spasi, adalah untuk menghapus isi dari seluruh baris, tetapi bukan baris itu sendiri (yaitu bukan pemecah baris).

Apakah ada cara vim bawaan untuk melakukan ini? Mungkin d<movement command>operasi?

Sejauh ini, yang terbaik yang saya miliki adalah (di telepon) 0d$. Apakah ada cara yang lebih cepat?

Andrew Ferrier
sumber
2
Sebagai alternatif untuk memotong spasi putih secara manual, Anda bisa menggunakan plugin seperti vim-better-whitespace , yang menyoroti trailing whitespace, menyediakan perintah untuk menghapusnya sekaligus, dan bahkan dapat melakukannya secara otomatis saat penyimpanan.
deltab
3
Bahkan tanpa plugin, Anda dapat menghapus spasi spasi trailing secara global menggunakan search-and-replace, mis.:%s/\s*$//
Kyle Strand

Jawaban:

34

Anda dapat menggunakan 0Dini akan pergi ke karakter pertama di baris dan menghapus sampai akhir baris. Perhatikan bahwa Anda dapat menggunakan ^Djika Anda ingin meninggalkan spasi kosong sebelumnya. Juga, operasi ini tidak dapat diulang dengan menggunakan .. Jika Anda menginginkan operasi yang dapat diulangi dengan .perintah, lihat jawaban David Lord.

Topik-Topik Bantuan:

  • :help 0
  • :help D
  • :help ^
Pohon cemara
sumber
4
Meskipun ini langsung, to the point, dan (mungkin) penekanan tombol paling sedikit, itu tidak dapat diulang menggunakan .perintah. Untuk alasan itu, saya pikir cc<Esc>atau S<Esc>lebih menarik jika Anda ingin mengulangi.
tommcdo
Itu benar. Namun, Anda bisa merekamnya sebagai makro dan ulangi menggunakan itu ..
EvergreenTree
Secara umum, makro tidak dapat diulang dengan .. Mereka bekerja seolah-olah penekanan tombol itu dimasukkan secara interaktif, sehingga perintah individu diperlakukan secara terpisah. Menggunakan .hanya akan mengulangi perintah terakhir di makro.
tommcdo
Saya mengujinya, dan itu bukan cara kerjanya untuk saya. Jika merekam makro, lalu menggunakannya menggunakan @{reg}, Anda dapat mengulanginya dengan .sesudahnya.
EvergreenTree
1
Anda hanya mengulang perintah terakhir dari makro, yaitu D. Setelah 0Doperasi, kursor Anda akan ditinggalkan di kolom 0. Jika kursor Anda sudah berada di awal baris (setelah Anda pindah ke yang lain), itu akan terlihat seperti makro diulang dengan benar. Coba gerakkan kursor ke depan dalam barisan dan ketikkan .- Anda akan melihat bahwa kursor hanya akan berulang D.
tommcdo
20

cc <Esc>akan melakukan apa yang Anda minta, tetapi lebih banyak penekanan tombol daripada 0D. Jika Anda ingin memasukkan sesuatu ke dalam garis itu sesudahnya, ccmungkin yang terbaik.

David Lord
sumber
2
Jika Anda memasukkan Shift itu sama dan mungkin lebih mudah.
Holloway
4
Meskipun ini bukan solusi "terbersih", ia memiliki satu keuntungan: itu persis satu tindakan, dan itu bisa diulang dengan .perintah. Sebaliknya, 0D(seperti yang disarankan dalam jawaban yang dipilih) adalah dua tindakan: 0gerak dan Dperintah.
tommcdo
@ Trengot mungkin lebih mudah daripada 0Dbagi saya karena saya telah jkmemetakannya <Esc>di vimrc saya, jadi tangan saya bahkan tidak harus meninggalkan barisan rumah.
EvergreenTree
1
Lihat jawaban @Nobilis: Sdidokumentasikan sebagai "Sinonim untuk cc"
Volker Siegel
14

Sdan kemudian Ctrl+Catau Esctampaknya mencapai fungsi yang sama persis.

Kemudian dapat diulang dengan .karena merupakan tindakan tunggal.

Nobilis
sumber
2
Saya hanya berpikir untuk menambahkan ini sebagai jawaban dan kemudian melihat milik Anda
bel
7

0Dmungkin itu yang Anda inginkan. Ini akan menghapus dari kursor ke akhir baris sambil meninggalkan garis (dan karakter apa pun sebelum kursor) di tempatnya.

SupBrah
sumber
Meskipun jawaban ini almos berumur satu tahun, perlu dicatat bahwa 0Dakan dihapus dari awal baris , bukan dari posisi kursor
FliiFe
4

Saya biasanya menggunakan ddO. dduntuk menghapus baris saat ini, dan O(itu adalah modal besar) untuk menambahkan baris baru.

Ini juga 3 penekanan tombol, tetapi ddhanya dihitung sebagai 1 setengah, dan saya menemukan Olebih mudah untuk mengetik daripada $.

Ini berbeda dari 0Dsolusi karena indentasi otomatis, misalnya dengan kode ini (di mana !···ada tab, dan █ kursor:

def asd():
!···if foo:
!···!···foo()█
!···!···foobar()

0D akan meninggalkan Anda dengan:

def asd():
!···if foo:
█
!···!···foobar()

Dan ddOakan meninggalkan Anda dengan:

def asd():
!···if foo:
!···!···█
!···!···foobar()

Dan jika Anda menekan <Esc>segera setelah ini, Vim harus menghapus lekukan-otomatis, sehingga Anda memiliki yang sama dengan 0D.

Tidak ada cara yang 'benar', itu akan tergantung pada apa yang ingin Anda lakukan. Saya lebih suka ddOkarena lebih fleksibel, dan karena itu "di jari saya" :-)

Martin Tournoij
sumber
2
^Dakan meninggalkan spasi putih sendiri.
EvergreenTree
Karena Omembuat Anda dalam mode penyisipan, ini setara dengan cc, kecuali tanpa indentasi otomatis .... kecuali jika saluran Anda sudah diindentasi otomatis.
Kyle Strand
Ini akan berperilaku berbeda pada baris terakhir file.
tommcdo
0

Dan untuk menyimpan satu stroke key berharga yang dapat Anda gunakan 0Cyang akan menghapus semua karakter pada baris saat ini dan menempatkan Anda ke mode insert.

Vlatko Šurlan
sumber