Відповіді:
Я не пам’ятаю, звідки у мене це було, але я був у моєму ~ / .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
+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
дещо відрізняється від тієї, що є у Гептіта. Я не впевнений, який із них кращий.
Це довге рішення некрасиве. Припустимо, курсор знаходиться зліва першою літерою першого слова, тобто "р". Зробіть це: dwlpldw%p
. Це вписується у ваш особливий випадок. Як щодо боротьби з щоденним редагуванням? Спробуйте dwwP
, або dWWP
. : D
Поради: Не пишіть завжди довгий регулярний вираз, якщо вам це не потрібно часто робити. Інакше ваш vimrc бум. Усі користувачі VIM повинні бути знайомі з вбудованим рухом курсору.
Я написав повторювані відображення , використовуючи комбінацію 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
ви скасуєте своп (вони атомні зміни).
аргумент, щоб продовжувати переміщення аргументу вліво / вправо.Я знаю, що знаю, здається, що це багато плагінів для простої операції, але подумайте, що ще дають ці плагіни:
ia
і aa
textobj для видалення ( dia
і daa
) та yanking ( yia
)..
.Підмінні відображення з вікі 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{
Плагін 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()