Як легко перемикати слова (у VIM)?


12

Я недостатньо хороший у vim, щоб визначити, чи це можливо чи ні (саме тому я прийшов до суперпослушника, а не добре) ~ Чи є спосіб vim легко переключити два слова?

наприклад def function(param1, param2), чи є швидкий / простий спосіб змінити це на def function(param2, param1)???

Відповіді:


13

Я не пам’ятаю, звідки у мене це було, але я був у моєму ~ / .vimrc принаймні кілька років:

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

Після того, як ви визначили це, все, що вам потрібно зробити, це поставити курсор десь на "param1" у звичайному режимі та ввести: gw


4
У мене це теж є, він походить від vim wiki.
romainl

5

+1 за відповідь @ Heptite

Для більшої повноти, ось що я маю у своєму .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>

Джерело: Вікі vim .

Я бачу, що моя (і вікі) gwдещо відрізняється від тієї, що є у Гептіта. Я не впевнений, який із них кращий.


4

Це довге рішення некрасиве. Припустимо, курсор знаходиться зліва першою літерою першого слова, тобто "р". Зробіть це: dwlpldw%p. Це вписується у ваш особливий випадок. Як щодо боротьби з щоденним редагуванням? Спробуйте dwwP, або dWWP. : D

Поради: Не пишіть завжди довгий регулярний вираз, якщо вам це не потрібно часто робити. Інакше ваш vimrc бум. Усі користувачі VIM повинні бути знайомі з вбудованим рухом курсору.


1

Я написав повторювані відображення , використовуючи комбінацію VIM-обмін , повторюваний (який залежить від repeat.vim ), і 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

Перевагою використання обмінних та повторюваних плагінів для цих відображень є:

  • Якщо зробити одне скасування, uви скасуєте своп (вони атомні зміни)
  • Ви можете використовувати .аргумент, щоб продовжувати переміщення аргументу вліво / вправо.

Я знаю, що знаю, здається, що це багато плагінів для простої операції, але подумайте, що ще дають ці плагіни:

  • argtextobj дає вам iaі aatextobj для видалення ( diaі daa) та yanking ( yia).
  • vim-повтор і повторюваність для того, щоб зробити будь-яке з ваших відображень повторюваним ..
  • vim-exchange дає вам повторюваний атомний обмін текстом.

1

Обміняйте карти на латинські мови

Підмінні відображення з вікі Vim працюватимуть неправильно на словах з наголошеними символами.

Ці відображення адаптовані для роботи з (європейськими) символами ISO / IEC_8859-1 Latin-1 . Це робиться заміною всіх екземплярів \wз [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]і всіх екземплярів \_Wз \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Очищення підсвічування пошуку

Крім того, підкреслюється підсвітка пошуку, де це необхідно. Це досягається додаванням :nohlsearch<return>у кінці кожного необхідного відображення.

Ось кінцевий результат:

" 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 забезпечує хороший. Всі кредити їм :)

:SwapWords

.. і якщо ви не хочете встановлювати весь плагін, ось їх функція витягнута:

" 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.