Bagaimana cara mengganti kata dengan cara yang mudah (dalam VIM)?

12

Saya tidak cukup baik di vim untuk menentukan apakah ini mungkin atau tidak (itulah sebabnya saya menjadi superuser dan tidak baik) ~ apakah ada cara di vim untuk dengan mudah mengganti dua kata?

misalnya def function(param1, param2)apakah ada cara cepat / mudah untuk mengubahnya ke def function(param2, param1)???

funk-shun
sumber

Jawaban:

13

Saya tidak ingat dari mana saya mendapatkan ini, tetapi sudah ada di ~ / .vimrc saya setidaknya selama beberapa tahun:

" Swap the word the cursor is on with the next word (which can be on a
" newline, and punctuation is "skipped"):
nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>:noh<CR>

Setelah Anda mendefinisikan ini, yang perlu Anda lakukan adalah meletakkan kursor di suatu tempat di "param1" dalam mode dan tipe normal: gw

Heptite
sumber
4
Saya memilikinya juga, itu berasal dari vim wiki.
romainl
5

+1 untuk jawaban @ Heptite.

Untuk kelengkapan lebih lanjut, inilah yang saya miliki di .vimrc saya:

" push current line up or down
nnoremap <leader><Up> ddkP
nnoremap <leader><Down> ddp

" exchange character under cursor with the next character without moving the cursor
nnoremap gc xph

" exchange word under cursor with the next word without moving the cursor
nnoremap gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the left
nnoremap <leader><Left> "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the right
nnoremap <leader><Right> "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>/\w\+\_W\+<CR><C-l>

Sumber: wiki vim .

Saya melihat (dan wiki) saya gwsedikit berbeda dari yang Heptite. Saya tidak yakin mana yang lebih baik.

romainl
sumber
4

Solusi panjang itu jelek. Misalkan kursor Anda berada di sebelah kiri huruf pertama dari kata pertama, yaitu 'p'. Lakukan ini: dwlpldw%p. Ini cocok dengan kasus khusus Anda. Bagaimana dengan berurusan dengan pengeditan harian? Coba dwwP, atau dWWP. : D

Kiat: Jangan selalu menulis ekspresi reguler yang panjang, jika Anda tidak perlu sering melakukannya. Kalau tidak, vimrc Anda akan meledak. Semua pengguna vim harus terbiasa dengan gerakan kursor bawaannya.

pengguna1641838
sumber
1

Saya menulis pemetaan berulang menggunakan kombinasi vim-exchange , Repeatable (yang tergantung pada repeat.vim ), dan argtextobj .

" Swap function arguments, move the argument under the cursor to the left or to
" the right.
Repeatable map <leader>al cxiaf,cxia
Repeatable map <leader>ah cxiaF,hcxia

Keuntungan menggunakan pertukaran dan plugin berulang untuk pemetaan ini adalah:

  • Melakukan satu undo uakan membatalkan swap (itu adalah perubahan atom)
  • Anda dapat menggunakan .untuk terus memindahkan argumen ke kiri / kanan.

Saya tahu saya tahu, sepertinya banyak sekali plugin untuk operasi sederhana, tetapi pikirkan apa lagi yang diberikan plugin tersebut kepada Anda:

  • argtextobj memberi Anda iadan aatextobj untuk menghapus ( diadan daa), dan menarik ( yia).
  • vim-repeat dan Repeatable untuk membuat pemetaan Anda dapat diulangi ..
  • pertukaran-vim memberi Anda pertukaran atomik yang berulang-ulang.
dsummersl
sumber
1

Tukar pemetaan untuk bahasa Latin

Pertukaran pemetaan dari wiki Vim tidak akan beroperasi dengan benar pada kata-kata dengan karakter beraksen.

Pemetaan ini disesuaikan untuk bekerja dengan karakter Suplemen ISO-IEC_8859-1 (Eropa) Latin / 1 . Ini dilakukan dengan mengganti semua instance \wdengan [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]dan semua instance \_Wdengan \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Menghapus sorotan pencarian

Selanjutnya, sorotan pencarian dihapus jika diperlukan. Ini dicapai dengan menambahkan :nohlsearch<return>pada akhir setiap pemetaan yang membutuhkan.

Inilah hasil akhirnya:

" Use gc to swap the current CHARACTER with the next, WITHOUT changing the cursor position.
nnoremap <silent> gc xph

" Use gw to swap the current WORD with the next, WITHOUT changing the cursor position.
nnoremap <silent> gw "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>

" Disable Alt+[menukey] menu keys (i.e. Alt+h for help)
set winaltkeys=no

" Use Alt + ← or Alt + h to swap the current WORD with the previous, keeping the cursor on the current word. This feels like "PUSHING" the word to the left.
nnoremap <silent> <A-Left> "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
nnoremap <silent> <A-h>    "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
" <A-h> corresponds to è

" Use Alt + → or Alt + l to swap the current WORD with the next, keeping the cursor on the current word. This feels like "PUSHING" the word to the right.
nnoremap <silent> <A-Right> "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
nnoremap <silent> <A-l>     "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
" <A-l> corresponds to ì

" Use g{ to swap the current PARAGRAPH with the next.
nnoremap g{ {dap}p{
Serge Stroobandt
sumber
0

Plugin Eclim menyediakan yang bagus. Semua kredit untuk mereka :)

:SwapWords

.. dan jika Anda tidak ingin menginstal seluruh plugin, ini adalah fungsinya yang diekstrak:

" Swap words:
" taken from Eclim
" https://github.com/ervandew/eclim

function! SwapWords() " {{{
  " Initially based on http://www.vim.org/tips/tip.php?tip_id=329

  " save the last search pattern
  let save_search = @/

  normal! "_yiw
  let pos = getpos('.')
  keepjumps s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/
  call setpos('.', pos)

  " restore the last search pattern
  let @/ = save_search

  silent! call repeat#set(":call SwapWords()\<cr>", v:count)
endfunction " }}}

command! SwapWords :call SwapWords()
iago-lito
sumber