파일 유형별로 Vim 들여 쓰기 동작 변경


379

누군가 파일 형식에 따라 Vim의 들여 쓰기 동작을 변경하는 가장 쉬운 방법을 간단한 용어로 설명해 주시겠습니까? 예를 들어, 파이썬 파일을 열면 2 개의 공백으로 들여 쓰기가되지만 Powershell 스크립트를 열면 4 개의 공백을 사용해야합니다.


9
BTW-Python의 PEP8 규칙에 따르면 tabstop은 4 개의 공백이어야하고 탭은 4 개의 공백이어야합니다. 심판 : stackoverflow.com/questions/120926/…
cgseller

답변:


304

.vimvim이 특정 파일 형식으로 전환 될 때마다 실행할 파일을 추가 할 수 있습니다 .

예를 들어 다음 ~/.vim/after/ftplugin/html.vim 과 같은 내용 의 파일 이 있습니다.

setlocal shiftwidth=2
setlocal tabstop=2

vim이 들여 쓰기를 위해 너비가 2자인 탭을 사용하게합니다 ( noexpandtab옵션은 구성의 다른 곳에서 전역 적으로 설정 됨).

http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 에서 파일 유형 플러그인 섹션으로 스크롤 하십시오 .


229
~/.vim/after/ftplugin/html.vim대신에 넣어야합니다 . 그러나 다른 사람들이 아래에 지적했듯이에 추가 autocmd FileType html setlocal shiftwidth=2 tabstop=2하는 것이 훨씬 .vimrc좋습니다.
아리스토텔레스 Pagaltzis

10
실제로, 그 파일이있는 곳은 / is /입니다. 나는 대답을 고칠 것이다. 그러나 동의하지 않습니다. 다른 파일 형식에 대한 명령을 별도의 파일로 분리하면 특히 많은 파일 형식에 대한 요구 사항이나 일부 파일 형식에 대한 많은 옵션이있는 경우 모든 것이 훨씬 쉬워집니다.
SpoonMeiser

3
실제로 ftplugins에 after 디렉토리를 사용해야 할 이유는 많지 않습니다. Vim은 구문 파일의 첫 번째 파일뿐만 아니라 런타임 경로에서 찾은 모든 파일을로드합니다.
graywh

36
참고 : 자바 스크립트 파일 형식에는 js를 사용하지 마십시오. 대신 자바 스크립트를 사용하십시오. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo

13
filetype plugin onvimrc에도 추가 해야합니다.
gatoatigrado

191

ftplugins 또는 자동 명령을 사용하여 옵션을 설정하십시오.

ftplugin

~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

그리고 다음을 켜는 것을 잊지 마십시오 ~/.vimrc.

filetype plugin indent on

( :h ftplugin자세한 내용은)

자동 명령

에서 ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

긴 명령 또는 설정을 짧은 버전으로 바꿀 수 있습니다.
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab: :et

나는 또한 차이 학습 제안 tabstopsofttabstop. 많은 사람들이에 대해 모릅니다 softtabstop.


1
감사! 'ts'와 'sts'에 대해서도 감사합니다. 이 차이점과 사용 방법에 대해 논의 할 특정 페이지가 있습니까?
jvriesem

11
@jvriesem 그다지 많지 않습니다. 'ts'는 탭 문자가 표시되는 방식입니다. 'sts'는 탭 키를 눌렀을 때 삽입 할 "공백"수입니다. 'sw'는 들여 쓰기 수준 당 사용할 "공간"수입니다. 'et'은 공백 또는 탭을 사용할지 여부입니다. 'sta'를 사용하면 줄의 시작 부분에서 탭을 누를 때 'sw' '공백'을 삽입 할 수 있습니다.
graywh

10
끝 부분의 커트 문장보다는 명확성을 위해 전체 형식이 더 나은지 궁금합니다.
icedwater

23
sw짧다 softwidth, sts짧다 softtabstop, et짧다 expandtab, setl짧다 setlocal, au짧다 autocmd. 짧은 양식 대신 긴 양식을 사용할 수 있습니다.
Flimm

13
나는 보다 sw확장 한다고 생각 합니다 . shiftwidthsoftwidth
johncip

83

을 수정 ~/.vimrc하고 html/rb들여 쓰기에 다른 파일 형식을 추가 하십시오 . 예를 들어 2 칸 js/coffee들여 쓰기, 4 칸 들여 쓰기

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

파일 유형별로 Vim 공백 환경 설정 지정을 참조하십시오.


vimrc에 대한 코멘트 하나입니다 ":)
sdkks

@sdkks 나는 그렇게 생각하지 않습니다. 큰 따옴표는 주석이며 작은 따옴표 '는 모든 Linux의 vim에서 오류를 발생시킵니다. (7.3+, 8.0 ...)
Siwei Shen 申思维

네. 내 의견은 하나를 사용한다고 말하면서 "다른 하나와 닫지 마십시오 ". 내가 왜 그것을 언급했는지 잘 모르겠습니다.
sdkks 2016 년

알았어, 오해 했어 나는 작은 따옴표를 의미 '하지만 "오른쪽 " @. @ 없이 남지 않았습니다
Siwei Shen 申思维

60

~ / .vimrc에 파일 접미사를 기반으로 autocmd 명령을 넣습니다.

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

찾고있는 명령은 아마도 ts = 및 sw =


18
에 의해 이것의 장점은 무엇입니까 FileType?
케이시 차우

3
경기를 뒤집을 수있는 방법이 있습니까?
SystemParadox 2019

7
.html 파일은 실제로 HTML이 아니고 템플릿 언어가있는 템플릿 HTML 파일이기 때문에 html 파일로 작업 할 파일 형식을 얻는 데 문제가 있습니다. 파일 형식은 html로 인식하지 않지만이 방법은 그렇습니다.
Mark Hildreth 2016 년

3
@digitxp-사용 된 확장이 정의 된 "FileType"과 일치하지 않을 때의 이점입니다. 예를 들어, 설치에서 * .md는 Modula2의 파일 형식을 의미하지만 마크 다운에 사용하고 있습니다. (a) 기본 FileType 설정을 변경하거나 (b) 사용자 정의 구성으로 파일 유형 설정을 변경하거나 (c) (c)와 함께 이동 한 1 .vimrc 파일에서이 설정을 사용하여 원하는 것을 빠르게 얻을 수 있습니다.
pdwalker

내 문서에 대한 빠른 읽기가 정확하다고 가정하면 파일 형식 당 여러 명령을이 방법으로 추가 할 수 있으며 주어진 순서대로 실행되도록 보장됩니다.
underscore_d

23

나는 보통 expandtabset 으로 작업 하지만 makefile에는 좋지 않습니다. 나는 최근에 추가했다 :

:autocmd FileType make set noexpandtab

내 .vimrc 파일 끝까지 Makefile, makefile 및 * .mk를 makefile로 인식하고 탭을 확장하지 않습니다. 아마도 이것을 확장 할 수 있습니다.


더 나은 옵션은 : filetype 플러그인을 활성화하는 것입니다. Vim의 기본 설정은 : setl noet을 포함하므로 vimrc에 aucmd가 필요하지 않습니다.
graywh

확인. 그것의 이점과 그것을 할 때 무엇이 ​​관련되어 있는지 설명 할 수 있습니까? 파일 유형 플러그인이 autocmd보다 나은 이유는 무엇입니까? autocmd는 언제 사용해야합니까? 사용하지 않습니까?
Jonathan Leffler

5
Vim과 함께 제공되는 파일 유형 플러그인은 예를 들어 makefile에 대해 "setlocal noexpandtab"과 같은 유용한 기능을 수행합니다. shiftwidth와 같은 개인적인 것들에 대한 자동 명령 vs ftplugin은 중요하지 않습니다. vim 설정을 구성하는 방법입니다.
graywh

17

개인적으로 .vimrc에서 다음 설정을 사용합니다.

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
특정 회사와 마찬가지로 많은 언어가 오랫동안 관례를 확립했습니다. 전자의 예로 NodeJS를 보자. 탭은 두 개의 공백이어야합니다. 두통, 꽤 어리석지 만 중요합니다.
Paul Hazen

3
모든 상황에서 탭이 동일한 이유는 무엇입니까? 구성 파일의 경우 8 개의 스페이스 탭이 제대로 작동하지만 들여 쓰기가 많은 코드의 경우 2가 훨씬 관리하기 쉽습니다. 그리고 고정 된 규칙이 있습니다 : node.js에는 2 개의 스페이스 탭이 있어야하며 파이썬은 실제로 4 개의 스페이스 탭 이외의 구문에는 유효하지 않습니다.
felixphew

1
@felixphew Python은 전체적으로 동일하게 유지되는 한 여러 공간 (또는 탭)으로 완벽하게 정확합니다.
James

@DJMcMayhem 네 말이 맞아- "강하게 추천한다"고 말 했어야 했어요.
felixphew

1
넬로 ​​+1 탭 문자는 8 문자의 배수에서 다음 위치로 점프하는 것을 의미하는 오랜 전통을 가지고 있습니다. 사람들이 "내 언어로보기에 좋은 다음 들여 쓰기"에 탭을 사용하기를 원했고 일부 텍스트 편집기가 "탭 문자 추가"와 "들여 쓰기를위한 공백 추가"사이의 차이를 귀찮게하지 않았기 때문입니다. 편집기를 조정하여 원하는 방식으로 표시하지 않도록 이제이 혼란을 겪었습니다. 소스 코드는 텍스트이고 텍스트의 표준은 8 자 탭입니다.
Florian F

6

이것은 대부분의 사람들에게 알려졌지만 어쨌든 (처음으로 당황했습니다) : doing :set et( :setexpandtabs)은 파일에 이미 존재하는 탭을 변경하지 않습니다 :retab. 예를 들면 다음과 같습니다.

:set et
:retab

파일의 탭이 충분한 공간으로 바뀝니다. 탭을 다시 사용하려면 다음을 수행하십시오.

:set noet
:retab

4

오늘, 당신은 editorconfig 시도 할 수 있으며, 그것을위한 vim 플러그인 도 있습니다. 이를 통해 vim에서 들여 쓰기 크기를 변경할 수있을뿐만 아니라 다른 많은 편집기에서도 일관된 코딩 스타일을 유지할 수 있습니다.

아래는 간단한 editorconfig입니다. 파이썬 파일에는 들여 쓰기를위한 4 개의 공백이 있고, pug 템플릿 파일은 2 개만 있습니다.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

들여 쓰기 플러그인을 사용하거나 설정을 수동으로 사용하여 Vim의 들여 쓰기를 잘 구성 할 수 있지만, Python 파일을 열 때 자동으로 관련 설정을 설정하는 Vindect 라는 Python 스크립트를 사용하는 것이 좋습니다 . Vindect를보다 효과적으로 사용하려면 이 팁 을 사용하십시오 . 다양한 들여 쓰기 스타일 (탭 대 공간 및 공백 수)로 다른 사람들이 만든 파이썬 파일을 처음 편집하기 시작했을 때 매우 실망 스럽습니다. 그러나이 들여 쓰기 파일 과 함께 Vindect

또한 다음을 권장합니다.


2

를 사용하는 사람들을 autocmd위해 그룹화하는 것이 가장 좋습니다. 그룹화가 파일 유형 감지와 관련이있는 경우 다음과 같은 내용이있을 수 있습니다.

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

그룹화 .vimrc는 파일 형식에 여러 규칙이 연결되어 있으면 특히 체계적으로 정리할 수 있습니다. 위의 예에서는 .c 파일과 관련된 주석 바로 가기가 정의되어 있습니다.

초기 호출 autocmd!은 vim에게 해당 그룹에서 이전에 정의 된 자동 명령을 삭제 하도록 지시합니다. 이렇게하면 .vimrc다시 정의 된 경우 중복 정의를 방지 할 수 있습니다. 자세한 내용은를 참조하십시오 :help augroup.


1

나는 C라고 쓴 유틸리티를 사용했다 autotab. 그것은 당신이로드하고 빔 매개 변수의 값을 결정하는 파일의 처음 몇 천 개 라인 분석 shiftwidth, tabstopexpandtab.

예를 들어을 사용하여 컴파일됩니다 gcc -O autotab.c -o autotab. Vim과 통합하기위한 지침은 상단의 주석 헤더에 있습니다.

Autotab은 상당히 영리하지만, 특히 다른 들여 쓰기 스타일을 사용하여 일관성이 유지되지 않아서 때때로 혼란 스러울 수 있습니다.

파일이 들여 쓰기에 탭 또는 공백과 탭의 조합을 사용하는 경우 Autotab은 주석과 같이 연속적인 선에 걸쳐 내부 요소의 정렬과 같은 요소를 고려하여 사용중인 탭 크기를 알아냅니다.

이 언어는 다양한 프로그래밍 언어에서 작동하며 명백한 빈 줄은 말할 것도없고 C 전처리 지시문, C 문 레이블과 같이 들여 쓰기 증분에 따르지 않는 "대역 외"요소를 용서합니다.

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