Vim에서 선택된 라인 순서를 어떻게 바꾸나요?


94

예를 들어 다음과 같이 네 줄이있는 경우 :

첫 번째 줄
두 번째 줄
세 번째 줄
네 번째 줄

나는 그것들을 반대로 바꾸고 싶다

네 번째 줄
세 번째 줄
두 번째 줄
첫 번째 줄

Vim에서 어떻게 할 수 있습니까?




1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
qeatzy

답변:


86

파일의 모든 줄을 반대로 바꾸려면

:g/^/m0

설명을 보려면

:help 12.4

또한 선의 범위를 반대로 바꾸는 방법도 보여줍니다.


12
정확한 도움말 섹션에 대한 유용한 팁! 요약하려면 : 1. 역전을 원하는 마지막 줄에 마커를 설정하고 (을 사용하여 마커 이름을 'a'로 지정 ma) 2. 커서를 블록의 첫 번째 줄로 이동합니다. 3. type:'a,.g/^/m 'a
Brent Faust

68

원하는 선을 선택 !하고을 누른 다음 결과 프롬프트에서 선을 tacla를 통해 파이프합니다 :'<,'>!tac. 자세한 내용 man tac은 참조하십시오.


4
선을 선택하려면을 사용 shift+v하여 시각적 선 모드를 시작한 다음 j선을 선택에 추가하십시오.
wisbucky

이 창에서도 작동한다는 것을 확인할 수 gvim있습니다! 그렇지 않으면, 절대 줄 번호를 사용해야합니다 (아마도 상대를 사용할 수는 있지만 조심 :g/^/m0해야합니다). 당신은, 그러나 그것은 100 % vimscript가 아닙니다, 그러나 관심있는 사람 : P
dylnmc

tac은 완전 네이티브 vim 처리는 아니지만 'm'ove 명령은 줄 번호를 사용하므로 항상 합리적인 것은 아닙니다. 나는 종종 범위의 일부로 마크를 사용하므로 :.,'a!tac최소한의 노력으로 작동합니다.
studog

사용 후 shift+v, 당신이 사용할 수있는 }다음 단락, 또는 비어있는 수직 공간까지 도달 할 수 있습니다. 또한 man tac: concatenate and print files in reverse.
닐론

33

Mac OS X tac에는 존재하지 않지만 tail -r동일한 효과를 사용할 수 있습니다 .

:%!tail -r

이것은 시각적 모드에서도 잘 작동합니다.

:'<,'>!tail -r

tail(1)의 맨 페이지 에서 발췌 :

-r 옵션을 사용하면 입력이 행별로 역순으로 표시됩니다. 또한이 옵션은 -b, -c 및 -n 옵션의 의미를 변경합니다. -r 옵션이 지정되면이 옵션은 표시를 시작할 입력의 시작 또는 끝에서 바이트, 행 또는 블록 대신 표시 할 바이트, 행 또는 512 바이트 블록 수를 지정합니다. -r 옵션의 기본값은 모든 입력을 표시하는 것입니다.


3
우수한! OS X에서 'tac'을 제공하려면 :alias tac='tail -r'
Brent Faust

4
당신은 또한 brew install coreutils사용할 수 있습니다 gtac.
Andrew Marshall

1
천재. 사용을 생각하지 마십시오! 이 유형의 비주얼 라인 조작에 대한 명령.
Charlie Dalsass

3

시각 모드에 익숙한 사용자를 위해 :
1.를 사용하여 뒤집 으려는 선택 위의 줄 번호를 식별하십시오 :set nu.
2. Shift-V뒤집기를 원하는 선택을 강조 표시합니다 (시각적 모드).
3 :g/^/m <Line number from step 1>.

비주얼 모드에서는 :'<,'>g/^/m <Line number>3에서 명령을 입력 할 때 자동으로 표시됩니다 .

이 명령은 한 번에 한 줄씩 선택한 줄 번호로 이동하여 작동합니다. 두 번째 항목이 주어진 줄 번호로 푸시되면 첫 번째 줄을 줄 번호 + 1로 푸시합니다. 그런 다음 세 번째 항목은 전체 목록이 단일 줄 번호로 푸시 될 때까지 첫 번째와 두 번째 줄을 아래로 푸시합니다. 역순으로 정렬 된 목록.


4
'<줄 번호를 수동으로 입력 하는 대신 대신 사용할 수 있습니다. 한 줄 이전에 선택을 시작하고 실행하십시오 :'<,'>g/^/m'<.
Palec

3

에 대한 명령 :Rev[erse]및 선택적 매핑이므로이 vimrc레시피의 명백한 단계를 기억하고 수행 할 필요가 없습니다.

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

( 인쇄 가능한 문자를 매핑하는 데 도움이 :xmap되므로 시각적으로는 선택되지만 선택 모드는 아닙니다 :help mapmode-x.)

( http://tech.groups.yahoo.com/group/vim/message/34305 기반 )


허용되는 답변 IMO 여야합니다. 가장 일반적으로 유용하고 기억할 필요가 없습니다 :'<,'>g/^/m'<:)
Eliot

1
@ 엘리엇, 감사합니다! :) (나는 약간의 '보너스 콘텐츠'를 추가했습니다.;))
Aaron Thoma

이 경우 선택 시작 -1을 어떻게 알 수 있습니까? 이 시점에서 이동이 시작되기 때문입니다.
SergioAraujo

@SergioAraujo : :-1,+1Rev찾고 있는 것과 같은 것이 있습니까? 반전하려는 범위를 시각적으로 선택할 수 있습니다 (예 :) V7j:Rev. 그래도 귀하의 질문에 대한 답변이 없으면, 이해하지 못 했으므로 정교하게 바꾸거나 다시 바꿔야합니다.
Aaron Thoma

1

3 행에 있다고 가정하면 3에서 6까지의 범위가 있습니다.

:3,6g/^/m2

1
현재 줄 번호를 암시 적으로 남겨 둘 수 있습니다. 커서를 범위의 첫 줄에 놓으면 :,6g/^/m2; 또는 범위의 마지막 줄에있을 때 : :3,g/^/m2; 그리고 :3,6g/^/m2어디서나 파일에서 작동합니다.
Aaron Thoma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.