텍스트 블록을 빠르게 이동시키는 방법


25

일반적으로 텍스트 또는 코드 블록을 복사하는 방법은 다음과 같습니다.

  1. 시각 모드 ( V)로 블록을 선택하고 d; 또는 한 줄이면을 사용하십시오 dd.
  2. 텍스트를 원하는 위치로 이동하면 p과 의 차이점을 기억하기에는 너무 어리석기 P때문에 시간의 약 50 %를 얻습니다. (내가 잘못하면 다시 시도를 취소하십시오).
  3. 내가 함께 비주얼 모드로 갈 수 있도록 때때로, 들여 쓰기, 조정이 필요 V다시 같은 블록을 다시 선택하고, 사용 >또는 <그 수정에.

더 쉬운 방법이 있습니까? 일부 편집자에서는 텍스트 블록을 "있는 그대로"집어 들고 움직일 수 있다는 것을 보았습니다. 다음은 Emacs의 예입니다 (그러나 다른 편집자에서도 이것을 보았습니다).

이맥스

아니면 다른 (더 나은) 방법이 있습니까?


들여 쓰기 문제에 대해 당신과 함께 붙여 넣기하여 해결할 수 있습니다 ]p또는 [p보다는 pP. 이렇게하면 붙여 넣은 블록이 자동 들여 쓰기됩니다.
Gonçalo Ribeiro

vim-unimpaired 사용을 권장 하는 Drew Neil Bubbling Text 의 스크린 캐스트를보고 싶을 수도 있습니다 .
Hotschke

답변:


13

이를위한 플러그인이 있습니다 : dragvisuals.vim .

기본적으로 어떤 키도 바인딩하지 않으므로 직접해야합니다. 나는 그것들을 Control+ 에 매핑하고 싶다 Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

현재 선택 항목을 복제하는 보너스 키도 제공됩니다.

xmap <expr> D DVB_Duplicate()

다른 답변에 비해이 플러그인의 장점 :

  • 첫 줄보다 위로 이동하려고해도 텍스트가 사라지지 않습니다.
  • 마지막 줄 아래로 이동하면 파일이 확장됩니다.
  • 왼쪽 / 오른쪽으로 이동하면 조금 더 효과적입니다.

이를 보완하는 또 다른 유용한 트릭은 다음과 같은 키 바인드입니다.

xnoremap > >gv
xnoremap < <gv

이렇게하면 >비주얼 모드에서 사용한 후 마지막 시각적 선택 항목이 다시 선택 되므로 정렬을보다 쉽게 ​​조정할 수 있습니다 (화살표 키를 사용할 수도 있지만 문자가 아닌 한 문자 씩 이동 함 shiftwidth).


1
제안 된 플러그인 작성자가 "내 자신의 dragvisuals.vim의 개선 된 재 작업"으로 설명하는 또 다른 플러그인이 있습니다 : github.com/zirrostig/vim-schlepp
Jay Thompson

8

3 단계의 경우 gv=대신 사용할 수 있습니다 ( =들여 쓰기 및 gv"마지막 시각적 선택 다시 선택"을 의미 함).

Emacs 동작의 경우 .vimrc에 매핑을 추가하는 것이 매우 간단합니다.

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

그런 다음 위쪽 및 아래쪽 화살표 키를 사용하여 시각적 선 선택을 이동할 수 있습니다. (물론, 화살표가 싫다면 다른 키로도 매핑 할 수 있습니다.)

(일반적인 시각적 선택을 사용하여 왼쪽 및 오른쪽으로도 이동할 수 있습니다. vnoremap <left> dhPgvhohovnoremap <right> dpgvlolo)


gv마지막 시각적 선택으로 이동합니다.이 경우에는 삭제 된 단락이됩니다. 내가 무엇을 놓치고 있습니까?
Robert Smith

4

일부 키를 다시 매핑하여 선을 움직일 수 있습니다. 예를 들어, 이동하는 데 사용되는 화살표는 위아래로 움직 hjkl입니다.

예 : .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, 줄을 이동하는 일반 명령

+1또는 -2줄을 위 또는 아래로 표시합니다 (-1은 줄을 같은 위치에 유지합니다)

gvVISUAL모드 에서 동일한 텍스트를 다시 선택

이 솔루션은 레지스터를 방해하지 않으므로 복사 된 텍스트를 계속 사용할 수있을뿐만 아니라 적절한 들여 쓰기 등을 설정하기 위해 코드를 다시 포맷 할 수 있습니다.


사용하기를 좋아하지 않기 때문에 이것은 좋지만 나에게는 적합하지 않습니다 =(종종 나에게 관련이없는 형식이 너무 많이 변경됩니다).
Martin Tournoij


3

이 플러그인은 거의 없지만 Tim Pope의 vim-unimpaired ( github )를 선호합니다 (Ingo Karkat LineJuggler 는 유사합니다).

텍스트 블록을 시각적으로 선택한 다음 블록을 ]e아래쪽으로 ( [e다른 방향으로) 이동 (e )하십시오. .작업을 반복하는 데 사용 합니다 ( repetit.vim이 설치되어 있지 않습니다). 너무 멀리 가면를 통해 취소하십시오 u.

이제 개인적으로 생각 p하고 P나쁜 습관을 만들기 전에 그 내용을 가장 좋은 것입니다 있도록 자주 사용하는 명령입니다. 그런 다음 ]p동일한 들여 쓰기에 붙여 넣을 수 있습니다 . 손상되지 않은 상태로 사용 >p하는 경우 들여 쓰기 수준을 더 깊이 =p붙여 넣거나 붙여 넣기 및 다시 포맷 할 수 있습니다.

당신은 문제가 기억하는 경우 p그리고 P그것은 당신이 측면에서 그들을 생각하는 데 도움이 될 oO대칭의 일종이다 명령.

다른 사람들이 지적했듯이 gv시각적 선택을 다시 선택하는 데 사용할 수 있습니다 . 그러나 텍스트를 넣거나 붙여 넣은 경우 시각적 선택이 손실됩니다. 모든 변경하기 때문에 걱정하지 마십시오 (그리고 양키스!) 설정합니다 '[']변경된 주변. 따라서 들여 쓰기 >'](읽기 : 마지막 변경이 끝날 때까지 오른쪽으로 이동)를 사용 .하여 텍스트가 올바른 자리에 올 때까지 indention을 반복하십시오.

자세한 내용은 다음을 참조하십시오.

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

텍스트 블록을 이동하려는 행 번호를 알고있는 경우 :move명령으로 범위 또는 시각적 선택을 사용 하여 블록을 그곳으로 이동할 수 있습니다.

예를 들어 다음 파일이 있으면

1 aaa
2 bbb
3 ccc
4 ddd

c의 줄 다음으로 a의 줄을 이동하고 커서를 a의 줄에 놓고 입력 :m3한 다음 줄을 이동합니다.

+/- 오프셋에서도 작동합니다. 위의 예에서 :m+22 행을 아래로 이동 해도 동일한 결과를 얻을 수 있습니다 .

텍스트 블록의 경우 유일한 차이점은 범위 또는 선택 영역을 추가하는 것입니다. aaa 및 bbb 행을 파일 끝으로 이동하려면 :1,2m$($ = last line) 과 같은 명령을 사용 하거나 행을 시각적으로 선택하십시오 :m$.


1
자세한 :move내용은 vim.wikia.com/wiki/Moving_lines_up_or_down 또는 Tip 29 D. Neil 의 Book Practical Vim의 ': t'및 ': m'명령사용하여 줄 복제 또는 이동을 참조하십시오 .
Hotschke

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