¿Cómo cambiar palabras de una manera fácil (en VIM)?

12

No soy lo suficientemente bueno en vim para determinar si esto fue posible o no (por eso vine al superusuario y no es bueno) ~ ¿hay alguna forma en vim para cambiar fácilmente dos palabras?

por ejemplo, def function(param1, param2)¿hay una manera rápida / fácil de cambiar eso a def function(param2, param1)???

funk-shun
fuente

Respuestas:

13

No recuerdo dónde obtuve esto originalmente, pero ha estado en mi ~ / .vimrc durante al menos algunos años:

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

Una vez que haya definido esto, todo lo que necesita hacer es colocar el cursor en algún lugar en "param1" en modo normal y escribir: gw

Heptita
fuente
44
También lo tengo, proviene de la wiki de vim.
romainl
5

+1 por la respuesta de @ Heptite.

Para más información, esto es lo que tengo en mi .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>

Fuente: el wiki de vim .

Veo que mi (y la wiki) gwes ligeramente diferente de la de Heptite. No estoy seguro de cuál es mejor.

romainl
fuente
4

Esa larga solución es fea. Suponga que su cursor está a la izquierda de la primera letra de la primera palabra, es decir, 'p'. Haga lo siguiente: dwlpldw%p. Esto encaja en su caso especial. ¿Qué tal lidiar con la edición diaria? Intenta dwwPo dWWP. :RE

Consejos: no siempre escriba expresiones regulares largas, si no necesita hacerlo con frecuencia. De lo contrario, vimrc retumba. Todos los usuarios de vim deberán estar familiarizados con el movimiento del cursor incorporado.

usuario1641838
fuente
1

Escribí asignaciones repetibles utilizando una combinación de vim-exchange , Repetible (que depende de repeat.vim ) y 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

La ventaja de usar el intercambio y los complementos repetibles para estas asignaciones son:

  • Hacer una acción de deshacer udeshacerá el intercambio (son cambios atómicos)
  • Puede usar el .para seguir moviendo el argumento hacia la izquierda / derecha.

Lo sé, lo sé, parece una gran cantidad de complementos para una operación simple, pero piensa qué más te dan esos complementos:

  • argtextobj le da la iay aatextobj para borrar ( diay daa), y tirando ( yia).
  • vim-repeat y Repetible para hacer que cualquiera de tus asignaciones sea repetible con ..
  • vim-exchange le ofrece un intercambio de texto repetible y atómico.
dsummersl
fuente
1

Intercambiar asignaciones para idiomas latinos

Las asignaciones de intercambio de la wiki de Vim no funcionarán correctamente en palabras con caracteres acentuados.

Estas asignaciones están adaptadas para trabajar con caracteres (europeos) ISO / IEC_8859-1 Latin-1 Supplement . Esto se hace sustituyendo todas las instancias de \wwith [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]y todas las instancias de \_Wwith \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Borrado de resaltado de búsqueda

Además, el resaltado de búsqueda se borra donde sea necesario. Esto se logra al agregar :nohlsearch<return>al final de cada mapeo que lo necesite.

Aquí está el resultado final:

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

El complemento Eclim proporciona uno bueno. Todos los créditos para ellos :)

:SwapWords

.. y si no desea instalar todo el complemento, aquí se extrae su función:

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