Vim 80 열 레이아웃 문제


417

Vim에서 80 열 표시를하는 방식이 올바르지 않은 것 같습니다 set columns=80. 때때로 나는 또한 대안으로 set textwidth라인 오버플로를보고 기대할 수 있기를 원합니다 set columns.

이것은 일부가 불행한 부작용 :

  1. set number줄 번호가 다른 파일 사이를 분할하는 것을 두려워 할 수 없습니다 . 즉, <100 개의 줄 파일과> = 100 개의 줄 파일은 set columns추가 숫자 표시에 사용되는 추가 열 때문에 두 개의 다른 값 이 필요 합니다.
  2. 또한 창을 세로로 나누지 않고 새로운 (g) Vim 세션을 시작합니다. 이것은 창을 열거 나 닫을 때마다 vsplit강제로 실행 set columns되므로 새 세션을 시작하는 것이 번거 로움 이 없기 때문 입니다.

set numbers, 수직 분할 등 을 원할 때 80 자 표시를 어떻게 처리 합니까?


60
많은 서클에서 좋은 코드 스타일로 간주됩니다. 예를 들어, 파이썬의 스타일 가이드 (PEP8)는 79 개 캐릭터 라인을 권장합니다 python.org/dev/peps/pep-0008
cdleary

4
절대적으로 "80 개의 문자 줄이 있어야합니다"는 아니지만 크기를 조정할 수있는 GUI 콘솔 창에서 실행되지 않는 콘솔 기반 응용 프로그램과 같은 일부 시스템에서 읽기가 더 좋습니다.
Matthew Scharley

47
@ davr : 먼저, 읽기가 더 쉽습니다. 일부 연구에 따르면 짧은 줄 길이 (한 줄에 76 자)가 온라인에서 가장 읽기 쉽고 가장 빠릅니다. 당신은 이것을 알고 있습니까 : 갑자기 읽을 때 당신의 눈이 틀린 줄에 있습니까? 이것은 거의 80 자에서 발생하지 않습니다. 둘째로, 나는 종종 1600 픽셀 너비의 모니터에서 두 파일을 나란히 편집하거나 시각적으로 비교합니다. 파일에 80자를 초과하는 줄이없는 경우에만 잘 작동합니다. 따라서 효율적으로 작업하기 전에 긴 줄을 다시 포맷하는 경우가 많습니다.
nalply 2009

25
@davr 여러 파일을 나란히 편집하는 데 매우 유용합니다.
aehlke

2
커널 코드 스타일에서 80 문자 행 너비를 채택했기 때문에 C / C ++ 및 JS 코드 모두에서 훨씬 적은 버그를 만듭니다. 나는 가끔 ... 거의 몇하여 오버 플로우,하지만
마크 K 코완

답변:


586

내 .vimrc 에이 설정이 있습니다.

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

이것은 80 열 제한을 초과하는 텍스트에 대해 미묘한 빨간색으로 배경을 강조 표시합니다 (GUI 모드에서는 미묘하지만 터미널 모드에서는 덜 중요합니다).


3
좋은 생각이야! 내 요구에 더 잘 맞게 "ctermbg = darkred"및 "guibg = # FFD9D9"로 변경했습니다 (cvim 모드의 밝은 배경과 cvim 모드의 어두운 배경).
HS.

10
미묘한 수정은 /\%81v.\+/라고 생각합니다. 어떤 이유로. *는 문자가 존재하지 않는 장소를 강조 표시합니다.
cdleary

14
일치하는 정규 표현식에 대해이 줄이 약간 더 좋습니다. +1이 아닌 행 길이
David Terei

8
어떤 이유로 그것은 내 vim에서 나를 위해 첫 번째 열린 버퍼 (첫 번째 탭의 첫 번째 창)에서만 작동합니다 ...
lajarre

3
이 솔루션이 첫 번째 버퍼에서만 작동하는 경우 stackoverflow.com/a/10993757/9822를 확인하십시오 .
Jesse Vogt

769

vim 7.3부터 set colorcolumn=80( set cc=80짧게) 사용할 수 있습니다 .

이전 버전에서는이를 지원하지 않으므로 .vimrc대신 다음을 사용합니다.

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

옵션 에 대한 온라인 설명서colorcolumn 도 참조하십시오 .


26
다음과 같이 'colorwidth'값을 'textwidth'를 기준으로 자동 설정할 수도 있습니다. set cc = + 1
graywh

1
has ( "colorcolumn")가 작동하지 않았습니다. 대신 exist ( "& colorcolumn")를 사용해야했습니다.
SpoonMeiser

5
vim <7.1.40이 matchadd를 지원하지 않는다는 점을 제외하면 매우 좋습니다.
Greg Jandl

19
다음과 같이 열의 색상을 변경할 수도 있습니다.highlight ColorColumn ctermbg=7
null_radix


54

더 짧은 방법 :

match ErrorMsg '\%>80v.\+'

8
긴 세로선으로 버퍼를 오염시키지 않기 때문에 이것을 정말 좋아합니다! (Y)
Ionică Bizău

ErrorMsg입니다 highlight-group. Vim에는이 경우에 원하는 색상 인코딩을 기반으로 사용할 수있는 많은 기본 강조 그룹이 있습니다.
crisron

49

나는 선호한다:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

난이게 좋아. 나는 회색 대신 검은 색을 사용했으며 배경이 거의 검은 색이지만 꽤 좋지 않기 때문에 더 미묘했습니다.
Isopycnal Oscillation

30

사이먼 하워드의 대답은 훌륭합니다. 그러나 /\%81v.\+/열 81을 초과하는 탭을 강조 표시하지 못합니다. 그래서 VIM 위키 에서 찾은 내용 과 HS의 색상 선택에 따라 약간의 조정을했습니다 .

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

이제 VIM은 열 80을 초과하는 모든 항목을 강조 표시합니다.


2
guifg=white거기에 끝에 추가하고 싶을 수도 있습니다.
Dan Bechard

17

여기에 이미지 설명을 입력하십시오

최소한의 최고의 접근 방식. 너무 긴 줄의 79 번째 문자 만 강조 표시됩니다. 몇 가지 일반적인 문제를 극복합니다. 새 창에서 작동하고 넘친 단어가 올바르게 강조 표시됩니다.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

참고 : FileType scala,java이것은 Scala 및 Java 소스 파일로 제한됩니다. 아마도 이것을 사용자 정의하고 싶을 것입니다. 생략하면 모든 파일 형식에서 작동합니다.


왜 추가 FileType scala,java했습니까? (나를 위해 작동하지 않음)
Dorian

1
@Dorian은 스칼라 및 Java 파일 형식으로 제한합니다. 당시에는 파일 형식 이었기 때문입니다. 나는 그것을 언급하지 않았습니다. 답변을 업데이트합니다.
Dominykas Mostauskis

스크린 샷에서 어떤 글꼴을 사용하고 있습니까? 나는 그것을 매우 기쁘게 생각합니다.
Rook

@Idigas : 동의합니다. 아마도 PuTTY를 처음 설정할 때 Comic Sans가 잘못된 선택이었을 것 같습니다 :)
Mark K Cowan

이 답변의 스 니펫을 Vim 7.4에서 작동시킬 수 없었습니다. (FileType 필터도 제거했습니다.)
Mnebuerquo

13

또한 80 개의 한계를보기 위해 선을 그릴 수 있습니다.

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

결과:

여기에 이미지 설명을 입력하십시오


13

지정된 범위를 벗어나는 첫 번째 문자 만 표시하는 좋은 방법입니다.

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

Damian Conway의 이야기에서 .


7

최신 버전의 vim은 :set numberwidth=x값을 허용 하여 행 번호 표시의 너비를 설정합니다. 나는 실제로 접는 등을 사용하지 않으므로 그것에 대해 알지 못합니다. 얇은 세로선을 그리는 것은 콘솔 응용 프로그램의 기능을 뛰어 넘습니다. GVim은 이것을 허용 할 수 있습니다 (사용하지 않으므로 주석을 달 수 없습니다).


5

널 세트로 남겨 두는 솔루션 세트에 제한을 두는 것이 두렵습니다.

를 사용 :set textwidth=80하면 줄 한도를 쉽게 확인할 수 없다는 제외하고 언급 한 모든 문제가 해결 됩니다. 이 경우 :set ruler상태 표시 줄에서 x, y 위치 표시를 활성화하여 현재 열을 확인할 수 있습니다.

그 외에도, 당신에게 무엇을 말 해야할지 모르겠습니다. 숫자 열을 잃어 버리고 열을 접고 나누는 것이 부끄러운 일 :set columns=80입니다.


그래, 난 그게 두려웠 어 ... 그래픽 지향적 인 편집기처럼 얇은 세로선을 그릴 수있는 숨겨진 방법이 있기를 바랐습니다.
cdleary

5

당신은 이것을 시도 할 수 있습니다 :

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

이렇게하면 모든 버퍼에 두 개의 하이라이트가 설정됩니다. 하나 &textwidth는 설정 하기 전에 8 개의 열에있는 문자에 대한 것이고 다른 하나는 그 열에없는 문자에 대한 것입니다. 그렇게하면 어느 정도의 기대감을 갖게됩니다. 물론 당신이 (예를 들어 열에서 구문 강조 표시의 손실로 지불하는) 예상을 원한다면 다른 너비를 사용하도록 조정할 수 있습니다.


3

글 : : help 열을 보면 실제로 엉망이되지는 않습니다.

콘솔에서는 일반적으로 콘솔 설정에 의해 결정됩니다 (즉, 자동 감지). GUI에서 gvim 창의 너비를 결정합니다 (및 결정).

따라서 일반적으로 콘솔과 창 관리자가 작업을 수행하도록합니다. set columns

"라인 오버플로 참조 및 예상"의 의미를 잘 모르겠습니다. EOL을 대략 열 ​​80에 삽입하려면 set textwidth또는 set wrapmargin;를 사용하십시오 . 소프트 랩을 원할 경우 (즉, 줄 바꿈은되지만 실제 EOL은 없음) set linebreakand으로 재생하십시오 set showbreak.


2

이것은 왼쪽 필드 밖에 있지만 줄 번호가있는 경우 현재 분할 크기를 80 자로 조정할 수있는 멋진 작은 맵입니다.

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 

1

실제 텍스트의 80자를 허용하도록 창 크기를 설정할 수 있습니다. 그래도 여전히 세로 분할에서는 작동하지 않습니다.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

상대 숫자의 경우 vim 7+, 7.3이 필요합니다.

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