콘텐츠로 건너뛰기
Home » vim의 탭 및 들여쓰기 관련 설정

vim의 탭 및 들여쓰기 관련 설정

vim 설정 파일을 작성할 때, 초반에는 누군가의 설정 내용을 참고해서 만들고 불편한 부분들을 나에게 맞게 고쳐나가는 방식을 많이 사용하다 보니, 어떤 부분은 설정 파일에 떡하니 설정은 해두었지만 무슨 내용인지, 어떤 효과를 내는지 모르는 것이 많다. 특히 탭이나 들여쓰기 관련 설정이 그러한데, 일부 언어에서는 공백의 수가 문법적으로 크리티컬한 경우도 있다. 이런 문제 외에도 들여쓰기와 탭 동작은 취향과 필요에 따라서 잘 설정해야 하는 부분일 것이다. 오늘은 탭과 관련된 설정 몇 가지에 대해서 알아보도록 하자.

tabstop, ts

'tabstop' 옵션은 탭의 간격을 지정한다. 기본값은 8이다. 보통 탭 키를 사용하는 의미가 탭 문자를 삽입한다기 보다는 “들여쓰기”를 위한 의도인 경우가 더 많기 때문에, 이 옵션은 다른 옵션들에게 영향을 주기도 해서 어떻게 사용하는게 좋다는 언급을 하기는 좀 힘들다. 단순히 들여쓰기할 때의 깊이로 사용할 것인가, 혹은 테이블 형태의 데이터를 정렬하기 위해 사용할 것인가 등의 상황을 모두 고려하는 것이 좋겠다.

softtabstop, sts

'softtabstop' 옵션은 'tabstop' 옵션을 기본값이나 따로 설정해놓은 값에서 변경하지 않은 채로, 편집중에 <TAB> 키나 <BS> 키를 눌러서 들여쓰거나 내어쓰는 간격을 조정하려고 하는 경우(보통은 더 적게)에 사용한다. 사용자에게는 마치 ‘줄어든 탭’을 사용하는 것처럼 보이지만, 실제로는 탭 문자와 공백을 섞어서 사용하게 된다. 예를 들어 tabstop=8 이면 탭 문자는 1개가 삽입되고, 화면 상에서 최대 8칸의 공간을 사용한다. 이 때 sts=2 라고 설정했다면 탭 키를 사용했을 때 8칸이 아닌 두 칸씩 들여써지게 된다. 다음은 ts=8, sts=2 로 설정했을 때 탭키를 눌렀을 때 들여써지는 방식을 시각화 한 것이다.

|------>apple  : ts=8, sts=0
**apple        : ts=8, sts=2
****apple      : <TAB> x 2
******apple    : <TAB> x 3
|------->apple : <TAB> x 4. 공백이 다시 탭으로 한 번에 바뀐다.

탭 키를 한 번 눌렀을 때에는 공백 두 개가 삽입된다. 이 때 <BS> 키를 누르면 두 개 공백을 한 번에 지우기 때문에 마치 작은 탭처럼 느껴진다. (대신 커서를 옮겨서 각각의 공백을 지울 수 있다.) 탭 키를 한 번 더 누르면 공백이 추가되어 네 개 만큼 들여써진다. 이런 식으로 탭을 계속 눌러서 들여쓴 깊이가 실제 ts의 배수에 해당하는 값에 오면 앞의 공백 8개가 탭으로 치환된다.

:set list 를 실행해서 조판 문자를 확인하면서 비교하면 알기 쉽다.

  • 0 으로 설정하면 이 옵션은 꺼진다. 'expandtab' 옵션을 사용하지 않는다면 꺼두는 것도 좋다.
  • -1로 (아무 음수나) 설정하면 'shiftwidth' 값을 사용한다.

이 옵션의 치명적인 문제는 탭 문자와 일반 공백문자를 섞어서 입력하는 것이다. ts 옵션 값을 변경했을 때, 탭 문자의 너비가 달라지지만 공백으로 입력해놓은 칸들은 고정되기 때문에 들여쓰기가 틀어질 수 있고, 이렇게 작성한 파일을 다른 편집기에서 열었을 때에도 문제가 될 수 있다. 그래서 보통은 'ts' 에 설정한 값과 같은 값을 사용한다. (이렇게하면 expandtab 옵션을 사용해도 탭을 탭처럼 사용할 수 있게 된다.)

shiftwidth, sw

shiftwidth 옵션은 들여쓰기, 내어쓰기 (>>, << 키 입력으로 옮기거나, 자동 들여쓰기)할 때의 크기를 지정한다. 보통 ts와 같이 쓰는 경우가 많은데, et 옵션과 함께 쓴다면, 자신이 원하는 크기로 설정하고 sts=-1 로 설정하면 공백으로만 들여쓰기, 내어쓰기가 잘 맞아떨어지게 만들 수 있다.

expandtab, et

'expandtab' 옵션은 말 그대로 탭 문자의 입력을 공백으로 치환하는 것이다. 겉보기 모양은 탭을 입력하는 것과 다르지 않지만 실제로는 최대 8개의 공백이 삽입된다. (이 때 8개는 tabstop 옵션값에 의한 것이다.) 파이썬 코드를 작성해야 하는 상황이나 혹은 편집기마다 탭 간격, 표시 방법이 다른 상황에서 들여쓰기가 일관되게 출력되기를 원한다면 사용하는 것을 추천한다. 이 옵션을 사용한다면, 꼭 'softtabstop' 옵션을 사용해서 <BS>키로 탭을 삭제할 때 한 번에 한 단씩 삭제되도록 하는 것이 좋다.

추천 설정

개인적으로는 다음과 같이 세팅해서 사용하고 있다. 기본적으로 탭 문자를 모두 공백으로 치환하고 있기에 이 설정이 가장 나에게 맞다고 생각한다. 참고로 이를 기본적인 전역 설정으로 만든 상태에서 상황에 따라 들여쓰기 간격을 조정하려 할 때에는 shiftwidth 값만 바꿔서 사용한다.softtabstop 값은 -1로 설정되어 있어 이 값을 자동으로 따라가게 되어 있다.

set tabstop=4 softabstop=-1 shiftwidth=4 expandtab
  • 탭 간격은 4로 하고 탭을 공백으로 표현한다.
  • 들여쓰기 간격도 탭과 동일하게 4로 설정한다.
  • 들여쓰기 간격을 변경해서 편집해야 하는 파일 타입에서는 shiftwidth 값만 로컬 설정값을 변경해준다.