일단 제 주 환경은 Ubuntu Server (Vim)와 Mac(MacVim, Vim) 입니다. Windows 환경에서 작업하지 않은지 몇년이 되어서, Windows에서 이하 내용이 정확히 돌아가는 가에 대한 확신이 없습니다. 참고해주세요. 요즘 매우 유용하게 쓰고 있어서 추천 안할수가 없네요. 카테고리는 마땅치 않아 강좌로 세팅합니다.
Vim을 사용하면서 최근 몇년 사이에 인상깊은 발전을 보고 정리겸 공유하고 싶어서 입니다. 그럼 시작합니다.
도입
vim 명령을 내리면 펼쳐지는 심심한 화면 때문에 잘 인지할 수 없지만, 요 몇년간 Vim 은 다른 에디터 처럼 꾸준히 발전해 왔습니다. 버전 숫자 하나가 올라갈때 마다 수많은 버그와 개선이 이루어지곤 했죠. 특히 2006년에 메이저 버전이 업그레이드 되면서 등장한 Vim 7.x 부터 내부 스크립트에서 자료형을 지원하면서, 외부 스크립트에 의존하지 않고 Vim 의 스크립팅만으로 괜찮은 플러그인을 만들수 있는 환경이 갖추어졌습니다. (그래요.. 그전에는 emacs를 조금이라도 흉내내려면, 외부 스크립의 도움을 받아야 했습니다.)
그리고 2010년에 이르러 Rails 커뮤니티 맴버들이 Vim의 플러그인 생태계에 가담하면서 재미있는 프로젝트가 생겼는데, 그게 Plugin manager 로 발전하였습니다. 전 바로 이 플러그인 메니저들 중 가장 멋진 작품이 되어 가고 있는 vundle 을 소개하려 합니다.
현재 Vim 플러그인 배포의 방법과 문제
개개인의 Vim 플러그인은 다음의 구조를 가집니다.
~/.vim ├── after ├── autoload ├── backups ├── colors ├── doc ├── ftdetect ├── ftplugin ├── indent ├── lib ├── plugin ├── syntax └── undos
각각의 폴더는 vim이 실행되면서 이루어지는 일종의 콜백 위치라고 생각하면 됩니다. 따라서, 멋진 플러그인일 수록 각 콜백에 적합한 위치에 여러 소스가 퍼지는 형태로 제작됩니다. 이를 배포하기 위해서, Vim 커뮤니티의 Charles E. Campbell, Jr.는 Vimball Archiver(이하 vba) 라는 방식을 제시합니다. 언제 통합되었는지는 모르겠지만, vba 는 Vim 플러그인 인스톨러 포맷 같은겁니다. Vim 플러그인은 모두 텍스트로 구성되어 있기 때문에, 각 파일들을 저장할 위치를 명시해서 하나의 파일에 통합해서 배포하는 것이죠.
자세한 내용은 Vim 에서 볼수 있습니다.
:help vba
그래서 vim online 에서 스크립트를 찾으면 vba 파일을 종종 볼수 있습니다. 이 파일은 vim 내에서 실행하는 것만으로 설치가 가능합니다. 그런데 아무리 vba로 플러그인을 편하게 설치해도, 배포 환경이 불러오는 문제는 해결되지 않습니다. 일단 소스가 여러 디렉토리로 퍼저서 플러그인 단위로 버전 관리하기가 힘듭니다. 자동 업그레이드는 따위는 생각하기 힘들죠. 그리고 vba 패키징이 생각보다 귀찮아요.
Vim 플러그인 환경의 개선 pathogen.vim
그런데 Rails 커뮤니티의 인원들이 TextMate에서 적극적으로 vim으로 이주(?)하기 시작하면서, 그 중 일부가 재미있는 일을 시작합니다. 처음에는 단순히 Rake (Ruby계의 Make)를 이용해서 자신이 좋아하는 플러그인을 자동 설치해주는 시스템이 등장합니다. 이런 플러그인 공유가 등장한후 얼마 지나지 않아서, Rails 세상의 라이브러리 패키징 방식(주1)과 Bundler라는 라이브러리의 아이디어를 vim으로 가지고 와서 불편한 플러그인 배포 환경을 개선합니다.
- 주1) 정확히는 Rails 의 구버전에 있던 gem freezing 이라는 개념입니다. 이 문서에서는 ruby 사용자 대상이 아니므로 모두 '라이브러리'로 지칭합니다.
배포 환경 개선의 포인트는 각각의 플러그인별로 ~/.vim 내에 디렉토리로 격리 시켜 버리는 겁니다. 이런 식으로 말이죠.
~/.vim ├── after ├── autoload ├── backups ├── bundle │ ├── Align │ │ ├── autoload │ │ ├── doc │ │ └── plugin │ ├── FuzzyFinder │ │ ├── autoload │ │ │ └── fuf │ │ ├── doc │ │ └── plugin │ ├── The-NERD-Commenter │ │ ├── doc │ │ └── plugin │ ├── The-NERD-tree │ │ ├── doc │ │ ├── nerdtree_plugin │ │ └── plugin --------(생략)--------------- ├── colors ├── doc ├── ftdetect ├── ftplugin ├── indent ├── lib ├── plugin ├── syntax └── undos
이렇게 구성해놓고 vim 을 정상 동작하도록 하는 녀석이 바로 pathogen.vim(: manage your runtimepath) 입니다. Vim 의 런타임 패스를 조작하는 방식이죠. (참고로 이 플러그인의 개발자인 tpope's Profile - GitHub 를 보시면 정말 굉장합니다. 특히, Rails 개발자에게 이 아저씨가 만든 vim-rails 는 예술입니다.)
자 이렇게 만드는 것만으로, Vim 플러그인 개발과 공유는 매우 쉽게 되었습니다. 이게 2010년 입니다. 더불어서 이때가 github 이 등장하면서 이 위에서 오픈소스로 vim 플러그인 개발이 매우 용이해 졌습니다. 그냥 ~/.vim/bundle 밑에 git clone 하는 것으로 플러그인을 설치하고 개발할 수 있거든요. 최근 Vim 플러그인에 관심을 가진 분이라면 pathogen.vim 이 심심치 않게 등장하는 걸 볼수 있을 겁니다. 여기까지만 써도 기존 플러그인 보다 정말 혁신적인 환경을 사용할 수 있습니다.
Vim Plugin Package Manager - vundle.vim
그런데 개선은 여기에서 멈추지 않습니다.
이 시기에 github 가 폭풍처럼 인기를 끌기 시작합니다. (현재 github의 커밋 숫자는 sf, google code를 합친 숫자를 훨씬 뛰어 넘습니다.)
우선 위에 잠깐 등장한 등장한 Ruby 세상의 Bundler 라이브러리의 역할을 조금 자세히 소개해야 겠습니다. 이 녀석은 지정된 라이브러리를 공용 저장소 서버에서 가지고 와서 설치히고 패키징도 하는 역할을 합니다. 그런데 이 저장소를 정해진 서버가 아니라 라이브러리 단위로 git으로 노출된 서버를 지정할 수 있는 강력한 특징이 있습니다. 즉, 네트웍이 연결된 git 저장소에서 소스를 들고와서 이를 라이브러리로 패키징 하는 개념이죠. 주소 변경 만으로 개발 버전과 제품 버전을 바꾸어서 패키징하는 등 많은 이점이 있습니다.
git을 배포 저장소로 하는 이득이 너무 커서, Rails 세상에서는 소스 서버 대상을 아예 git으로 타케팅 해버리는게 일상화 되어 버립니다.
이런 git을 통해서 배포하는 Bundler의 아이디어와 Vim 의 런타임 패스를 조작해서 플러그인 배포 환경을 개선한 pathogen 에서 영감을 얻어 만들어진 'Vim Plugin Manager'가 바로 마지막에 소개하는 vundle.vim 입니다.
즉, vundle.vim 은 모든 플러그인을 특정 웹사이트( http://vim-scripts.org ) 에 담긴 인덱스와 git 저장소 정보를 바탕으로 마치 애플의 앱스토어 처럼 플러그인을 설치하는 통합 환경을 Vim에 제공합니다. 그리고 플러그인 단위로 다른 git 저장소를 지정해서 설치할 수도 있습니다. 아래 활용의 스크린샷을 참고하세요.
- 참고로 welcome home : vim online를 미러링해둔 플러그인은 vim-scripts's Profile - GitHub에 저장되어 있습니다. 무려 저장소가 3660개가 넘어가죠. 저는 github 애들이 이걸다 지원해준다는 점이 정말 놀랍습니다.
vundle.vim 설치 정보
Vim Scripts에서 vundle.vim 과 이와 동일 역할을 하는 다른 도구들을 찾을 수 있습니다.
vundle의 설치 단계는 다음 문서를 참고하세요.
- gmarik/vundle - GitHub
- Vundle Wiki FAQ - GitHub ~ Mac 사용자는 여기 마지막에 유의하세요.
vundle 은 플러그인 자체를 관리하는 플러그인 입니다. 설치 방법은 위에 잘나와 있으니 생략하고 간단히 제가 사용하는 과정을 첨부합니다.
vundle.vim 의 사용 사례 1
만약 제가 새로운 vim 플러그인을 설치하려면 일단 Google이나 scripts : vim을 검색합니다. 그리고 이름을 알아내죠.
이번에 저는 Align 라는 녀석을 설치하려 해요. 일단 vundle 이 지원하는지 확인합니다.
:BundleSearch
그러면 vundle 을 이용해서 설치할수 있는 리스트가 나옵니다. 이 리스트는 Vim Scripts 의 인덱스를 기본으로 합니다. 참고로 해당 사이트는 여전히 개선 중입니다. (아직 추천이나 검색이 없습니다.)
여기에서 검색! Align가 있네요. 오호! 제 vim 설정 파일을 엽니다.
:vs $MYVIMRC
이제 왼쪽에서 찾은 플러그인 한줄을 오른쪽의 제 $MYVIMRC 에 복사합니다. (리스트에서 I를 누르면 그냥 설치는 됩니다. 문제는 관리를 위해서 리스트에 추가시켜 주는 겁니다.)
그리고 나서
:BundleInstall
이러면, 네트웍을 통해서 소스를 가지고와서 설치하고 도움말을 위한 인덱스 생성까지 깔끔하게 마무리 해줍니다.
BundleSearch -> $MYVIMRC 에 원하는 라인 복사 -> BundleInstall
어때요 사용 방법이 참 쉽죠(?)
(과거를 생각해 보세요. 일단 찾아서 웹사이트에서 다운을 받은후 이게 text인지, zip인지 vba인지 파악한 후, 터미널 열어서 zip이면 cp로 적절한 위치에 복사하고 vba면 실행하고, vim help 뒤져서 플러그인의 도움말을 위한 tag를 만들주는 명령을 실행하면 완료입니다. 헉헉..)
Vim Scripts 측은 기존의 scripts : vim 를 모두 github 에 미러링 해두어서 대부분의 플러그인은 무리 없이 찾을수 있습니다. 스크린샷 오른쪽의 16라인을 보시면 저런식으로 각 플러그인의 소스 저장소를 git으로 직접 명시할 수도 있습니다.
그리고 플러그인이 마음에 들지 않는다면 $MYVIMRC (.vimrc) 에서 해당 플러그인 라인을 제거하고 다음을 실행합니다.
:BundleClean
이 명령어는 위 스크린샷 오른쪽 편에 Bundle "plugin-name" 으로 기술되지 않은 플러그인을 일괄 삭제합니다. (역시 과거를 생각해 보세요. find, grep rm 신공을 이용해서 손수 찾아서 삭제해야 합니다.)
좀 더 자세한 건 도움말을 참고하세요.
:help vundle
vundle 활용 사례 2
저는 Client, Server 에서 여러 곳에서 동일 개발 환경을 유지하기 위해서 개인 정보를 제외한 모든 개발 환경 정보를 소스 저장소를 통해 관리합니다. (예전에는 Google code, 지금은 github 입니다. 악성 사용자일까요? ) 소스를 체크 아웃하고 필요한 것만 심볼릭 링크 걸어서 쓰는 방법을 즐깁니다. (체크 아웃 빼고는 모두 자동화 되어있습니다. )
그런데 vundle 을 사용하기 전에는 vim 의 모든 플러그인을 함께 넣어 두었습니다. 여기
~/.bash_settings/ ├── .bashrc ├── .bashrc_mac ├── .ctags ├── .gemrc ├── .git --------(생략)---------- ├── .irbrc ├── .screenrc ├── .scripts ├── .vim <- 여기에 모든 플러그인 파일을 담아 두었습니다. ├── .vimrc --------(생략)---------- └── setup.rb
vundle 적용후 대부분의 큰 플러그인들은 vundle을 통해 일괄 설치하고, 자작이나 커스텀 플러그인만 넣어두고 관리합니다. vundle의 사용을 알면 이제 .vimrc 파일 하나만 들고 다녀도 동일 플러그인 환경을 언제든 구성할 수 있게 됩니다.