Как легко переключать слова (в 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.
Ромен

5

+1 за ответ @ Гептита.

Для большей полноты вот что у меня есть в моем .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 wiki .

Я вижу, что мой (и вики) gwнемного отличается от гептита. Я не уверен, какой из них лучше.


4

Это долгое решение безобразно. Предположим, ваш курсор находится слева от первой буквы первого слова, то есть «p». Сделайте это: dwlpldw%p. Это вписывается в ваш особый случай. Как насчет ежедневного редактирования? Попробуйте dwwP, или dWWP. : D

Советы: не всегда пишите длинные регулярные выражения, если вам не нужно делать это часто. В противном случае ваш VIMRC бум. Все пользователи vim должны быть знакомы с его встроенным движением курсора.


1

Я написал повторяемые сопоставления, используя комбинацию vim-exchange , Repeatable (который зависит от 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-repeat и Repeatable для создания повторения любого из ваших сопоставлений ..
  • vim-exchange дает вам повторяемый атомарный обмен текстом.

1

Сопоставления для латинских языков

Отображения подкачки из вики Vim не будут корректно работать со словами с акцентированными символами.

Эти сопоставления адаптированы для работы с (европейскими) символами дополнения Latin-1 ISO / IEC_8859-1 . Это делается путем подстановки всех экземпляров \wwith [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]и всех экземпляров \_Wwith \_[^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.