vim에서 긴 줄을 끊는 방법?


12

나는 매우 큰 텍스트 파일을 다음과 같은 블록으로 구성했습니다.

Short line.
Really long line.
Short line.

빈 줄로 분리하고 vim (Linux에서)을 사용하여 긴 줄을 나누고 다음과 같은 블록을 얻고 싶습니다.

Short line.
This was
part of
a long line.
Short line.

gq(및 gw)의 문제 는 각 블록을 전체 단락으로 리플 로우한다는 것입니다. 즉, 각 블록 내에서 두 줄 바꿈을 유지하지 않으며 형식 옵션 :help fo-table중 어느 것도 gq내가 원하는 것을 할 수 없게합니다. 또한 줄 바꿈 문자를 단락 구분 기호로 정의 할 수 있다면 목표를 달성 할 수 있다고 생각했지만 :help paragraph그 문자에 따라 하드 코딩되었습니다.

편집 : 각 긴 줄을 하나씩 사용 gq하거나 gw형식을 지정할 수 있다는 것을 알고 있지만 파일이 수천 줄 이상 실행되므로 자동으로 달성하는 방법을 찾고 있습니다.


그건 그렇고 : 나는 vim의 문서, 여기 SU와 웹에서 내 문제에 대한 해결책을 찾았다. 분명한 것을 간과 한 경우이 질문을 기꺼이 삭제하겠습니다.
AP


@ MartinSchröder : vi SE가 있다는 것을 알게되어 기쁩니다! 이미에 대해 알고 있기 때문에 그 대답은하지만, 내 문제를 해결하지 않습니다 gqgw. 나는 거기에서 멈추지 않았기 때문에 기쁘다. 그렇지 않으면 나는 :g명령 에 대해 배우지 않았을 것이다 . :)
AP

답변:


16
:%norm! gww

이것은 커스터마이즈 된 매핑을 고려하지 않고 (예를 들어, 다른 것에 매핑 된 경우 문제를 피하기 위해) 전체 버퍼에 normal명령을 적용합니다 gww(와 같이 현재 행을 형식화합니다 ).gwgw

보다

  • :help :%
  • :help :norm
  • :help gww

이 대안은 의견에 대한 Ben의 제안에 따르며 정규 솔루션 일치 기능으로 인해 다른 유사한 상황에 더 잘 맞을 수 있기 때문에 원래 솔루션보다 더 간단합니다. "모든 라인 일치"의 경우에는 불필요하게 무차별 적입니다.


gww프로그래밍 방식으로 버퍼의 모든 개별 라인에 적용 :

:g/^/norm gww

참조 :help :g:help norm. ^줄의 시작과 일치하며 실제로는 모든 줄 과 일치 합니다 .

예를 들어 60자를 초과하는 줄만 선택할 수도 있습니다.

:g/\%>60v/norm gww

(참조 :help \%<) 그러나 실제로 gwwtextwidth어쨌든 보다 긴 행만 다시 포맷 하므로 속도 나 결과에 큰 영향을 미치지 않을 수 있습니다.

(내가 사용하고 v대신 "가상 열"에 대한 c후자는 정말 라인에 바이트의 특정 수를 계산하기 때문에, "열"에 대한. 경계해야하는 이유가되며, 대개 멀티 바이트 인코딩을 사용하는 경우이 예기치 않은 결과가 발생할 수 있습니다. 실제로는 위와 같은 이유로 실제 gww줄이 아닙니다 textwidth. 어쨌든 짧은 줄을 다시 포맷하지는 않습니다 .)


분명히 :g그렇게, 패턴없이 실패하는 :g//norm gww일을하지 않지만 :g/.*/norm gww않습니다.
AP

@AP : 허, 저에게 효과적입니다. Debian Unstable의 Vim 7.4.488-6을 사용하고 있습니다.
Daniel Andersson

4
:g//마지막 검색 패턴을 재사용합니다. 아무것도 없으면 실패합니다. 모든 라인 :g/^/에 적용하는 데 사용 합니다 .
Ingo Karkat

@ IngoKarkat : 아, 테스트하는 동안 마지막 패턴은 나중에 보여 줄 길이를 알았으므로 의미가 있습니다. 답변을 업데이트하겠습니다. 이 "빈 패턴"동작이 어디에 도움이되는지 알고 있습니까? 나는 그것을 사소하게 찾을 수 없습니다.
Daniel Andersson

매뉴얼을 살펴보면 :help last-pattern일반 검색에 제공된 정보 가 :global명령 에도 적용 된다는 것을 암시합니다 .
Daniel Andersson

4

gqand gw명령에 대한 매뉴얼을 이미 읽었 으므로 수동으로 긴 행으로 이동 한 다음 gw0, gw$또는 다른 gw명령을 사용하여 현재 행의 형식을 지정하는 것보다 더 편리한 것을 원할 것 입니다.

Vim에서 텍스트 블록 위로 긴 줄을 나누는 쉬운 방법을 모르겠습니다. 그러나 GNU / Linux 시스템에서 Vim을 사용한다고 언급 했으므로 GNU fmt명령을 통해 텍스트를 필터링하는 것이 좋습니다 .

전체 파일의 경우 :

:%!fmt --width=75 --split-only

현재 단락의 경우 (짧은 옵션 사용) :

:'{,'}!fmt -75 -s

관련 fmt옵션 에 대한 설명은 다음과 같습니다.

  • -w, --width=WIDTH– 최대 행 너비 (기본값은 75 열). 이 옵션 -WIDTH은 약식입니다 --width=DIGITS(이 약식 버전을 사용하는 경우 첫 번째 옵션이어야 함).

  • -s, --split-only– 긴 줄을 나누지 만 다시 채우지 마십시오. 기존 하드 줄 바꿈을 유지하는 옵션입니다.


언급 해 주셔서 감사합니다 fmt. vim 만 필요하기 때문에 다른 답변을 수락하는 것이 좋습니다.
AP

@AP 걱정하지 마십시오. 대단한 답변이며 직접 받아 들였습니다. 그것과 당신의 질문은 공감합니다.
Anthony Geoghegan

1

에서:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

마커를 "lorem ipsum"라인에 놓고 gww수율을 누르십시오 ( textwidth=40명확성 을 위해).

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

나에게 당신이 요구하는 것 같습니다. 그렇지 않은 경우 명확하게 설명하십시오.

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