VIM에서 쉽게 단어를 바꾸는 방법?


12

나는 이것이 가능한지 아닌지를 결정하기에 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 위키에서 온다.
romainl

5

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


4

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

팁 : 자주 수행 할 필요가없는 경우 항상 긴 정규 표현식을 작성하지 마십시오. 그렇지 않으면 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는 삭제 ( 및 ) 및 yanking ( )을 위한 iaaatextobj를 제공합니다 .diadaayia
  • 를 사용하여 매핑을 반복 할 수 있도록 vim-repeat 및 Repeatable ..
  • vim-exchange는 반복 가능한 원자 교환 텍스트를 제공합니다.

1

라틴 언어에 대한 스왑 매핑

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{

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.