Vundle로 플러그인 매니저 자체는 갖췄어도, .vimrc에 아무것도 선언하지 않은 vim은 여전히 텍스트 편집기 수준을 벗어나지 못한다. 파일 탐색, git 상태 확인, 코드 자동완성, 린팅처럼 IDE에서는 당연하게 여기는 기능들은 결국 플러그인을 골라 넣어야 갖춰진다. 문제는 vim 플러그인 생태계가 30년 넘게 쌓여 있어 후보가 너무 많고, 그중 상당수는 관리가 끊긴 상태라는 점이다. 이 글에서는 실제로 널리 쓰이고 꾸준히 유지되는 플러그인 중에서 개발 작업에 바로 도움이 되는 8개를 추려, Vundle로 추가하는 방법과 각각의 용도를 정리한다.
파일 탐색 — NERDTree
NERDTree는 vim 창 옆에 파일 트리를 띄워주는 파일 탐색기다. :NERDTree 명령으로 열고, 화살표 키나 j/k로 이동하며 Enter로 파일을 연다. 원본 저장소(scrooloose/nerdtree)는 관리가 끊겼고, 지금은 preservim 조직이 이어받아 유지하고 있다.
Plugin 'preservim/nerdtree'
Git 통합 — vim-fugitive와 vim-gitgutter
vim-fugitive는 tpope가 만든 git 래퍼로, vim을 벗어나지 않고 :Git status, :Git blame, :Git diff 같은 명령으로 git 작업을 그대로 처리할 수 있다. 여기에 vim-gitgutter를 더하면 현재 열려 있는 파일에서 추가·수정·삭제된 라인을 편집기 왼쪽 여백에 표시해줘서, 커밋 전에 어디를 건드렸는지 한눈에 확인할 수 있다.
Plugin 'tpope/vim-fugitive'
Plugin 'airblade/vim-gitgutter'
퍼지 파일 검색 — fzf.vim
파일이 수백 개인 프로젝트에서는 NERDTree로 트리를 뒤지는 것보다 fzf로 이름을 타이핑해 바로 찾는 쪽이 훨씬 빠르다. 다만 fzf.vim은 fzf 바이너리 자체를 필요로 하는데, Vundle은 vim-plug와 달리 설치 후 훅(post-install hook)을 지원하지 않으므로 fzf 바이너리는 패키지 매니저로 따로 설치하는 게 깔끔하다.
sudo apt install fzf
Plugin 'junegunn/fzf'
Plugin 'junegunn/fzf.vim'
설치 후 :Files로 프로젝트 파일을, :Buffers로 열린 버퍼를, ripgrep이 설치돼 있다면 :Rg로 파일 내용까지 퍼지 검색할 수 있다.
린팅 — ALE
ALE(Asynchronous Lint Engine)는 저장할 때마다 비동기로 린터를 돌려 에러와 경고를 왼쪽 여백과 상태 라인에 표시해주는 플러그인이다. 언어별로 이미 설치된 린터를 그대로 활용하기 때문에 별도 설정 없이도 C, Python, JavaScript, Bash 등 수십 개 언어에서 바로 동작한다.
Plugin 'dense-analysis/ale'
자동완성 — coc.nvim과 Vundle의 제약
언어 서버(LSP) 기반 자동완성을 쓰고 싶다면 coc.nvim이 사실상 표준이다. 다만 coc.nvim 메인테이너들은 공식적으로 vim-plug 사용을 권장하는데, vim-plug에서는 {'branch': 'release'} 옵션으로 미리 빌드된 release 브랜치를 바로 받을 수 있는 반면, Vundle의 Plugin 선언에는 branch 지정 옵션이 없어 항상 마스터 브랜치 소스를 그대로 받기 때문이다. 이 상태로 실행하면 [coc.nvim] javascript file not found, please compile the code or use release branch. 에러가 뜨는데, 직접 빌드해주면 해결된다.
Plugin 'neoclide/coc.nvim'
cd ~/.vim/bundle/coc.nvim && npm ci
빌드에는 Node.js 16.18.0 이상이 필요하다. 이 과정이 번거롭다면 coc.nvim만큼은 vim-plug로 따로 관리하는 것도 실용적인 선택이다.
편집 효율 — vim-surround와 vim-commentary
둘 다 tpope의 작품으로, 스타일은 다르지만 매일 쓰게 되는 플러그인이다. vim-surround는 cs"'처럼 짧은 명령으로 괄호·인용부호·태그를 감싸거나 바꾸거나 지울 수 있게 해주고, vim-commentary는 gcc(현재 줄) / gc(비주얼 선택 영역)로 주석을 토글해준다.
Plugin 'tpope/vim-surround'
Plugin 'tpope/vim-commentary'
상태 라인 — vim-airline
vim-airline은 하단 상태 라인에 현재 파일 정보, git 브랜치, 인코딩, ALE 진단 요약 등을 보기 좋게 정리해서 보여준다. vim-gitgutter, ALE 같은 다른 플러그인과 자동으로 연동되기 때문에 따로 설정을 맞추지 않아도 대부분 바로 동작한다.
Plugin 'vim-airline/vim-airline'
한 번에 추가하기
.vimrc의 call vundle#begin()과 call vundle#end() 사이에 아래처럼 모아 넣고, vim을 열어 :PluginInstall을 실행하면 한 번에 전부 설치된다(coc.nvim 빌드는 별도로 진행해야 한다).
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'preservim/nerdtree'
Plugin 'tpope/vim-fugitive'
Plugin 'airblade/vim-gitgutter'
Plugin 'junegunn/fzf'
Plugin 'junegunn/fzf.vim'
Plugin 'dense-analysis/ale'
Plugin 'neoclide/coc.nvim'
Plugin 'tpope/vim-surround'
Plugin 'tpope/vim-commentary'
Plugin 'vim-airline/vim-airline'
call vundle#end()vim +PluginInstall +qall
cd ~/.vim/bundle/coc.nvim && npm ci
주의사항
- Vundle은 vim-plug와 달리 post-install 훅(
do옵션)이나 branch 지정을 지원하지 않으므로, fzf처럼 별도 바이너리가 필요하거나 coc.nvim처럼 특정 브랜치가 필요한 플러그인은 수동 작업이 추가로 들어간다. - 플러그인을 한꺼번에 여러 개 추가하면
:PluginInstall도중 특정 플러그인에서만 에러가 나도 알아채기 어려우므로, 새 플러그인은 하나씩 추가하고 그때마다:PluginInstall로 확인하는 편이 문제를 좁히기 쉽다. - NERDTree처럼 원본 저장소가 관리 중단된 플러그인은 fork 주소가 종종 바뀌므로, vimrc에 적어둔 저장소 주소가 여전히 활성 저장소를 가리키는지 가끔 확인하는 게 좋다.
마무리
위 8개는 파일 탐색, git 연동, 검색, 린팅, 자동완성, 편집 단축키, 상태 표시까지 개발 작업의 기본적인 축을 각각 담당한다. 전부 한꺼번에 넣기보다는 NERDTree와 vim-fugitive처럼 자주 쓰는 것부터 추가해보고, ALE나 coc.nvim처럼 설정이 더 필요한 플러그인은 필요할 때 나중에 붙여나가는 쪽이 vim 환경을 무너뜨리지 않고 늘려가는 방법이다.