Bagaimana cara menentukan "kata di bawah kursor" pada baris perintah VIM?

86

Saya ingin menulis perintah yang menentukan "kata di bawah kursor" di VIM. Misalnya, saya memiliki kursor pada sebuah kata dan saya membuatnya muncul dua kali. Misalnya, jika kata tersebut adalah "abc" dan saya ingin "abcabc" maka saya dapat mengetik:

:s/\(abc\)/\1\1/

Tapi kemudian saya ingin bisa memindahkan kursor ke "def" dan menggunakan perintah yang sama untuk mengubahnya menjadi "defdef":

:s/\(def\)/\1\1/

Bagaimana saya bisa menulis perintah di baris perintah sehingga melakukan ini?

:s/\(*whatever is under the commandline*\)/\1\1
Nathan Fellman
sumber

Jawaban:

74

<cword>adalah kata di bawah kursor (: bantuan <cword>).

Maaf, saya seharusnya lebih lengkap dalam jawaban ini.

Anda dapat memetakan perintah ke sana, atau rangkaian penekanan tombol untuk pemalas ini akan berfungsi:

b #go to beginning of current word
yw #yank to register

Kemudian, ketika Anda mengetik dalam pola Anda, Anda dapat menekan <control-r>0<enter>yang akan menempel di perintah Anda isi register ke-0.

Anda juga dapat membuat perintah untuk ini seperti:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Yang akan memetakan memukul '\' dan 'w' pada saat yang sama untuk menggantikan baris perintah Anda dengan

:s/\(<currentword>\)/
hazzen
sumber
17
Saya sangat menghargai jawaban yang bagus, tetapi saya mungkin akan menyarankan yang di yiwatas bywhanya karena memori otot. Dalam skenario di mana kursor Anda kebetulan berada di karakter pertama dalam kata, Anda harus menghilangkan bdan cukup ketik ywvs Anda dapat menghilangkan iin yiw. Kecelakaan bisa terjadi, dan memperbaiki kesalahan tentu saja lebih
menekan
132

Saat dalam mode baris perintah, CTRL+ R CTRL+W akan memasukkan kata di bawah kursor.

Lihat bantuan untuk c_CTRL-Rdaftar semua register khusus lainnya:

:help c_CTRL-R
César Alforde
sumber
29
yiwP

yiw: Yank kata batin (kata di bawah kursor). Perintah ini juga menggerakkan kursor ke awal kata.

P: Tempel sebelum kursor.

Anda kemudian dapat memetakan mis: < ALT > - Dke perintah ini:

:nmap < ALT >-D yiwP
pengguna11211
sumber
4
Pertanyaannya secara khusus tentang menentukan "kata di bawah kursor" dari baris perintah Vim, bukan dari mode perintah
Nathan Fellman
12

Cara mudah lainnya untuk melakukannya adalah dengan menggunakan *perintah.

Dalam mode biasa, saat melewati satu kata, ketik

*:s//\0\0<Enter>

* menjadikan pola pencarian kata saat ini (misalnya \ <abc \>).

:s// melakukan substitusi menggunakan pola pencarian saat ini, dan \0 di bagian penggantian adalah string yang cocok.

Anda kemudian dapat mengulangi perilaku ini, mengucapkan kata "def", baik dengan mengetik lagi, atau dengan mengetik

*@:

@: hanya mengulangi perintah ex terakhir, tanpa perlu <Enter>, dalam hal ini substitusi.

Anda juga dapat merekam makro cepat untuk melakukan ini menggunakan qperintah

qd*:s//\0\0<Enter>q

Kemudian ulangi sesuka hati Anda dengan mengetik

@d

ketika lebih dari kata yang ingin Anda gandakan. Karena ini hanya satu karakter yang kurang dari solusi sebelumnya, itu mungkin tidak sepadan bagi Anda - kecuali Anda akan melakukan ex-perintah lain antara kata-penggandaan, yang akan mengubah perilaku@:

rampion
sumber
1

Anda harus menghindari garis miring terbalik dalam pemetaan. Anda juga dapat memasukkan string substitusi dalam pemetaan.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

sumber
1
ywPx

akan melakukan apa yang Anda gambarkan.

ywPxw

juga akan memajukan kursor ke kata berikutnya.

bmb
sumber
Pertanyaannya secara khusus tentang menentukan "kata di bawah kursor" dari baris perintah Vim, bukan dari mode perintah
Nathan Fellman
Tolong jelaskan jawaban seperti itu, setiap huruf dalam perintah.
Vitaly Zdanevich
0

@ user11211 memiliki cara paling mudah untuk menduplikasi kata di bawah kursor:

yiwP

yank kata bagian dalam (memindahkan kursor ke awal kata), tempel (sebelum kursor).

misalnya. straigh [t] forward ----> straightforwar [d] straightforward

[] adalah kursor

Untuk menguraikan ...

Anda mungkin ingin mengarahkan kursor ke kata yang digandakan:

yiwPea

straigh [t] forward ----> lugas, lugas []

CATATAN:

yiw

adalah kata batin yank (tanpa spasi)

yaw

adalah yank semua kata (termasuk spasi kosong).

yawPea

Oleh karena itu, duplikat kata termasuk spasi, dan kursor posisi.

straigh [t] forward ----> straightforward straightforward []

BBW Sebelum Windows
sumber
Pertanyaannya adalah khusus tentang menentukan "kata di bawah kursor" dari Vim ini commandline , tidak dari modus perintah.
Nathan Fellman
1
Anda dapat menggunakan salah satu perintah normal (mode perintah) di atas dalam mode perintah, cukup mendahului perintah dengan: normal ... misalnya,: yiwP normal akan melakukan hal yang sama seperti yiwP dalam mode normal. Ini tentu saja, cara yang lebih lambat untuk melakukan apa yang Anda minta.
BBW Sebelum Windows
-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
SergioAraujo
sumber
bisakah Anda berkomentar tentang apa ini?
Nathan Fellman
1
Ini menggunakan perintah nflag to :substituteuntuk mencetak berapa kali kata di bawah kursor muncul di buffer saat ini. Cukup pintar, tapi sebenarnya bukan jawaban untuk pertanyaan ini.
Jacob