11

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

например, в def function(param1, param2) есть быстрый / простой способ изменить это на def function(param2, param1)???

6 ответов6

12

Я не помню, где я изначально получил это, но это было в моем ~/.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

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 и aa textobj для удаления (dia и daa) и восстановления (yia).
  • vim-repeat и Repeatable для создания возможности повторения любого из ваших сопоставлений . ,
  • vim-exchange дает вам повторяемый атомарный обмен текстом.
1

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

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

Эти сопоставления адаптированы для работы с (европейскими) символами дополнения Latin-1 ISO/IEC_8859-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()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .