Vim의 스마트 랩


80

Vim이 코드 줄을 스마트 랩핑하는 기능이 있는지 궁금해서 들여 쓰기하는 줄과 동일한 들여 쓰기를 유지합니다. 나는 전자 텍스트 편집기와 같은 다른 텍스트 편집기에서 그것을 발견하고 내가보고있는 것을 더 쉽게 이해하는 데 도움이된다는 것을 발견했습니다.

예를 들어

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

그것은 다음과 같이 나타날 것입니다

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>


상황이 변경되면 답변을 다시 검토해야합니다.

1
사용 :set autoindent하고:set smartindent
Shammel 리

답변:


62

이 기능은 2014 년 6 월 25 일 7.4.338 패치 로 구현 되었습니다 . 기능을 개선하는 몇 가지 패치가 뒤따 랐으며 마지막은 7.4.354이므로 원하는 버전입니다.

:help breakindent
:help breakindentopt

아래 vim 도움말에서 발췌 :

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

또한 이것과 관련이 있습니다 showbreak 설정과 사용자가 지정한 문자로 시프트 금액이 추가됩니다.

구성 예

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>   

행동에 대한 참고 사항

sbr옵션을 지정하지 않으면 showbreak모든 문자가 들여 쓰기에 추가됩니다. sbr위의 예에서 제거 하면 4 자의 효과적인 들여 쓰기가 발생합니다. showbreak추가 들여 쓰기없이 사용하려는 경우 해당 설정으로 shift:0.

또한 음수 시프트를 적용하여 showbreak문자 및 줄 바꿈 된 텍스트를 사용 가능한 들여 쓰기 공간으로 다시 끌 수 있습니다.

min값을 지정할 때 터미널 너비가 좁 으면 이동 된 양이 스쿼시되지만 showbreak문자는 항상 유지됩니다.


2
간단히 말해서, set breakindentvim 구성에 추가 하면 줄 바꿈이 이루어지고 들여 쓰기에서 줄 바꿈됩니다. 마치 새 줄인 것처럼 다음 줄에서 줄 바꿈하고 시작하는 대신입니다.
james2doyle

3
그리고 set breakindentopt=shift:4vim 구성에 추가하면 추가로 4 개의 공백이 들여 쓰기됩니다.
fritzo

이 답변은에 대한 더 많은 예제를 추가하면 도움이 될 것입니다 breakindentopt. 구문은 도움말 문서에서 명확하지 않습니다. 귀하의 의견에 예를 들어 @fritzo에게 감사드립니다.
Mnebuerquo

33

이것에 대한 패치가 있지만 몇 년 동안 남아 있고 마지막으로 확인했을 때 깨끗하게 적용되지 않았습니다. http://groups.google.com/group/vim_dev/web/vim-patches의 "올바르게 줄 바꿈 된 줄 들여 쓰기"항목을 참조 하세요.이 항목 이 메인 라인에 포함되기를 바랍니다.

업데이트 : 그 링크가 조금 썩은 것 같습니다. 다음은 패치의 최신 버전입니다 .

업데이트 2 : 업스트림 에 병합 되었으므로 (7.4.345 기준) 이제 :set breakindent.


나는 HTML 마크 업 방법은 읽기 쉽게 만들 수 있습니다, 매우 많은 것을하고 싶습니다
호세 Elera

해당 사이트에 패치가 없습니다. 다른 사람이 확인할 수 있습니까?
puk

분명히 사이트는 최근에 재건되었으며 링크가 끊어졌습니다. 같은 사이트에 더 새로운 패치가 적용된 최근 블로그 항목이 있습니다.
ergosys 2012

1
이것은 정말 누락되었습니다. 왜 이것이 주류에 있지 않은지 모르겠습니다. 패치가 아주 잘 작성 되었기 때문입니다.
cseelus

2
업데이트에 대해 @Vitor Eiji에게 감사드립니다. 이것은 굉장한 소식입니다.
ergosys jul.

17

정확히 동일한 들여 쓰기가 가능하지 않다고 생각하지만 'showbreak'옵션을 설정하면 더 나은보기를 얻을 수 있습니다.

:set showbreak=>>>

예:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

Vim은 '>>>'에 다른 색상을 사용하기 때문에 실제는 위의 예제 코드보다 더 좋아 보입니다.


5
또한 사용할 수 있습니다 :set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ (백 슬래시 공백 조합은 구분 문자 공백을 만듭니다. 따라서 대부분의 래핑 된 코드보다 더 깊어 지도록 충분한 공백을 추가 할 수 있습니다 (예 : 10 개의 공백은 2 개의 4 개의 공백 탭보다 깊고 14 개는 3 사 개 공간 탭) 공간의 멋진 기능은 만약 당신이 원하는 덜 시각) (산만하게된다는 점이다.
제로미 Anglim

7
@Jeromy Anglim 사소한 수정 : set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ 그 때 훨씬 덜 읽기 let &showbreak=repeat(' ', 14)
쉽습니다

8

업데이트 : 2014 년 6 월 breakindent옵션 을 지원 하는 패치가 Vim에 병합되었습니다 (최상의 지원을 위해 버전 7.4.346 이상).


:set nowrap오른쪽으로 스크롤하여 vim이 긴 줄을 표시하도록 할 수도 있습니다 . 이것은 문서의 전체 구조를 조사하는 데 유용 할 수 있지만 실제로 편집하는 데는 덜 편리 할 수 ​​있습니다.

찾고있는 항목에 가까운 다른 옵션은 linebreakshowbreak입니다. 를 사용하면 showbreak줄 바꿈 된 줄의 왼쪽 여백에 표시되는 내용을 수정할 수 있지만 안타깝게도 현재 컨텍스트에 따라 변수 들여 쓰기를 허용하지 않습니다.


5

이 작업을 수행 할 수있는 유일한 방법은 리턴 문자 (Cfreak에서 언급했듯이)를 사용하고 textwidth옵션을 다양한 들여 쓰기 옵션 과 결합하는 것입니다. 들여 쓰기가 올바르게 구성된 경우 (기본적으로 내가 믿는 html 구문을 사용하지만 그렇지 않으면 autoindentsmartindent옵션이 표시됨) 다음을 수행 할 수 있습니다.

:set formatoptions = tcqw
:set textwidth = 50
gggqG

formatoptions설정을 사용자 정의한 경우 다음을 수행하는 것이 더 좋습니다.

:set fo += w
:set tw = 50
gggqG

이것이하는 일 :

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

이것은 소프트 랩과 동일하지 않다는 점에 유의하십시오. 소스 파일과 화면의 라인을 랩핑합니다 (물론 저장하지 않는 한!). 입력 할 때 formatoptions자동 서식이 지정 되는 추가 할 수있는 다른 설정이 있습니다 :help fo-table.

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

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'

3
:set smartindent
:set autoindent

그래도 여전히 반품을 사용해야한다고 생각합니다.


2

HTML이 충분히 잘 구성된 경우 xmllint를 통해 실행하면 도움이 될 수 있습니다.

:%!xmllint --html --format

2

매크로 솔루션 :


편집하다:

작동 gq{motion}은 변수 "textwidth"가 설정된대로 자동 형식화됩니다. 이것은 80lBi^M내 매크로에 대해 사용하는 것보다 더 쉽고 / 낫습니다 .


자동 들여 쓰기를 활성화 한 경우

:set autoindent

그런 다음 줄 끝에 return을 입력하면 다음 줄을 같은 양만큼 들여 쓰게됩니다. 원하는 경우이를 사용하여 줄 바꿈에 하드 입력 할 수 있습니다. 다음 매크로는이를 활용하여 텍스트를 자동으로 들여 씁니다.

레지스터 z를 다음과 같이 설정합니다.

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

레지스터 x를 다음과 같이 설정하십시오.

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

그런 다음

@x   

매크로를 활성화합니다. 몇 초 후 텍스트는 모두 80 자 이하의 적절하게 들여 쓰기 된 줄로 표시됩니다.

설명:

다음은 매크로에 대한 설명입니다.

파트 1 (매크로 z) :

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

파트 2 (매크로 x) :

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one WORD (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

주의 사항 :

  • 이 매크로는 80 자 이상의 WORD가있는 경우 중단됩니다.

  • 이 매크로는 태그 뒤의 줄 들여 쓰기와 같은 현명한 작업을 수행하지 않습니다.

  • lazyredraw 설정 (: set lazyredraw)을 사용하여 속도를 높입니다.

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