Kelimeleri kolay bir şekilde nasıl değiştirebilirim (VIM'de)?


12

Vim'de bunun mümkün olup olmadığını belirlemek için yeterince iyi değilim (bu yüzden süper kullanıcıya geldim ve iyi değilim) ~ vim'de iki kelimeyi kolayca değiştirmenin bir yolu var mı?

örneğin def function(param1, param2)bunu değiştirmek için hızlı / kolay bir yolu var def function(param2, param1)???

Yanıtlar:


13

Bunu nereden aldığımı hatırlamıyorum, ancak en azından birkaç yıldır ~ / .vimrc'mde:

" 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>

Bunu tanımladıktan sonra, tek yapmanız gereken imlecinizi normal modda "param1" üzerine bir yere koymak ve şunu yazmaktır: gw


4
Bende var, vim wiki'den geliyor.
romainl

5

@ Heptite'nin cevabı için +1.

Daha fazla bütünlük için .vimrc dosyamda:

" 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>

Kaynak: vim wiki .

Görüyorum ki (ve gwwiki'ler) Heptit'inkinden biraz farklı. Hangisinin daha iyi olduğundan emin değilim.


4

Bu uzun çözüm çirkin. İmlecinizin solda ilk kelimenin ilk harfi, yani 'p' olduğunu varsayalım. Bunu yapın: dwlpldw%p. Bu sizin özel durumunuza uyar. Günlük düzenleme ile uğraşmaya ne dersiniz? Deneyin dwwPveya dWWP. : D

İpuçları: Bunu sık sık yapmanız gerekmiyorsa, her zaman uzun düzenli ifadeler yazmayın. Aksi takdirde vimrc patlamalarınız olur. Tüm vim kullanıcıları yerleşik imleç hareketine aşina olmalıdır.


1

Vim-exchange , Repeatable ( repeat.vim'e bağlı ) ve argtextobj kombinasyonunu kullanarak tekrarlanabilir eşlemeler yazdım .

" 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

Bu eşlemeler için exchange ve tekrarlanabilir eklentileri kullanmanın avantajı:

  • Bir geri ualma işlemi, takas işlemini geri alır (bunlar atomik değişikliklerdir)
  • .Bağımsız değişkeni sola / sağa hareket ettirmek için düğmesini kullanabilirsiniz .

Biliyorum biliyorum, basit bir işlem için bir sürü eklenti gibi görünüyor, ama bu eklentilerin size başka neler verdiğini düşünün:

  • argtextobj size silme ( ve ) ve yanking ( ) için iave textobj'yi verir .aadiadaayia
  • vim-repeat ve Mappings'inizi tekrarlanabilir hale getirmek için Tekrarlanabilir ..
  • vim-exchange size tekrarlanabilir, atomik metin alışverişi sağlar.

1

Latin dilleri için eşlemeleri değiştir

Vim wiki'deki takas eşlemeleri, aksanlı karakterleri olan sözcüklerde düzgün çalışmaz .

Bu eşlemeler (Avrupa) ISO / IEC_8859-1 Latin-1 Ek karakterleriyle çalışacak şekilde uyarlanmıştır . Bu her örneğini ikame edilmesi suretiyle yapılır \wile [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]ve tüm örneklerini \_Wbirlikte \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Arama vurgulamasının silinmesi

Ayrıca, arama vurgulaması gerektiğinde temizlenir . Bu, :nohlsearch<return>ihtiyaç duyulan her eşlemenin sonuna eklenerek elde edilir .

Sonuç:

" 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{

0

Eclim eklentisi iyi bir eklenti sağlar. Tüm krediler :)

:SwapWords

.. ve tüm eklentiyi yüklemek istemezseniz, işte bunların işlevi çıkarılır:

" 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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.