NB Ini bukan duplikat dari Bagaimana cara kerja perintah "d3fg"? Silakan baca sebelum pemungutan suara untuk menutup!
Saya menemui sedikit kebuntuan dalam pencarian saya untuk menghapus pekerjaan kecil seperti yang besar . Masalah yang saya miliki adalah bahwa saya tidak tahu bagaimana cara membuat ulang perintah seperti d3d. Faktanya, saya bahkan tidak bisa mengerti bagaimana mereka bekerja sejak awal, juga tidak menemukan mereka dalam bantuan Vim. *
d3jmudah: itu berlaku d
operator untuk 3j
gerakan,
3ddjuga mudah: ia menjalankan dd
perintah dengan "hitungan" 3.
d3d sepertinya itu harus langsung, itu berlaku d
operator ke ... tapi apa 3d
? Itu bukan gerak. Jika Anda mengetik 3dsendiri, Vim memperlakukannya sebagai hitungan yang diikuti oleh operator, dan menunggu dengan sabar untuk masukan lebih lanjut.
Dan Anda tidak dapat menerapkan operator ke operator lain. ddtidak dijelaskan dalam bantuan sebagai urutan dua operator. Ini adalah perintah dua tombol terpisah. (lih. dc, yang tidak melakukan apa-apa.)
Tampaknya juga tidak terjadi bahwa posisi penghitungan fleksibel untuk perintah yang memerlukan dua penekanan tombol: 2gjmemindahkan kursor ke bawah dua garis layar, tetapi g2jmembuang dua penekanan tombol pertama sepenuhnya dan memindahkan kursor ke bawah satu baris.
Jadi bagaimana cara kerjanya? Apakah ini hanya kasus khusus dalam kode internal Vim? Apakah ada cara saya bisa membuat d[count]d
pemetaan?
EDIT : Apakah itu objek teks? :h text-objects
tidak termasuk dalam daftar "text perintah seleksi obyek", tapi kemudian tidak termasuk hh dalam daftar penghapusan "dikelompokkan dari kecil ke benda-benda besar". Dan d2awmenghapus kata di bawah kursor dan yang berikut. Di sisi lain, c2dtidak melakukan apa pun.
* Saya yakin beberapa menyebutkan mereka harus ada, tetapi saya tidak dapat menemukannya. Saya telah membaca :help deleting
,, :help motion.txt
dan mencoba :helpgrep dNd
untuk semua nilai N dari 1–9 .
d
tindakan terakhir sebagai konfirmasi; Jadi sama dengand3<CR>
.y3y
danc3c
juga bekerja sama ... Saya tidak dapat menemukan dokumen tentang ini meskipun di Vim: help, vi (1), nvi (1), atau spec POSIX ... Itu berperilaku samavi
dan dalamnvi
btw .dd
identik dengand_
._
membawa kursor ke non-blank pertama pada garis ([count]
-1) ke bawah, tapi itu juga, jadi ketika dipasangkan dengan operator, kursor beroperasi pada seluruh baris. Untuk alasan itu, masuk akal bahwa hitungan dapat muncul di antara keduanyad
.Jawaban:
Mode operator-tertunda
Antara mengetik operator (seperti
d
,c
, ataugU
) dan gerak (sepertiw
,i}
, atau/foo<CR>
), Vim dalam mode Operator-pending. Anda dapat membuat pemetaan untuk ini menggunakan:omap
dan:onoremap
.Dalam contoh saya, saya akan memetakan Operator-pending
d
untukw
. Ini adalah pilihan acak, karena saya tidak tahu untuk apa Anda sebenarnya ingin menggunakannya.Buat omap
Mari kita buat pemetaan untuk
d
dalam mode pending Operator. Saya akan menganggap kita sedang menulis VimScript di sini (seperti di Anda.vimrc
), jadi saya akan menghilangkan:
s.Ini membuat
dd
bertindak sepertidw
. Itu juga membuatd[count]d
bertindak sepertid[count]w
. Tapi saya yakin Anda tidak ingin mempengaruhi perilakudd
(yaitu, tidak[count]
disediakan).Pemetaan ekspresi
Pemetaan ekspresi memungkinkan Anda mengevaluasi ekspresi VimScript untuk menghasilkan sisi kanan pemetaan. Ekspresi harus dievaluasi menjadi string. Pemetaan ekspresi dilambangkan dengan
<expr>
kata kunci.Vim juga memiliki beberapa variabel bawaan yang dapat diisi pada berbagai waktu, dan sering berguna selama pemetaan. Salah satunya adalah
v:count
, yang[count]
disuplai ke operator atau gerak.Mari kita satukan itu semua. Jika tidak
[count]
disediakan,v:count
akan0
. Kami dapat memberitahu pemetaan kami untuk hanya digunakand
dalam kasus itu.Sekarang
dd
berperilaku seperti default (menghapus garis), tetapid[count]d
berperilaku sepertid[count]w
. Keren!Batasi untuk digunakan setelah
d
operatorAnda mungkin memperhatikan sesuatu. Sekarang
cd
juga berperilaku seperticw
. Ini mungkin bukan masalah, tetapi untuk kelengkapan, mari batasi sehingga hanya berfungsi setelahd
operator.Vim memiliki variabel lain
v:operator
, yang berisi operator yang terakhir digunakan. Mari kita periksa juga, sebelum melakukan sesuatu yang istimewa.CATATAN: Karena
:map
perintah dapat dirantai dengan|
, kita harus menghindarinya dalam ekspresi kita di sini. Jadi operator OR logis||
menjadi\|\|
.Keren, jadi
cd
danc[count]d
kembali untuk tidak melakukan apa-apa, seperti dulu. Ini bagus sehingga plugin lain dapat mendefinisikancd
.Saya tidak ingin menghapus beberapa gerakan lainnya
Jika Anda ingin memetakan
d[count]d
sesuatu yang sama sekali berbeda, tidak ada hubungannya dengan menghapus teks, kita bisa membuatnya bekerja juga.Saat Anda mengetik perintah dalam mode Normal, dan Anda mulai mengetik perintah secara tidak sengaja, Anda dapat menekan
<Esc>
untuk membatalkan perintah itu. Hal yang sama berlaku untuk pemetaan Anda.Mari kita
d[count]d
ubah baris saat ini menjadi apa pun[count]
.Bagian terakhir dari pemetaan adalah ekspresi VimScript:
<Esc>cc' . v:count . '<Esc>'
. Itu<Esc>
untuk membatalkand
perintah yang tertunda , kemudiancc
untuk mengubah baris saat ini,v:count
untuk mengetik nilai[count]
(dalam mode Insert), dan<Esc>
untuk kembali ke mode Normal. Perhatikan bahwa kami sedang membuat string di sini menggunakan operator gabungan VimScript.
,.Kasing Anda yang sebenarnya mungkin akan berbeda dari yang saya sebutkan di sini, tapi mudah-mudahan ini membantu Anda untuk membuat bola bergulir.
Selamat Vimming!
sumber
:omap d d
(!), Tapi sayangnya mode pending operator tidak pernah benar-benar tercapai karena pemetaan saya untuk d yang menetapkan fungsi operator kustom. Mudah-mudahan mungkin untuk mengubah hal-hal untuk membuatd3d
pekerjaan sebagaimana mestinya. (Beri tahu saya jika Anda memiliki ide, atau merasa bebas untuk mengirim solusi lengkap ke pertanyaan lain jika Anda mau.) Jika saya tidak segera mengetahuinya, saya akan menerimanya dan mengirim pertanyaan lain yang lebih spesifik. Terima kasih!