Vim에서 자동 줄 바꿈 (들여 쓰기 유지)


92

나는 vim에서 전체 단어를 감싸는 방법을 설명하는 이 게시물 을 보고있었습니다 . 허용 된 해결책은 다음과 같습니다.

:set formatoptions=l
:set lbr

이 텍스트를 사용합니다 (탭은 \ t로 표시됨).

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

이렇게하면 다음과 같은 동작이 수행됩니다 (탭은 \ t로 표시됨).

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

그러나이 기능을 재정의하고 싶습니다. 줄 바꿈 된 줄 앞에 위의 줄에 1을 더한 것과 동일한 수의 탭이 있기를 바랍니다. 즉 :

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

어떤 아이디어?


34
질문을 최대한 명확하게하기 위해 취한 노력에 +1.
Jeffrey Jose

창 가장자리에서 텍스트를 부드럽게 감싸거나 줄이 특정 길이에 도달하면 하드 감싸기를 원합니까? 하드 랩핑 ( "will"이라는 단어 뒤에 개행 문자가 텍스트에 삽입되는 곳)을 원한다고 생각하지만, 예제에서 말하기는 어렵습니다.
Bill Odom

@Bill, 저는 주로 소프트 랩핑에 관심이 있지만 하드 랩핑 솔루션도 허용됩니다.
sixtyfootersdude

1
원하는 기능은 현재 Vim에 내장되어 있지 않습니다. 하지만 가까운 패치가 있습니다 : groups.google.com/group/vim_dev/web/vim-patches (# 15, "올바른 줄 바꿈 들여 쓰기").
Bill Odom

관련 : VimCasts는이 문제를 처리하기 위해 외부 유닉스 유틸리티를 사용하는 것에 대한 멋진 에피소드를 가지고있었습니다. vimcasts.org/e/18
Damien Wilson

답변:


18

breakindent 패치가 당신을 위해 무엇을 찾고있다. 이 스레드의 지침을 사용하여 성공적으로 적용했습니다.

Homebrew를 사용하는 OS X에서 breakindent 패치로 Vim 패치

특히 echristopherson의 Homebrew 공식.

이 스레드는 오래되었지만 Google에서 인기가 있으며 솔루션을 찾으려고 할 때 여러 번 발견했습니다.

수정 :이 패치는 이제 7.4.338 패치로 vim에 포함되어 있습니다. 참조 : https://retracile.net/blog/2014/07/18/18.00

Yosemite (Mac OS X)에서는 hombrew와 함께 snowbound의 명령을 사용했습니다.

brew install macvim --with-features=huge --override-system-vim --HEAD 

패치가 homebrew의 최신 macvim에서 작동하지 않는 것 같습니다. @ Exit42 어떻게 작동하게 되었습니까?
눈에 갇힌

nvm. 나는 homebrew bleeding edge로 macvim을 컴파일했습니다.brew install macvim --with-features=huge --override-system-vim --HEAD
snowbound

1
아래 내 대답을 참조하십시오. stackoverflow.com/questions/2828174/… 최신 버전의 vim에 패치가 필요하지 않습니다.
JoshuaD 2015

26

원래 질문을 받았을 때는 작동하지 않았지만 2014 년 6 월 25 일부터 작동합니다. (Vim을 해당 날짜보다 최신 버전으로 업데이트한다고 가정)

.vimrc에 추가하십시오.

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

그리고 그게 다야!

-

어떤 사람들 (나 자신도 포함)은 여러 컴퓨터에서 하나의 .vimrc를 공유합니다. 이 경우 성가신 오류 메시지를 방지하기 위해이 줄을 견고하게 만드는 것이 중요합니다. 이것은 조금 더 좋습니다.

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

이렇게하면 이전 버전의 vim을 사용하는 경우 오류 메시지가 표시되지 않습니다.


흥미롭게도 이것은 내 cygwin의 7.4 vim에서 작동하지만 unbuntu의 7.4 vim에서는 작동하지 않습니다. 나는 그것이 좀 더 널리 퍼져 야한다고 생각하지만 곧 보편적으로 채택 될 것입니다.
JoshuaD

1
Vim 7.4 @ ArchLinux에서 작동합니다.
Andy Mikhaylenko 2014 년

1
대신이 테스트를 사용할 수 있습니다 :if has("patch-7.4.354")
로렌스 Kesteloot

이것은 OP의 발언에 관한 질문에 대답하지 않습니다 : 동일한 수의 탭 (...) + 1 . 그건 그렇고 제 생각에도 매우 중요합니다. 종종 추가 들여 쓰기를 유지하고 래핑 된 세그먼트를 오른쪽으로 광학적으로 이동하고자 할 수 있습니다 (단단하게 배열 된 목록, 메모 등).
피 묻은

8

당신이 얻을 수있는 최선의 showbreak방법은 각 줄 바꿈 된 줄 앞에 고정 된 문자열을 넣는 옵션입니다 ( set showbreak=...).


@AlexanderBird에 따르면 :help 'showbreak', 당신은 할 수 없습니다 – showbreak단지 문자열입니다.
Rory O'Kane 2013-08-05

4

'showbreak'가 최선의 선택이라는 답변에 동의합니다. Showbreak는 일반적으로 인쇄되지 않는 문자 (예 : 공백 또는 탭)를 showbreak 문자열에 넣는 것을 허용하지 않으므로 일반적으로 사용되는 것처럼 왼쪽 여백을 따라 표시기를 제공합니다. 즉, 실제 들여 쓰기가 없습니다. OP의 주요 목표는 줄 바꿈 된 줄을 들여 쓰기하여 왼쪽 여백 영역을 어지럽히고 자체 줄처럼 보이지 않도록하는 것이기 때문에 이것은 좋지 않습니다.

따라서 showbreak를 사용하여 (추악한) 들여 쓰기를 추가하는 한 가지 방법은 많은 문자를 사용하는 것입니다 (예 : ": set showbreak => --------------->"). 결과는 다음과 같습니다.

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

더 나은 대안은 ctrl-v, 160의 키 시퀀스를 사용하여 각 문자를 쇼 브레이크 문자열에 입력 할 수있는 공백 문자 (Vim의 인스턴스가 유니 코드를 사용한다고 가정)를 사용하는 것입니다. 이렇게하면 왼쪽이 비어 있고 실제 들여 쓰기로 보이는 표시 중단 문자열을 입력 할 수 있습니다. 예 : ": set showbreak =.......... >>"여기서 각 '.' 명령에서 실제로는 ctrl-V, 160을 눌러 입력 한 비 분리 공백 문자입니다. 이렇게하면 다음과 같이 멋지게 들여 쓰기 된 랩이 완성됩니다.

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

여전히 이전 줄의 들여 쓰기에 따라 들여 쓰기 수준을 변경할 수있는 능력은 없지만 적어도 창의 왼쪽 여백을 따라 시각적으로 복잡하지 않고 줄 바꿈 된 줄을 깔끔하게 들여 쓰기합니다. 줄 바꿈 된 줄의 들여 쓰기가 실제 줄의 시작 부분보다 적 으면 여전히 혼동이있을 수 있습니다. 그러나 이것은 쇼 브레이크 "들여 쓰기"를 상당히 크게 만들어서 피할 수 있습니다 (예 : 코드에서 일반적으로 발견되는 어떤 들여 쓰기보다 크게). ) 텍스트를 읽을 수있는 줄 바꿈을위한 충분한 공간을 제공 할만큼 충분히 작습니다. 많은 용도에 대해 40 또는 50 공백의 쇼 브레이크 들여 쓰기가이를 잘 수행 할 것이라고 생각합니다.


7
공백을 이스케이프하여 쇼 브레이크에 넣을 수 있습니다 :set showbreak=\ \ \ \ .. 그러나 탭에서는 여전히 작동하지 않습니다.
Bill Odom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.