ctrlp 와 NERDTree 설치

지난 글(universal-ctags 와 tagbar 설치)에서는 코드 분석에 유용한 vim 플러그인들을 설치했었고, 이번 글에서는 코드 탐색에 유용한 ctrlp 와 NERDTree 를 설치해보려 합니다. 두 플러그인 모두 vimawesome 사이트에서 항상 첫페이지에 위치해있는 유명한 플러그인들이고, 좋은 기능들을 제공해주므로 항상 필수로 설치하게되는 플러그인들입니다.

사실, NERDTree 대신 요즘 구글링 시 자주 보이는 coc-explorer 라는 플러그인을 설치해보려 했지만, 최근에도 이런저런 기능들이 매우 빠르게 추가되면서인지 불안정한 모습들이 조금 보여서 기존에 사용하던 NERDTree 그대로 설치하기로 결정했어요.


ctrlp 설치

ctrlp 는 이클립스의 파일 찾기 기능과 같이, 파일 검색과 관련된 매우 다양한 기능들을 제공합니다. 파일 검색 시 퍼지 검색, 정규식 검색 방식을 지원하며, 최근 사용한 파일 관리, 열려있는 파일 관리 등의 기능 들도 제공됩니다. 저의 경우 밑줄친 두 기능만을 주로 사용하고 있고, 이것만으로도 필수라 느껴지는 플러그인입니다. 설치 방법은 다음과 같습니다.

vim-plug 로 설치가 가능하니 .vimrc 내 vim-plug 초기화 섹션에 한 라인을 추가합니다.

$ vim ~/.vimrc
...
call plug#begin('~/.vim/plugged')
...
Plug 'ctrlpvim/ctrlp.vim'
...
call plug#end()
...

편집한 .vimrc 를 저장하고, 다시 읽어 플러그인을 설치합니다.

:w
:source %
:PlugInstall

플러그인은 설치 되었으니, .vimrc 에 관련 설정들을 추가하겠습니다. 

먼저 ctrlp 에서 인식할 프로젝트의 루트 마커를 지정합니다. 저의 경우 프로젝트의 루트에만 tags 파일을 생성해 두므로, 이 파일로 설정하겠습니다. 다음으로 검색 대상에서 제외할 파일 설정, 기본 탭을 files(파일 검색)에서 MRU files(최근 사용한 파일)로 변경하겠습니다.

" ctrlp 에서 인식할 프로젝트 루트 마커 지정
let g:ctrlp_root_markers = ['tags']

" *.swp, *.class 파일 무시
set wildignore+=*.swp,*.class

" <c-p> 기본 탭을 files 가 아닌 MRU files 로 설정
let g:ctrlp_cmd = 'CtrlPMRU'

설치도 설정도 완료했으니, 간단한 설명과 함께 잘 동작하는지 확인해보겠습니다. 

vim 으로 아무 파일이나 열고 Ctrl + p 를 눌러보면 하단에 files(파일 검색), MRU files(최근 사용한 파일), buffers(열려있는 파일) 와 같은 세 탭을 포함한 창이 생성되는 것을 볼 수 있습니다. 각 탭들은 위 괄호 안의 설명과 같은 기능들을 제공하고, 모두 문자 타이핑으로 검색하거나, 특정 파일을 여는 등의 동작들을 할 수 있습니다. 이때, 필수 또는 자주 사용되는 단축키들은 다음과 같습니다.

  • <c-f>, <c-b>: 탭 간 이동
  • <c-j>, <c-k> 또는 방향키: 파일 목록 이동
  • <c-t> or <c-v>, <c-x>: 선택된 파일을 탭 또는 분할 화면으로 열기
  • <c-r>: 정규식 검색 모드로 스위칭

추가로, files 탭은 열릴때마다 프로젝트의 전체 파일 목록을 색인하므로, 프로젝트 규모가 큰 경우 기본 탭으로 사용하기에 불편합니다. 따라서 전 MRU files 탭으로 설정해서 사용중이고, 이 부분은 .vimrc 에서 편한대로 변경해주시면 됩니다.

아래 그림은 Ctrl + f 로 MRU files 탭에서 files 탭으로 변경, 프로젝트의 파일을 검색하는 화면입니다. 잘 동작하는 것을 알 수 있습니다.

ctrlp 동작 화면


NERDTree 설치

ctrlp 만 잘 사용한다면 대부분의 경우에 필요한 파일을 열 수 있겠지만, 파일 이름이 아닌 위치 기준으로 보고 싶은 경우가 종종 있긴 하더라구요. vim 에서는 이런 경우 사용할 수 있는 netrw 라는 파일 브라우저를 제공하고 있습니다. (netrw 에는 이 외에도 강력한 기능들이 있긴 합니다. 전 사용해본 적 없지만...)

다만, 묘하게 불편한 사용성과 자잘한 버그들 때문에 개인적으로 사용안한지 몇 년 됐습니다. netrw 를 대체할 플러그인들이 꾸준히 나오는걸 보면 저 뿐만 아니라 다른 vim 사용자들도 비슷하게 생각하는 것 같아요. 

그럼 netrw 대신 뭘 쓰는게 좋을까요? 한 사이트에서 2020년도 최고 파일 브라우저 플러그인에 대한 설문을 진행 중인데, 1위는 역시 vimawesome 첫 페이지, 그것도 상단에 오래도록 순위를 유지중인 NERDTree 입니다. 

NERDTree 는 뭐가 좋을까요? 몇년간 사용하면서 느낀점은 netrw 대비 버그 발생 횟수가 적었고(없었던 건 아니였습니다), 사용성 측면에서 좀 더 편했습니다. 물론 더 이쁘기도 하구요. 또, 유명한 플러그인이다보니 NERDTree 에서 git 연동, 아이콘 표시 등등 연관된 플러그인들도 많아서 가지고 놀아볼만한 요소가 많아 보였어요. 

NERDTree 는 역시 vim-plug 로 설치 가능합니다. 아래처럼 .vimrc 내 vim-plug 초기화 섹션에 한 줄을 추가합니다.

$ vim ~/.vimrc
...
call plug#begin('~/.vim/plugged')
...
Plug 'preservim/nerdtree'
...
call plug#end()
...

편집한 .vimrc 를 저장하고, 다시 읽어 플러그인을 설치합니다.

:w
:source %
:PlugInstall

설치가 완료되었으니 관련 설정도 추가하겠습니다. 필수 설정은 아니고 좀 더 편하게 사용하려는 목적의 설정이니, 필요한 항목만 추가하거나 변경해서 사용해주시면 될 것 같아요.

" Ctrl + n 에 NERDTree 수행 커맨드 할당
map <c-n> :NERDTreeToggle<CR>

" vim 수행 시 파일 미지정 또는 디렉터리 지정 시 NERDTree 수행되도록 설정
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif

설정도 완료되었고, 간단한 설명과 함께 잘 동작하는지 확인 해보겠습니다.  

vim 으로 아무 파일이나 열고 Ctrl + n 을 눌러보면 좌측에 트리 형태의 파일 브라우저 창이 출력됩니다. 이 창에서는 파일 프라우징, 파일 열기 등의 기능들을 수행할 수 있고 자주 사용되는 단축키들은 다음과 같습니다.

  • t: 선택한 파일 탭으로 열기
  • i: 선택한 파일 세로 분할로 열기
  • s: 선택한 파일 가로 분할로 열기
  • h,j,k,l 및 enter: NERDTree 내에서 커서 이동
  • ?: 도움말

동작 확인 겸, NERDTree 에서 임의의 파일을 분할 화면과 신규 탭으로 열어보겠습니다. 잘 동작하는 것을 알 수 있습니다.

NERDTree 동작 화면


* Environment

- HW: DS920+ (Synology NAS)
- OS: Ubuntu 20.04 (Docker container)
- vim 8.1


* References

- GitHub: ctrlpvim/ctrlp.vim
- slant.co: 7 Best tree explorer plugins for Vim as of 2020
- GitHub: preservim/nerdtree

Leave a Comment