서버에서 YAML · JSON · XML 같은 설정 파일을 자주 고친다면 기본 vim 설정만으로는 실수가 잦다. 특히 YAML 은 탭 문자 하나로 파싱이 깨지고, 들여쓰기가 눈에 보이지 않아 잘못 맞춘 채 저장하기 쉽다. 플러그인 없이 기본 기능만으로 대부분을 막을 수 있다.
~/.vimrc 에 둔다. 서버 공용으로 적용하려면 /etc/vimrc 또는 /etc/vim/vimrc.local 에 같은 내용을 넣는다.
set nocompatible
filetype plugin indent on
syntax on
set number
set ruler
set laststatus=2
set encoding=utf-8
set fileencodings=utf-8,euc-kr,latin1
set expandtab " 탭 대신 공백
set tabstop=4
set shiftwidth=4
set softtabstop=4
set autoindent
set smartindent
set list
set listchars=tab:>-,trail:·,nbsp:+
set hlsearch
set incsearch
set ignorecase
set smartcase
set backspace=indent,eol,start
set mouse=
set nobackup
set noswapfile
set list 와 listchars 가 핵심이다. 탭과 줄 끝 공백이 눈에 보여야 YAML 오류를 저장 전에 잡는다.
set mouse= 는 마우스 통합을 끈다. 켜져 있으면 터미널에서 드래그 복사가 되지 않아 원격 작업이 불편하다.
들여쓰기 폭이 형식마다 다르므로 autocmd 로 나눈다.
augroup ConfigFiles
autocmd!
autocmd FileType yaml,yml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=0#
autocmd FileType json setlocal ts=2 sts=2 sw=2 expandtab conceallevel=0
autocmd FileType xml,html setlocal ts=2 sts=2 sw=2 expandtab
autocmd FileType sh setlocal ts=4 sts=4 sw=4 expandtab
autocmd FileType make setlocal noexpandtab
autocmd FileType dockerfile setlocal ts=4 sts=4 sw=4 expandtab
augroup END
make 는 탭이 문법의 일부이므로 expandtab 을 꺼야 한다. 이 한 줄이 없으면 Makefile 이 조용히 망가진다.
확장자가 없는 설정 파일은 형식이 인식되지 않으므로 경로로 지정한다.
autocmd BufNewFile,BufRead */playbooks/*.yml setfiletype yaml
autocmd BufNewFile,BufRead *.conf setfiletype dosini
vim 안에서 바로 검사하면 왕복이 줄어든다.
command! JsonCheck :%!python3 -m json.tool
command! YamlCheck :!python3 -c "import sys,yaml;yaml.safe_load(open(sys.argv[1]))" %
command! XmlFormat :%!xmllint --format -
JsonCheck 와 XmlFormat 은 버퍼 내용을 통과시키므로 형식이 틀리면 오류가 버퍼에 들어온다. 이때는 u 로 되돌린다.
smartindent 는 C 계열 문법을 가정하므로 YAML 에서 주석(#)을 줄 맨 앞으로 밀어 버린다. 위 설정의 indentkeys-=0# 이 이를 막는다. YAML 을 많이 다룬다면 smartindent 를 끄고 filetype indent 에 맡기는 편이 안전하다.
공용 서버에서 ~/.vimrc 를 크게 바꾸면 다른 사람이 당황한다. 개인 계정에만 두거나, 공용에 넣을 때는 표시 관련 설정 위주로 최소화한다.