Dalam vim, saya sering perlu menghapus, atau menarik / meletakkan blok teks yang besar.
Saya bisa menghitung baris teks dan memasukkan sesuatu seperti 50dd
menghapus 50 baris.
Tapi itu agak menyebalkan. Bagaimana saya bisa menghapus blok teks yang besar ini tanpa harus tahu berapa banyak baris yang harus dihapus terlebih dahulu?
move
sampai akhir. Maka menghapus sampai akhir tidak berbeda dengan pindah ke akhir.Jawaban:
Pergi ke baris awal blok Anda, dan ketik ma(tandai "a", meskipun Anda tentu saja dapat menggunakan huruf yang berbeda , dan bahkan beberapa huruf untuk tanda yang berbeda asalkan Anda dapat tetap lurus di kepala Anda apa setiap huruf adalah tanda) .
Kemudian pergi ke baris terakhir dan masukkan d'a(hapus untuk menandai "a") atau y'a(tarik untuk menandai "a") (a) .
Itu akan menghapus / menarik semua baris dari saat ini ke yang ditandai (inklusif).
Kemudian Anda dapat menempelkannya di tempat lain dengan perintah tempel normal, seperti patau P.
Ini juga kompatibel dengan
vi
sertavim
, pada kesempatan bahwa lingkungan Anda tidak diberkati dengan yang terakhir.(a) Saya juga menggunakan ini untuk menyimpan tempat saya dalam file jika saya harus mencari di tempat lain untuk sesuatu seperti, misalnya, menyalin-menempelkan definisi fungsi yang ingin saya panggil.
Saya cukup menandai baris saat ini dengan cara yang sama ma,, lalu berjalan-jalan untuk menemukan apa pun yang Anda cari.
Kemudian, setelah saya menemukannya dan menyalinnya ke register, saya hanya memasukkan 'auntuk kembali untuk menandai "a", baris yang saya simpan sebelumnya, di mana saya kemudian dapat menempelkannya.
sumber
v
tombol saya bertanya pada diri saya apakah saya benar-benar membutuhkannya atau apakah ada cara gerak yang lebih baik?Di Vim, gunakan mode garis visual :
Untuk menghapus blok teks yang besar ini lebih disukai daripada mode visual sederhana karena Anda tidak perlu khawatir tentang kolom di mana kursor berada.
sumber
}
untuk memilih seluruh paragraf atau)
untuk kalimat. Masih ada lagi, Anda dapat membacanya di:h object-motions
/something<CR>
adalah metode yang sangat efisien untuk mencapai hingga akhir blok pilihan Andaj
untuk memindahkan kursor ke bawah (langkah 3), Anda dapat mengetikkan nomor baris yang diikuti olehG
untuk memilih hingga garis itu. Contoh:V150Gd
Anda bisa
:set relativenumber
, jadi Anda tidak perlu menghitung. ;)sumber
:set number
, dan kemudian gunakan d35G untuk menghapus hingga baris 35.relativenumber
, tapi lebih baik :-)Anda dapat dengan mudah menghapus blok teks yang besar dengan mengetahui strukturnya.
Jika paragraf, gunakan: d{(mis. Anda dapat awalan dengan jumlah paragraf)
Jika itu adalah blok kode dalam tanda kurung, gunakan: d%
Jika teks muncul hingga akhir file, gunakan: dG
Jika Anda tahu bagaimana itu berakhir, gunakan: d/dan ketikkan teks akhir diikuti oleh Enter(Anda juga dapat menggunakan ekspresi reguler, sehingga kemungkinan tidak terbatas).
Atau gunakan mode visual ( V) dan gunakan tombol gerak untuk dengan cepat memilih teks (misalnya dengan {) dan menghapusnya ( d).
Atau seperti yang disarankan Lie Ryan, gunakan
d/search-string/e
untuk menghapus teks dari kursor saat ini ke string yang dicari.Lihat:
:help d
dan:help motion
untuk info lebih lanjut.sumber
d/search-string/e
untuk menghapus dari kursor saat ini ke akhir string pencarian termasuk string pencarian itu sendiri danc/search-query
masuk ke mode penyisipan setelah penghapusan. Menggunakand/
denganset incsearch
adalah kombinasi yang rapi karena memungkinkan Anda untuk secara interaktif mengetahui apakah Anda beroperasi pada rentang teks yang tepat, dan membantu Anda tahu kapan harus berhenti mengetik permintaan pencarian untuk menghindari mengetik lebih dari yang diperlukan.d
dengana
(luar), ataui
(dalam) dan specifier objek sangat berguna. Objek sepertiw
untuk kata,p
untuk paragraf,(
ataub
untuk(...)
,[
untuk[...]
,{
atauB
untuk dokumentasi{...}
dll untuk operator visual .Anda dapat menggunakan gerakan dan / atau objek teks. Misalnya, Anda dapat menghapus semuanya mulai dari kursor ke baris kosong berikutnya
d}
. Jika kursor ada di dalam paragraf, paragraf dapat dihapus dengandip
ataudap
. Jika kursor berada dalam tag HTML, Anda dapat menghapusnya dengandit
ataudat
.Mnemonik yang bagus untuk ini adalah " d elete i nside" dan " d elete a round" (paragraf / tag / tanda kurung).
sumber
Biasanya saya lakukan
yang akan menghapus setiap baris antara nomor baris awal dan akhir yang disediakan (termasuk baris yang diberikan).
Perhatikan bahwa keduanya
start
danend
dapat berupa angka garis, pola, atau offset absolut dari posisi lain.Juga lihat komentar doubleDown tentang melihat dokumentasi rentang Vim , ini memiliki beberapa tips yang berguna.
Contoh:
Katakanlah Anda memiliki file berikut:
Kemudian dengan menggunakan perintah
:2,3d
atau:/fox/,/over/d
atau:/quick/+1,/lazy/-1
atau:+1,+2d
jika Anda berada di baris pertama atau:-1,.d
jika Anda berada di baris ketiga, Anda berakhir dengan:sumber
:set ruler
, kemudian pergi ke atas & bawah teks untuk mencaristart
danend
nomor baris, kemudian lakukan:<start>,<end>d
:+12,+24d
<start>
dan<end>
untuk ini. Untuk referensi, lihat:h [range]
. Jadi sebenarnya ini sedikit lebih fleksibel daripada yang Anda bayangkan.Jika blok dibatasi (misalnya: kode atau tag XML / HTML) yang Anda hadapi, Anda dapat memposisikan kursor di awal blok dan menggunakan mode visual bersama dengan
%
untuk dengan cepat memilih seluruh blok kode dan kemudian tekand
untuk menghapusnya.sumber
dap
untuk menghapus sebuah paragraf,da(
,da{
,da[
, untuk menghapus blok delimeted dengan tanda kurung, kawat gigi, atau tanda kurung persegi. Untuk html adadat
, yang menghapus tag, danda'
danda"
menghapus string. Ada jugadip
,di(
, dll varian, yang akan menghapus segala sesuatu di dalam pembatas, tapi tinggalkan pembatas utuh. Atau, Anda dapat menggunakanvap
(respvip
) untuk memilih semua paragraf (resp dalam). (Dan begitu adava(
danvi(
.) Selanjutnya adacap
dancip
(atauca(
danci(
) untuk menghapus dan pergi ke mode insert (yaitu, "ubah"). Danyap
untuk menarikTerlepas dari semua saran bagus lainnya, saya menambahkan d+ Shift+ Luntuk menghapus semuanya dari posisi kursor saat ini ke baris terakhir yang terlihat di layar. Mengulangi perintah akan membuat Anda turun relatif cepat.
sumber
The numbers.vim Plugin ini sangat berguna untuk ini. Ini adalah cara yang disempurnakan untuk mengawali setiap baris dengan nomor baris. Suka
'number'
dan'relativenumber'
, keduanya digulirkan menjadi satu!Ini diaktifkan secara default setelah instalasi, Anda juga ingin menambahkan
set number
ke vimrc Anda jika Anda belum mendapatkannya, karena berperilaku dengan cara yang aneh jika Anda tidak memilikinya.Dalam mode normal , tampilannya mirip dengan
:set relativenumber
:Ini menunjukkan Anda nomor garis relatif, kecuali untuk garis di mana kursor aktif, di mana ia menunjukkan nomor garis absolut (7 dalam kasus ini).
Jika kita beralih ke mode penyisipan , itu akan berperilaku seolah-olah
number
diatur dengan selalu menampilkan angka garis absolut:Ada beberapa opsi lagi dan beberapa perintah (periksa beranda), tetapi defaultnya akan berfungsi untuk kebanyakan orang.
sumber
set number
,set relativenumber
laluautocmd InsertEnter * :set norelativenumber
danautocmd InsertLeave * :set relativenumber
Pendekatan lain adalah jika Anda mencoba untuk menghapus ke pola tertentu, Anda cukup mengetik d/
delim
Enter.sumber
Anda dapat menggunakan prosedur normal untuk memasukkan dplus gerakan (sebagaimana telah dijelaskan dalam jawaban lain). Plugin EasyMotion, menyediakan gerakan baru yang dapat Anda gunakan yang dapat menyelesaikan masalah Anda dengan cara yang cepat dan mudah.
Katakanlah Anda ingin menghapus dari posisi kursor saat ini ke akhir kata yang diberikan di layar, tombol geraknya akan
<Leader>
<Leader>
e(mirip dengane
gerakan normal ). Kemudian ketikkan huruf yang disorot yang muncul di akhir kata yang dipertanyakan. Ada juga gerakan garis sehingga Anda dapat menghapus garis saat ini ke garis yang dimaksud<Leader>
<Leader>
j.Saya telah
<Leader>
mengatur kunci saya untuk ,. Jadi, perintah lengkapnya adalah d<Leader>
<Leader>
e{highlighted letter (s)}.Dari
:help easymotion
:Sunting:
EasyMotion ini github repositori adalah di https://github.com/Lokaltog/vim-easymotion .
Reddit ini tentang orang yang menggunakan easymotion mungkin menyenangkan untuk dibaca.
sumber
Ada solusi sederhana yang bisa menyelesaikan masalah Anda.
Tempatkan kursor Anda di awal blok teks yang ingin Anda hapus, dan lakukan
d50gg
.Ini akan menghapus semua baris dari posisi Anda saat ini ke baris ke-50 teks Anda.
eq: jika kursor Anda berada di baris 46 ,
d50gg
akan menghapus 4 baris.sumber
G
daripada gg karena juga berfungsi di vi, dan tentu saja:set number
selalu berguna untuk menemukan nomor baris yang ingin Anda tuju.Gunakan mode visual dengan penyorotan garis.
Saya lebih suka metode ini untuk menghapus blok kode karena menghapus seluruh baris dibandingkan dengan hanya menggunakan mode visual di mana Anda harus memposisikan kursor di kolom kanan untuk menghapus apa yang Anda inginkan.
sumber
Saya tidak suka memiliki
relativenumber
semua waktu, jadi saya mengkonfigurasi Vim saya untuk mengaktifkannya hanya ketika saya dalam Mode Visual:Ini membuat tugas Anda mudah:
karena setelah memukul VAnda dapat melihat seberapa jauh garis targetnya.
Ini mungkin terbukti menjengkelkan dalam jangka panjang (teks bergeser ke kanan dan kiri ketika relativenumber diaktifkan / dinonaktifkan), tetapi sejauh ini saya cukup menikmatinya.
sumber
v<Esc>d50j
?V
jika saya tahu saya akan melakukan operasi garis-bijaksana, dan kemudian saya dapat meninggalkand
sampai terakhir, untuk kepercayaan diri yang lebih besar.Apa yang bekerja sangat baik untuk saya
vi
::set number
untuk melihat nomor baris sampai tempat saya ingin menghapus;Kembali ke baris tempat penghapusan harus dimulai
d1290G
sumber