본문 바로가기
IT 기술/개발환경_유틸 관련 팁

[vim] tab 을 space 로 변환, [no]expandtab 관련 팁

by 땅뚱 2018. 8. 29.

VIM에서 Tab 을 Sapce 로

vim 로 개발을 하고 있는데, 공통 개발 가이드로 tab 대신 space 4칸을 쓰기로 결정했다.

그런데, Makefile 같은 경우에는 반드시 tab 을 써야하기 때문에, 파일을 종류에 따라서 tab 을 사용하는 정책을 다르게 정해주어야 한다.

구글에서 일반적인 가이드는 아래와 같다. 하지만 아래와 같은 방법으로는 Makefile 일 경우에도 tab 을 space 로 변환시켜 주게 된다.

"새로운 라인을 시작할 때, smart 하게 auto indentation 을 수행한다

set smartindent

 

"tab을 눌렀을때 인식하는 칸 수

set tabstop=4

 

"tab 을 space 로 확장하라는 설정

set expandtab

set et

 

">>, << 키로 들여/내어 쓰기할 때, 스페이스 개수

set shiftwidth=4

 

가장 쉬운 방법중에 하나는 vim 으로 Makefile 을 열고 :set noexpandtab 을 매번 쳐주고 시작하는 것이다. 까먹을 수도 있고, 매우 귀찮다. 더 좋은 방법을 찾아보자. 

구글링을 하다보면, 아래와 같은 가이드가 있다. 좋은 방법중 하나인 것 같다. 원하는 파일 타입에 따라서 tab 설정을 할 수 있다.

(참고 : https://github.com/brutasse/dotfiles/blob/master/vimrc)

filetype plugin indent on " enable file type detection 

autocmd FileType cpp setlocal tabstop=4 shiftwidth=4 expandtab autocmd FileType c setlocal ts=4 sw=4 sts=4 et smartindent

반드시 filetype plugin indent on 명령을 수행하여 file type 을 감지할 수 있도록 해주어야 한다.

 

현재 사용하고 있는 방법은 autocmd BufEnter 를 사용하는 방법이다. 위의 방법과 같이 특정한 파일 type 에 대해서 설정을 해주면 세부적으로 설정할 수 있어서 좋은데, 내가 사용하는 환경에서는 특정 파일에서만 tab 을 space 로 변환하면 되었기 때문에, 아래와 같은 한줄로 설정할 수 있다.

(참고: https://goo.gl/N8IBr)

filetype plugin indent on

autocmd BufEnter *.\(c\|cpp\|java\|h\) set et

BufEnter 는 http://vimdoc.sourceforge.net/htmldoc/autocmd.html#BufEnter 설명으로 보면 buffer 에 entering 된 이후에 호출되는 이벤트로 filetype 별로 설정을 할때 많이 사용된다고 한다. autocmd 의 event 중 하나다.

(vim 에서 :buffers 를 실행하면 edit 하는 파일의 리스트를 보여준다. 여기서 buffer 라는게 편집중인 하나의 파일을 의미하는 것으로 추정할 수 있다.)

(참조 : https://bakyeono.net/post/2015-08-13-vim-tab-madness-translate.html

원문 : https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs)

즉 위 라인의 설명은 파일을 edit 하게되었을 때, 해당 buffer 를 읽어오게 되면 파일 타입중 *.c, *.cpp, *.java, *.h 파일에 대해서 expandtab 을 수행하라는 의미이다.

.vimrc 에 위 내용을 설정해놓으면 c, cpp, java, h 파일에 대해서 tab 이 space 로 잘 변환되고, Makefile 등의 파일은 tab 이 정상적으로 입력된다.

 

강제 Tab 입력하기

그런데 *.py (파이썬) 파일을 편집하려는데, 위 설정이 제대로 동작하지 않았다. 의도대로 라면 tab 을 space 로 변환하면 안되는데, 계속 tab 이 space 로 변환되는 것이다.
강제로 :set noexpandtab 을 입력해도 처음만 tab 이고 제대로 되지 않았다. 우선 임시적으로 expandtab 상태에서 강제로 tab 을 입력하는 방법을 찾아봤다.
 
<Ctrl+v> + <tab>

Ctrl+v 를 누른 후에 tab 키를 누르면 원래대로 tab 키가 먹힌다.

 

이전 명령 설정 파일 찾기

 
급한대로 강제로 tab 을 넣고 사용하다가 도대체 어디서 expandtab 을 하고 있는지 궁금해져서 구글링을 해보니, 다음과 같은 명령을 확인할 수 있었다.
 
:verb set expandtab?
 
Last set from /usr/share/vim/vim74/ftplugin/python.vim
 
그러면 마지막으로 set expandtab 을 실행한 vim 파일을 알려준다. 즉 python.vim 에서 기본적으로 expandtab 을 사용하고 있는 것이었다.
파이썬 기본이 space 를 추천하는 것으로 생각해서 python 은 그대로 expandtab 을 쓰는 것으로 놔두기로 했다.