VIM에서 쉽게 단어를 바꾸는 방법? 않다. 예를 들어 def

나는 이것이 가능한지 아닌지를 결정하기에 vim에 충분하지 않다.

예를 들어 def function(param1, param2)빠르거나 쉬운 방법으로 def function(param2, param1)????



답변

나는 원래 이것을 어디서 얻었는지 기억하지 못하지만 적어도 몇 년 동안 ~ / .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


답변

@Heptite의 답변에 +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는 Heptite의 것과 약간 다릅니다. 어느 것이 더 좋은지 잘 모르겠습니다.


답변

그 긴 해결책은 못 생겼습니다. 커서가 왼쪽에 첫 단어의 첫 글자 인 ‘p’라고 가정하십시오. 이렇게하십시오 : dwlpldw%p. 이것은 당신의 특별한 경우에 적합합니다. 매일 편집하는 것은 어떻습니까? dwwP또는을 사용해보십시오 dWWP. :디

팁 : 자주 수행 할 필요가없는 경우 항상 긴 정규 표현식을 작성하지 마십시오. 그렇지 않으면 vimrc가 붐을 일으 킵니다. 모든 vim 사용자는 내장 커서 이동에 익숙해야합니다.


답변

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는 삭제 ( 및 ) 및 yanking ( )을 위한 iaaatextobj를 제공합니다 .diadaayia
  • 를 사용하여 매핑을 반복 할 수 있도록 vim-repeat 및 Repeatable ..
  • vim-exchange는 반복 가능한 원자 교환 텍스트를 제공합니다.

답변

라틴 언어에 대한 스왑 매핑

Vim 위키 의 스왑 매핑은 악센트 부호가있는 단어에서 올바르게 작동하지 않습니다 .

이 맵핑은 (유럽) ISO / IEC_8859-1 Latin-1 Supplement 문자 와 함께 작동하도록 조정되었습니다 . 이것은 모든 인스턴스를 대체하여 수행됩니다 \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()