텍스트를 80 열로 재구성 / 강제하는 vim 명령


240

Vim 80 열 레이아웃 문제set textwidth 와 같이 vim에서 텍스트 너비를 자동으로 설정하는 방법이 있다는 것을 알고 있습니다 . 내가 찾고있는 것은 (indent line 명령) 과 비슷 하지만 80으로 줄 바꿈하는 것입니다. 사용 사례는 때로는 텍스트 너비로 텍스트를 편집하고 줄을 결합하거나 텍스트를 삭제 / 추가 한 후 제대로 줄 바꿈되지 않는 경우가 있습니다.=

이상적으로,이 명령은 내가 선택한 줄을 완전히 재구성하고 짧은 줄을 추가하면서 긴 줄을 잘라냅니다. 예를 들면 :

long line is long!  
short

명령을 실행 한 후 (랩이 13 열이라고 가정) :

long line is  
long! short

이것이 진정한 vim 명령으로 가능하지 않다면, 아마도 입력을 파이프 할 수있는 명령 행 프로그램이 있습니까?

검색 후 나는 더 많은 옵션이있는이 참조를 발견했다 : http://www.cs.swarthmore.edu/help/vim/reformatting.html


9
Vim이 par 같은 외부 프로그램에 텍스트 형식을 위임 할 수 있다는 것도 알고 싶습니다 . par로 텍스트 서식을 지정 하는 방법을 보여주는 스크린 캐스트를 만들었습니다 .
nelstrom

@nelstrom 감사합니다. TIL about par. 환상적이야!
Steven Lu

2
당신은 텍스트 (? 잘 잘라) 슬림 모양 및 트림 할 때, 항상 생각 gq- 신사의 분기 . (남성 의인화, 니모닉 효과에 대한 사과.)
ruffin

답변:


372

textwidth80 ( :set textwidth=80)으로 설정 하고 파일의 시작 부분으로 이동 한 다음 ( Ctrl- Home또는 으로 수행 가능 gg)을 입력하십시오 gqG.

gqG텍스트를 현재 위치에서 시작하여 파일 끝으로 서식을 지정합니다. 가능하면 연속적인 라인에 자동으로 연결됩니다. 두 줄을 연결하지 않으려면 두 줄 사이에 빈 줄을 둘 수 있습니다.


14
또한 시각적 인 선택과 함께 작동합니다. 즉 : V}gq. 이런 식으로 실제로 서식을 지정하기 전에 서식을 지정할 것을 볼 수 있습니다.
Plouff December

6
그건 그렇고, q그 자체로 정확히 무엇을 합니까?
Richard-Degenne

1
공백이없는 하나의 긴 문자열 인 줄 로이 작업을 수행 할 수 있습니까? 편집 : "접기"유틸리티를 발견했습니다. vi 에서이 작업을 여전히 궁금합니다.
Donald Smith

7
시간을 절약 하는 set tw=80대신 사용set textwidth=80
Yibo Yang

4
@dmranck set textwidth=76입력 한 줄은 자동 줄 바꿈됩니다. 내 불만은 편집중인 기존 라인에 아무런 영향을 미치지 않는다는 것입니다. 그러나 V}gq그 점에서 매우 유용합니다. V시각적 선택 모드로 들어가서 }다음 단락 나누기로 아래로 선택 gq하고 현재 포맷터를 실행합니다 (또는 gwvi 포맷터를 명시 적으로 호출하는 데 사용 ). 또한 {위쪽으로 선택합니다. ggVGgq더 쉬운 방법이 있지만 전체 문서와 형식을 선택할 수 있습니다 . @쉽게 사용할 수 있도록 매크로로 저장하십시오 . vipgq현재 단락을 fmt하는 데 사용 합니다.
ktbiz

94

Michael의 솔루션이 핵심이지만, 현재 단락의 나머지 부분을 다시 포맷하려고합니다. 이 동작에는을 사용하십시오 gq}.


17
이것으로 확장-gq <motion>을 사용하여 원하는 형식을 지정할 수 있습니다.
Dan Schnau

1
또한 'nojoinspaces'옵션은 선이 문장 경계에서 결합 될 때 마침표 이후에 두 공백이 나타나지 않도록합니다. 인쇄 스타일이 영어 문장 사이의 단일 공백 ​​인 경우에 좋습니다.
Alex Hirzel

36

gq모든 이동 연산자와 함께 사용할 수 있습니다 . 예를 들어 현재 줄의 끝으로 만 서식을 바꾸려면 (예 : 커서가있는 줄을 줄 바꿈) 다음을 사용할 수 있습니다.gq$

시각 모드에서 텍스트를 선택하고 (`v를 사용하여 이동) gq를 입력하여 다시 포맷 할 수도 있습니다.

줄을 강제로 감는 다른 옵션도 있습니다.

텍스트를 재구성하기 위해 끝까지 기다릴 필요없이 텍스트를 삽입하는 동안 vim이 줄을 줄 바꿈하려면 다음 옵션이 유용합니다.

:set textwidth=80
:set wrapmargin=2

( wrap및로 측면 추적하지 마십시오 linebreak. 화면에 표시되는 텍스트 만 다시 포맷하고 버퍼의 텍스트는 변경하지 않습니다)


9
에서 wrapmargin도움 'textwidth'가있을 때이 옵션을 사용하지 않은 제로.
mmoya

21

DonaldSmith의 의견 덕분에 textwidth옵션이 긴 텍스트 줄을 다시 포맷하지 않았기 때문에 이것을 찾았습니다 (16 진수 변환을 사용하여 게임을 변환하고있었습니다).

:%!fold -w 60

그것은 전체 파일 (나에게 한 줄)을 길이가 60 줄로 재구성했습니다.


1
이것은 매우 좋군요. 모든 답변은 줄이 공백으로 단어로 나눌 때 줄의 너비를 제한하는 데 중점을 둡니다. 이 솔루션은 매우 긴 단어 (DNA 시퀀스)에 적용됩니다.
pedrosaurio

1
긴 URL의 경우 이것이 내가 찾은 유일한 것입니다. 나는 textwidth에 대해 이미 새로운 것이지만 깨지지 않은 문자열 (보통 좋은 것)을
깨지 않을

13

비 Vim 방식을 찾고 있다면 항상 UNIX 명령이 있습니다. fmtpar가 있습니다.

노트:

  • 유니 코드에 대해서는 언급 할 수 없으며 다르게 동작하거나 그렇지 않을 수 있습니다.
  • @nelstrom은 이미 사용하여 언급했습니다. par 그의 웹 캐스트에서 을 했습니다.

다음은 두 가지 예를 모두 사용하는 방법입니다.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Vim 내부에서 사용하려면 :

:%! fmt -w 13
:%! par 13gr

:formatprgpar 또는 fmt 및 override로 설정할 수도 있습니다 gq. 자세한 내용은 :help formatprgVim 내부에 문의하십시오 .


9

거의 항상 gq비주얼 모드에서 사용 합니다. 저는 학생들에게 까다로운 사람들을위한 잡지 인 '신사 분기'를 의미한다고 말합니다.

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