hapus kata setelah atau sekitar kursor di VIM

212

Saya sekarang beralih ke VIMdari TextMate. Saya menemukan ^+Wdalam mode INSERT sangat berguna. Namun, saya ingin menghapus tidak hanya kata sebelum kursor, tetapi kata setelah atau sekitar kursor juga.

Saya melakukan beberapa pencarian di Google, tetapi satu-satunya hal yang dapat saya temukan adalah ^+Wmenghapus kata SEBELUM kursor.

Mantra
sumber

Jawaban:

78

Yang harus Anda lakukan adalah membuat imap dari kunci tertentu ke serangkaian perintah, dalam hal ini perintah akan menjatuhkan Anda ke mode normal, hapus kata saat ini dan kemudian masukkan kembali:

:imap <C-d> <C-[>diwi
Whaledawg
sumber
29
": h diw" untuk banyak shrtcts yang berguna!
klokop
12
Poin bonus bonus untuk menggunakan <Co>. Ini mengeksekusi satu perintah dalam mode Normal dan melompat langsung kembali ke Sisipkan, jadi sesuatu seperti imap <C-d> <C-o>diwberfungsi juga. Itu juga tidak membuat titik undo, yang <Esc> hampir selalu terjadi.
zelk
<Co> dalam mode sisipkan membuat hari saya :)
Lusk116
541

Mode normal:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 
Amjith
sumber
125
Sangat membantu bagi saya untuk menganggapnya sebagai daw: menghapus kata dan caw: mengubah kata.
welbornio
1
Tuhan saya telah menggunakan da)dan ci)tetapi tidak pernah memikirkan hal ini!
Langit
1
Itu emas Jerry! EMAS! Saya memetakan bayi-bayi itu di .vimrcfile saya seperti ini: nmap <Leader>d daw dannmap <Leader>c caw
racl101
1
Mungkin layak disebut itu awadalah salah satu contoh pemilihan objek. Anda dapat mencoba pemilihan objek dalam mode visual untuk melihat efek apa yang mereka miliki: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok
103

Saya pikir itu adil daw

daw - delete a word
steve
sumber
1
Saya tahu itu aperintah untuk Append text after the cursor [count] times.tetapi bagaimana cara dawkerjanya?
syntagma
3
@REACHUS karakter awal dmenentukan Anda akan 'menghapus'. The 'a' adalah sejenis parameter, yang menetapkan bahwa penghapusan harus menyertakan pembatas. Akhirnya 'w', yang lain parameter-jika Anda mau- menentukan bahwa suatu wordunit akan dihapus.
vlad-ardelean
2
apa perbedaan antara dwdan daw?
AK_
5
@AK_ Respons telat, tetapi jika Anda berada di tengah kata, dwakan menghapus dari kursor ke akhir kata, sementara dawakan menghapus seluruh kata bersama dengan spasi. diwakan menghapus seluruh kata tanpa menyentuh spasi putih di sekitarnya.
Dmiters
67

Di bawah ini berfungsi untuk mode Normal: Saya setuju dengan jawaban Dan Olson bahwa Anda mungkin berada dalam mode normal untuk sebagian besar penghapusan. Lebih detail di bawah ini.

Jika kursor ada di dalam kata:
diwuntuk menghapus kata (tidak termasuk spasi)
dawuntuk dihapus di sekitar kata (termasuk spasi sebelum kata berikutnya).

Jika kursor berada di awal kata, cukup tekan dw.

Ini dapat dikalikan dengan menambahkan angka biasa untuk gerakan, misalnya 2w untuk maju 2 kata, jadi d2w menghapus dua kata.

Sisipkan Mode ^ w
Gagasan untuk menggunakan hjkl untuk gerakan di Vim adalah lebih produktif untuk tetap menggunakan baris home. Di akhir kata ^ w sangat bagus untuk menghapus kata dengan cepat. Jika Anda masuk ke mode penyisipan, masukkan beberapa teks dan gunakan tombol panah untuk berakhir di tengah kata Anda telah bertentangan dengan filosofi baris rumah.
Jika Anda dalam mode normal dan ingin mengubah kata, Anda cukup menggunakan c(ubah) daripada d(menghapus) jika Anda ingin mengubah kata sepenuhnya, dan masuk kembali ke mode insert tanpa harus menekan iuntuk kembali untuk mengetik.

Andy
sumber
42

Maksud Anda suka?

dw
Nadia Alramli
sumber
10
Terlambat ke pesta, tetapi dw akan menghapus dari posisi saat ini hingga akhir kata, untuk menghapus seluruh kata dari awal, gunakan diw atau daw
Dvid Silva
1
dwtidak akan menghapus melewati tanda hubung atau tanda baca lainnya.
ccpizza
* Catatan: Ini akan menimpa buffer / yank terakhir. Ini lebih merupakan operasi 'Potong', bukan hanya 'Hapus'.
MD. Mohiuddin Ahmed
23

Untuk menghapus semua karakter antara dua spasi putih, dalam mode normal:

daW

Untuk menghapus hanya satu kata:

daw 
krmld
sumber
20

Ini tidak terlihat seperti ada setiap built-in cara untuk melakukannya dalam mode insert, yang pertanyaannya. Beberapa jawaban lain benar untuk mode normal, serta menunjukkan bahwa pemetaan khusus dapat dibuat untuk menambahkan fungsionalitas dalam mode sisipkan.

Jujur, Anda mungkin harus melakukan sebagian besar penghapusan dalam mode normal. ^ W rapi untuk diketahui, tetapi saya tidak yakin bisa memikirkan situasi di mana saya lebih suka melakukannya daripada melakukan mode normal dan memiliki perintah penghapusan yang lebih kuat yang bisa saya gunakan.

Vim sangat berbeda dari sejumlah editor lain (termasuk TextMate) dengan cara ini. Jika Anda menggunakannya secara produktif, Anda mungkin akan menemukan bahwa Anda tidak menghabiskan banyak waktu dalam mode penyisipan.

Dan Olson
sumber
1
Saya menggunakan ^ wa banyak, kebanyakan ketika saya salah ketik kata - alih-alih kembali dan menambahkan huruf yang hilang / dll, saya hanya menghapus semuanya dan mulai lagi .. Pergi ke mode normal hanya untuk menghapus satu kata sepertinya buang-buang dari beberapa penekanan tombol .. Misalnya, "contoh wrd [^ w] kata" kurang penekanan tombol daripada "contoh wrd [^ c] [dw] [i] word"
dbr
1
dbr: Dia tidak meminta untuk melakukan perilaku dasar, meskipun vim itu mendukung. Dia meminta untuk menghapus semua kata sementara di tengah saat dalam mode insert, yang merupakan situasi yang agak aneh untuk vim sehingga tidak ada perintah untuk melakukannya. Anda selalu dapat mengikat ^ Q ke <Esc> ciw jika Anda benar-benar ingin fungsionalitasnya. Oh, juga [i] di [^ c] [dw] [i] berlebihan, Anda dapat menggunakan [^ c] [ciw]
bfabry
4
"Ini tidak terlihat seperti ada cara ..." - juga ada banyak cara untuk melakukannya - tidak hanya ada built-in cara, afaik. Sementara saya sepenuhnya setuju dengan pernyataan Dan tentang mode penyisipan vs. mode normal, Anda tentu saja dapat dengan mudah mendefinisikan pemetaan mode penyisipan, lihat ": help imap" yang melakukan apa pun yang ingin Anda capai jika Anda benar-benar membutuhkan fungsionalitas dalam mode penyisipan.
user55400
13

Untuk menghapus seluruh kata yang digunakan kursor Anda diw
Untuk menghapus seluruh kata kursor Anda aktif dan untuk menempatkan Anda dalam mode masukkan gunakan ciw
jika Anda tidak ingin menghapus seluruh kata tetapi menghapus dari tempat Anda beradadw/cw

Naseeruddin VN
sumber
8

Karena ada begitu banyak cara untuk menghapus kata, mari kita ilustrasikannya.

Dengan asumsi Anda mengedit:

foo-bar quux

dan aktifkan perintah saat kursor berada di bilah 'a' di ':

foo-bquux  # dw:  letters then spaces right of cursor
foo-quux   # daw: letters on both sides of cursor then spaces on the right 
foo- quux  # diw: letters on both sides of cursor
foo-bquux  # dW:  non-whitespace then spaces right of cursor
quux       # daW: non-whitespace on both sides of cursor then spaces on the right
 quux      # diW: non-whitespace on both sides of cursor
0xF
sumber
5

Modus insert tidak memiliki perintah seperti itu, sayangnya. Dalam VIM, untuk menghapus seluruh kata di bawah kursor Anda dapat mengetik viwddalam mode NORMAL. Berarti yang " V isual-blok I nner W ord D apus". Gunakan huruf besar Wuntuk menyertakan tanda baca.

miselia
sumber
3

Jawaban yang diterima gagal ketika mencoba mengulang kata yang dihapus, coba solusi ini sebagai gantinya:

" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw

Ini memetakan CTRL-BackSpace, juga bekerja dalam mode normal.


sumber
Saya suka jawaban ini lebih baik hanya karena ia juga bekerja dalam mode normal.
sivabudh
2

Untuk menghapus sejumlah karakter sebelum kursor, Anda dapat menggunakan X. Untuk menghapus sejumlah kata setelah kursor, Anda dapat menggunakan dw (beberapa kata dapat dihapus menggunakan 3dw untuk 3 kata misalnya). Untuk menghapus kursor secara umum, Anda dapat menggunakan daw.

John T
sumber
2

Di vi lama, bmemindahkan kursor ke awal kata sebelum kursor, wmemindahkan kursor ke awal kata setelah kursor, ememindahkan kursor di akhir kata setelah kursor dan dwmenghapus dari kursor ke akhir kata.

Jika Anda mengetik wbdw, Anda menghapus kata di sekitar kursor, bahkan jika kursor berada di awal atau di akhir kata. Perhatikan bahwa spasi putih setelah kata adalah pertimbangan untuk menjadi bagian dari kata yang akan dihapus.

mouviciel
sumber
2

Tidak begitu yakin tentang penggunaan "sebelum" dan "setelah" Anda, tetapi apakah Anda sudah mencoba

dw

?

Sunting: Saya kira Anda sedang mencari sesuatu untuk digunakan dalam mode penyisipan. Anehnya, tidak ada yang dapat ditemukan di dokumen, ctrl-w tampaknya semua yang ada.

innaM
sumber
2

Saya membuat dua pemetaan sehingga saya bisa mendapatkan konsistensi dalam menyisipkan dan keluar dari mode penyisipan.

:map <'Key of your choice'> caw

:imap <'Key of your choice'> <'Esc'> caw

userFog
sumber
0

Saya ingin menghapus tidak hanya kata sebelum kursor, tetapi kata setelah atau sekitar kursor juga.

Dalam hal ini solusi yang diusulkan oleh OP (yaitu menggunakan <c-w>) dapat dikombinasikan dengan jawaban yang diterima untuk memberikan:

inoremap <c-d> <c-o>daw<c-w>

sebagai alternatif (solusi lebih pendek):

inoremap <c-d> <c-o>vawobd

Input sampel:

word1 word2 word3 word4
               ^------------- Cursor location

Keluaran:

word1 word4
sergio
sumber