Jak w prosty sposób przełączać słowa (w VIM)?


12

Nie jestem wystarczająco dobry w vimie, aby ustalić, czy to było możliwe, czy nie (dlatego doszedłem do superużytkownika, a nie dobry) ~ Czy jest sposób w vimie, aby łatwo zamienić dwa słowa?

na przykład w def function(param1, param2)czy istnieje szybki / łatwy sposób na zmianę tego na def function(param2, param1)???

Odpowiedzi:


13

Nie pamiętam, skąd to pierwotnie otrzymałem, ale było to w moim ~ / .vimrc od co najmniej kilku lat:

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

Po zdefiniowaniu tego, wszystko co musisz zrobić, to umieścić kursor gdzieś na „param1” w trybie normalnym i wpisać: gw


4
Mam go również, pochodzi z wiki vim.
romainl

5

+1 za odpowiedź @ Heptite.

Dla większej kompletności, oto co mam w moim .vimrc:

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

Źródło: wiki vim .

Widzę, że moja (i wiki) gwróżni się nieco od heptytu. Nie jestem pewien, który z nich jest lepszy.


4

To długie rozwiązanie jest brzydkie. Załóżmy, że kursor znajduje się po lewej stronie pierwszej litery pierwszego słowa, czyli „p”. Czy w ten sposób: dwlpldw%p. To pasuje do twojego specjalnego przypadku. Co powiesz na codzienną edycję? Spróbuj dwwPlub dWWP. :RE

Wskazówki: Nie zawsze pisz długie wyrażenia regularne, jeśli nie musisz tego robić często. W przeciwnym razie twój vimrc rozkwitnie. Wszyscy użytkownicy vima powinni znać wbudowany ruch kursora.


1

Napisałem się powtarzalne mapowania za pomocą kombinacji vim-exchange , powtarzalny (która zależy od repeat.vim ) oraz 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

Zaletą korzystania z wymiennych i powtarzalnych wtyczek dla tych mapowań są:

  • Wykonanie jednego cofnięcia uspowoduje cofnięcie zamiany (są to zmiany atomowe)
  • Możesz użyć, .aby przesuwać argument w lewo / prawo.

Wiem, wiem, wygląda na to, że jest wiele wtyczek do prostej operacji, ale zastanów się, co jeszcze te wtyczki dają:

  • argtextobj daje ci iai aatextobj do usuwania ( diai daa) i yanking ( yia).
  • vim-repeat i Repeatable do powtarzania dowolnego z mapowań ..
  • vim-exchange zapewnia powtarzalną, atomową wymianę tekstu.

1

Zamień mapowania dla języków łacińskich

Odwzorowania wymiany z wiki Vima nie będą działać poprawnie na słowach z akcentowanymi znakami.

Odwzorowania te są przystosowane do pracy ze znakami (europejskimi) ISO / IEC_8859-1 Latin-1 Supplement . Odbywa się to przez zastąpienie wszystkich wystąpienie \wz [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]i wszystkie obiekty \_Wz \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Usuwanie podświetlenia wyszukiwania

Ponadto podświetlanie wyszukiwania jest usuwane w razie potrzeby. Osiąga się to poprzez dodanie :nohlsearch<return>na końcu każdego potrzebnego mapowania.

Oto wynik końcowy:

" 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

Wtyczka Eclim zapewnia dobrą. Wszystkie kredyty dla nich :)

:SwapWords

.. a jeśli nie chcesz instalować całej wtyczki, wyodrębnij ich funkcję:

" 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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.