Vim에서 Emacs의 전치 단어를 어떻게 에뮬레이션하나요?
문제
Emacs에는 유용한 기능이 있습니다. transpose-words
구두점을 유지하면서 커서 앞의 단어를 커서 뒤의 단어와 교환할 수 있는 명령입니다.
예를 들어, 'stack |overflow
’ + M-t = ‘overflow stack|
’ (‘|
’는 커서 위치입니다.)
<a>|<p>
된다 <p><a|>
.
Vim에서 에뮬레이트하는 것이 가능한가요?나는 내가 사용할 수 있다는 것을 안다 dwwP
, 하지만 구두점에서는 잘 작동하지 않습니다.
업데이트: 아니요, dwwP
~이다 정말 해결책이 아닙니다.상상하다:
SOME_BOOST_PP_BLACK_MAGIC( (a)(b)(c) )
// with cursor here ^
Emacs의 M-t는 교환되었을 것입니다 b
그리고 c
, 를 야기하는 (a)(c)(b)
.
작동하는 것은 무엇입니까 /\w
yiwNviwpnviwgp
.하지만 망친다 ""
그리고 "/
.더 깨끗한 솔루션이 있습니까?
업데이트²:
해결됨
:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>
불완전하지만 작동합니다.
가져와주신 Camflan에게 감사드립니다. %#
내 관심을 끄는 항목입니다.물론, 모든 것이 위키, 하지만 그것이 문제를 해결할 수 있다는 것을 몰랐습니다. 정확한 (Emacs는 완전히 올바르게 이해했습니다) transpose-words
특징.
해결책
이것들은 내 .vimrc에서 왔으며 나를 위해 잘 작동합니다.
" swap two words
:vnoremap <C-X> <Esc>`.``gvP``P
" Swap word with next word
nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l> *N*
다른 팁
상황에 따라 DWWP에서와 같이 W 또는 B 명령을 사용할 수 있습니다. "자본"버전은 구두점을 포함하여 다음/이전 공간으로 건너 뜁니다. F 및 T 명령은 삭제 된 범위의 끝을 지정하는 데 도움이 될 수 있습니다.
에 대한 토론도 있습니다 VIM 팁 위키 다양한 스와핑 기술에 대해.
줄의 중간에서 첫 번째 단어의 첫 글자로 가서
dw wP
줄의 끝에서 (즉, 줄의 마지막 두 단어), 단어 사이의 공간으로 가서
2dw bhP
VIMRC 파일에 다음과 같은 것을 추가하여 사람들을 위해 바로 가기 키를 추가 할 수 있습니다.
map L dwwP
map M 2dwbhP
이 경우 Shift-L (명령 모드)은 줄의 중간에 단어를 전환하고 Shift-M은 끝에이를 수행합니다.
NB : 이것은 공간 분리 된 단어와 가장 잘 작동하며 OP의 특정 사례를 잘 처리하지 않습니다.
팁이 있습니다 http://vim.wikia.com/wiki/vimtip10. 그러나 나는 내 자신을 굴리기로 선택합니다. 내 스 니펫은 팁에 언급 된 방법에 비해 두 가지 명백한 장점이 있습니다. 1) 커서가 한 마디에 없을 때 작동합니다. 2) 전체 화면에서 높은 조명이 아닙니다.
전치가 불가능할 때 아무것도하지 않는다는 점을 제외하고는 Emacs 'Transpose-Words'와 거의 비슷합니다. (Emacs의 'Transpose-Words'는 깜박임과 현재 단어의 시작으로 커서 위치를 변경합니다.)
"transpose words (like emacs `transpose-words')
function! TransposeWords()
if search('\w\+\%#\w*\W\+\w\+')
elseif search('\w\+\W\+\%#\W*\w\+')
endif
let l:pos = getpos('.')
exec 'silent! :s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/'
call setpos('.', l:pos)
let l:_ = search('\(\%#\w\+\W\+\)\@<=\w\+')
normal el
endfunction
nmap <silent> <M-right> :call TransposeWords()<CR>
imap <silent> <M-right> <C-O>:call TransposeWords()<CR>
Mark와 CapnNefarious가 말했듯이 dwwP 또는 dWwP를 사용할 수 있지만 나만의 메모가 몇 가지 있습니다.
- 제시한 예에서와 같이 커서가 두 번째 단어의 첫 번째 문자에 있는 경우 dwbP(또는 구두점을 처리하려면 dWbP)를 사용할 수 있습니다.
- 커서가 단어 중간에 있으면 dawbP/daWbP를 사용할 수 있습니다.
거기에 전환 단어 스크립트 vim.org에서 아름답게 작동합니다.