Vim Plugins

vim을 쓰는 가장 큰 이유중 하나는 바로 이 Plugin에 있지않나 싶다. 설치도 비교적 간편하며, 확장성이 뛰어나서 플러그인을 사용하면서 불편한 부분들을 설정파일을 통해 입맛에 맞게 바꿀 수 있다는 점이 매력적이다.

지금도 유용하게 사용하는 vim 플러그인들에 대한 소개와 설치방법 및 사용법에 대해 간단히 알아보겠다.

 

플러그인 매니저 설치

vim에서 Plugin들을 설치, 관리해주는 도구들이 여러개 있는데 (Vundle, Pathogen) 그 중에서 나는 junegunn님이 만드신 vim-plug를 사용중이다.
현재 neovim을 사용중이므로 설치 방법은 아래와 같다.

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

그 외의 설치방법은 여기를 참고하면 된다.

NerdTree

nerdtree는 vim에서 파일트리를 보여주는 도구로, 여러 파일을 왔다갔다 할때 유용하게 사용된다.


선택된 파일에서 단축키 m을 입력하면 위 사진처럼 현재 경로의 파일들을 트리형식으로 나타내준다.

  • a : 파일 및 디렉터리를 추가생성한다.
  • m : mv와 같은명령으로 파일 및 디렉터리를 옮긴다.
  • r : 탐색기로 선택된 파일을 연다 ( nautilus, finder ..)
  • o : 메모장이나 gedit 같은 시스템 편집기로 선택된 파일 연다.

vim 설정은 아래와 같이 설정해두었다.

" vim을 열때마다 자동으로 nerdtree를 실행한다.
" https://github.com/preservim/nerdtree#how-can-i-open-nerdtree-automatically-when-vim-starts-up-on-opening-a-directory 
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
" <F9> NerdTree 열고 닫기 매크로 설정
noremap <F9> :NERDTreeToggle<CR>

Tagbar

Tagbar는 현재 파일의 Class ,Structure 정보 및 ctags가 생성한 tags를 트리 형식으로 보여주는 플러그인이다. 이 플러그인을 사용하려면 우선적으로 ctags가 설치돼있어야 한다.

"Ubuntu"
sudo apt-get install exuberant-ctags
"OS X"
brew install ctags

아래의 vim 설정을 통해 F8을 Tagbar단축키로 설정해두었다.

" ctags 경로 설정
let g:tagbar_ctags_bin='/usr/local/bin/ctags'
let g:tagbar_autoclose=0
let g:tabar_autofocus=1
" <F8> Tagbar 열고 닫기 매크로 설정
noremap <F8> :TagbarToggle<CR>

FZF

강력한 터미널 파일탐색 도구인 fzf를 vim 플러그인으로 사용할 수 있다.
기존에는 ctrlp를 사용하다가 fzf를 알고나서부터는 이것만 주욱 써오고 있다. 아직은 fzf를 완벽하게 사용하지는 못하고 있지만, 파일 탐색, 버퍼, 문자열 찾기 기능등으로 쓰고 있다.

vim-plug를 이용해 설치한다.

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

fzf-vim의 기능 중 AgRg의 기능을 사용하기 위해 다음의 프로그램중 하나를 필요로 한다.

만약 검색결과에 대해 Syntax Highlighting을 원한다면 bat을 설치해주자.
 

Customization

fzf-vim은 기본적으로 편집창 아래에 검색결과를 나타내주는데, 이것또한 변경이 가능하다.

1. fzf layout

" fzf layout
let g:fzf_layout = {'up':'~90%', 'window': { 'width': 0.8, 'height': 0.8,'yoffset':0.5,'xoffset': 0.5, 'highlight': 'Todo', 'border': 'sharp' } }

let $FZF_DEFAULT_OPTS = '--layout=reverse --inline-info'
let $FZF_DEFAULT_COMMAND="rg --files --hidden --glob '!.git/**'"

" Customize fzf colors to match your color scheme
" - fzf#wrap translates this to a set of `--color` options
let g:fzf_colors =
\ { 'fg':      ['fg', 'Normal'],
  \ 'bg':      ['bg', 'Normal'],
  \ 'hl':      ['fg', 'Comment'],
  \ 'fg+':     ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
  \ 'bg+':     ['bg', 'CursorLine', 'CursorColumn'],
  \ 'hl+':     ['fg', 'Statement'],
  \ 'info':    ['fg', 'PreProc'],
  \ 'border':  ['fg', 'Ignore'],
  \ 'prompt':  ['fg', 'Conditional'],
  \ 'pointer': ['fg', 'Exception'],
  \ 'marker':  ['fg', 'Keyword'],
  \ 'spinner': ['fg', 'Label'],
  \ 'header':  ['fg', 'Comment'] }

2. Files

"Get Files
command! -bang -nargs=? -complete=dir Files
    \ call fzf#vim#files(<q-args>, fzf#vim#with_preview({'options': ['--layout=reverse', '--inline-info']}), <bang>0)

3. Rg

" Get text in files with Rg
" command! -bang -nargs=* Rg
"   \ call fzf#vim#grep(
"   \   "rg --column --line-number --no-heading --color=always --smart-case --glob '!.git/**' ".shellescape(<q-args>), 1,

 " Make Ripgrep ONLY search file contents and not filenames
command! -bang -nargs=* Rg
  \ call fzf#vim#grep(
  \   'rg --column --line-number --hidden --smart-case --no-heading --color=always '.shellescape(<q-args>), 1,
  \   <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'up:60%')
  \           : fzf#vim#with_preview({'options': '--delimiter : --nth 4.. -e'}, 'right:50%', '?'),
  \   <bang>0)

" Ripgrep advanced
function! RipgrepFzf(query, fullscreen)
  let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case %s || true'
  let initial_command = printf(command_fmt, shellescape(a:query))
  let reload_command = printf(command_fmt, '{q}')
  let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]}
  call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen)
endfunction

command! -nargs=* -bang RG call RipgrepFzf(<q-args>, <bang>0)