발단: 점점 방대해지는 .vimrc 파일

vim을 오래 사용하다 보면 자연스럽게 .vimrc 파일도 길어지기 마련이다.

처음에 100줄도 안 되었던 .vimrc 파일이 어느새 몇 천 줄을 넘어가게 되면 관리가 힘들다.

따라서 주제별로 여러 개의 파일로 분리하여 관리해야겠다는 생각을 하게 되었다.

방법 1: vim plugin으로 설정 파일을 분리한다

이 방법은 2017년 무렵에 사용했던 방법이다. 이상적인 방법이지만 관리가 귀찮아 사용하지 않게 되었다.

내가 가장 먼저 선택했던 방법은 주제별로 플러그인을 만들어 분리하는 것이다.

이 방법은 다음과 같은 장점이 있다.

  • 확실한 주제를 갖는 설정으로 모듈화를 꾀할 수 있다.
  • github에 올려두면 플러그인 매니저를 사용해 쉽게 설치/제거를 할 수 있다.
  • 다른 사람에게 설정을 전달해 줄 때 간편하다.

그러나 한동안 사용해보니 단점도 확실했다.

  • 관심사가 겹치는 설정이 있어 확실한 주제 하나로 분리하기 애매한 경우가 있다.
  • 의외로 자주 변경하는 설정도 있는데, 그 때마다 github에 올려둔 플러그인을 매번 수정해 주기가 귀찮다.
  • 다른 사람에게 설정을 전달해 줄 일이 거의 발생하지 않는다.

그래서 이 방법은 오래 사용하지 않게 되었다.

방법 2: runtime 명령을 사용한다

이 방법은 2018년부터 사용한 방법이다. 거의 완벽한 방법이었지만 작은 문제가 있다.

다음 코드를 .vimrc 파일에 추가한다.

runtime! vim-include/*.vim

그리고 ~/.vim/ 의 하위 디렉토리로 ~/.vim/vim-include/ 를 만들고 다음과 같이 여러 설정을 분리해 넣었다.

~/.vim
├── UltiSnips
├── autoload
├── plugged
├── plugin
├── session
├── startup
├── undodir
└── vim-include     <- 이 디렉토리에 분리한 설정 파일을 넣는다
    ├── bookProgressUpdate.sh
    ├── ft-fortune.vim
    ├── ft-gitcommit.vim
    ├── ft-perl6.vim
    ├── set-airline.vim
    ├── set-autoformat.vim
    ├── set-coc.vim
    ├── set-easymotion.vim
    ├── set-fzf.vim
    ├── set-gutentags.vim
    ├── set-nerdtree.vim
    ├── set-php.vim
    ├── set-rust.vim
    ├── set-startify.vim
    ├── set-tagbar.vim
    ├── set-typescript.vim
    ├── set-ultisnips.vim
    ├── set-vim-go.vim
    ├── set-vim-rest-console.vim
    ├── set-vimpager.vim
    ├── set-vimwiki.vim
    └── set-youcompleteme.vim

다만 이렇게 하면 ~/.vim의 하위 경로에 있는 파일을 !runtime으로 읽어주기 때문에 분리한 파일 하나하나를 두 번 읽는다는 문제가 생긴다.

따라서 설정 파일 하나하나를 다음과 같이 두 번 읽지 않도록 작업해줬다.

다음은 분리한 설정 파일 중 하나인 set-airline.vim 파일의 내용이다.

if !exists('g:include_set_airline_loaded')
    let g:include_set_airline_loaded = 1

    let g:airline#extensions#tabline#enabled = 1
    let g:airline#extensions#tabline#fnamemod = ':t'
    let g:airline#extensions#tabline#buffer_nr_show = 1
    let g:airline#extensions#tabline#buffer_nr_format = '%s:'
    let g:airline_powerline_fonts = 1
endif

이 방법은 아주 잘 작동했다.

굳이 변수 하나를 더 설정하는 게 마음에 들지 않긴 했지만 시간날 때 고쳐야지… 하고 지냈는데 정신차리고 보니 2년이 지나 2020년이 되었다.

방법 3: for loop를 돌며 source 해준다

내가 현재 사용하고 있는 방법이다.

2020년이 되었다. 새해를 맞아 나는 2년이나 묵혀둔 이 문제를 풀어야겠다는 생각을 하게 되었다.

그런데 코드를 보고 있으니 이 문제를 이렇게 복잡하게 풀 필요가 없다는 생각이 들었다. 그냥 한 번씩만 읽어주면 되는 거 아닌가.

source vim-include/ft-fortune.vim
source vim-include/ft-gitcommit.vim
source vim-include/ft-perl6.vim
...

실험해보니 (당연히) 잘 돌아갔다.

그래서 !runtime은 주석처리하고 다음과 같이 간단한 for loop를 사용해 source하기로 했다.

" runtime! vim-include/*.vim
for include_file in uniq(sort(globpath(&rtp, 'vim-include/*.vim', 0, 1)))
    execute "source " . include_file
endfor

이제 각 설정 파일에서 불필요한 부분만 제거해주면 된다.

다음은 위에서 예로 들었던 set-airline.vim 파일에서 두 번 읽기 방지 코드를 제거한 것이다.

let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#fnamemod = ':t'
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#buffer_nr_format = '%s:'
let g:airline_powerline_fonts = 1