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의 기능 중 Ag
와 Rg
의 기능을 사용하기 위해 다음의 프로그램중 하나를 필요로 한다.
만약 검색결과에 대해 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)