2011년 10월 25일 화요일

[Vim] 강력한 자동완성 플러그인 neocomplcache

neocomplcache는 autocomplpop을 능가하는 자동완성 기능을 제공한다. autocomplpop이 Vim의 기본적인 자동완성 기능을 자동으로 동작시키는 것과는 다르게 텍스트 뿐만 아니라 Vim 사용에 편리한 다양한 커맨드들을 자동완성 해 준다.

VIM Scripts: http://www.vim.org/scripts/script.php?script_id=2620
Repository: https://github.com/Shougo/neocomplcache

배포되는 형태는 플러그인 및 관련 디렉토리가 패키징 된 형태이기 때문에 여타 Vim 플러그인을 설치할 때 처럼 내용을 몽땅 ~/.vim/ 에 복사하면 된다.

실행에 필요한 설정은 한 줄이면 된다.
let g:neocomplcache_enable_at_startup = 1
이 설정이 없으면 수동으로 활성화 해 주어야 한다. 굳이 자동으로 활성화 되지 않기를 원하는 경우는 별로 없어서 위 설정을 하는 편을 추천한다.

위 링크된 사이트나 저장소에서도 샘플 설정을 올려놓고 있다. 다음과 같은 내용이다.
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Use camel case completion.
let g:neocomplcache_enable_camel_case_completion = 1
" Use underbar completion.
let g:neocomplcache_enable_underbar_completion = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : '',
    \ 'vimshell' : $HOME.'/.vimshell_hist',
    \ 'scheme' : $HOME.'/.gosh_completions'
    \ }

" Define keyword.
if !exists('g:neocomplcache_keyword_patterns')
  let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '\h\w*'

" Plugin key-mappings.
imap      (neocomplcache_snippets_expand)
smap      (neocomplcache_snippets_expand)
inoremap      neocomplcache#undo_completion()
inoremap      neocomplcache#complete_common_string()

" SuperTab like snippets behavior.
"imap  neocomplcache#sources#snippets_complete#expandable() ? "\(neocomplcache_snippets_expand)" : pumvisible() ? "\" : "\"

" Recommended key-mappings.
" : close popup and save indent.
inoremap   neocomplcache#smart_close_popup() . "\"
" : completion.
inoremap   pumvisible() ? "\" : "\"
" , : close popup and delete backword char.
inoremap  neocomplcache#smart_close_popup()."\"
inoremap  neocomplcache#smart_close_popup()."\"
inoremap   neocomplcache#close_popup()
inoremap   neocomplcache#cancel_popup()

" AutoComplPop like behavior.
"let g:neocomplcache_enable_auto_select = 1

" Shell like behavior(not recommended).
"set completeopt+=longest
"let g:neocomplcache_enable_auto_select = 1
"let g:neocomplcache_disable_auto_complete = 1
"inoremap   pumvisible() ? "\" : "\"
"inoremap   neocomplcache#smart_close_popup() . "\"

" Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

" Enable heavy omni completion.
if !exists('g:neocomplcache_omni_patterns')
  let g:neocomplcache_omni_patterns = {}
endif
let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
"autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete
let g:neocomplcache_omni_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
let g:neocomplcache_omni_patterns.c = '\%(\.\|->\)\h\w*'
let g:neocomplcache_omni_patterns.cpp = '\h\w*\%(\.\|->\)\h\w*\|\h\w*::'
적절히 필요없는 설정은 덜어내고 바꾸고 싶은 것이 있다면 바꾸면 될 것이다. 개인적으로는 위 기본 설정 만으로도 만족스러운 사용이 가능했다.


막강한 기능을 엿볼 수 있는 하나의 스크린 샷. python 파일 편집을 시작해서 'im'을 입력했을 뿐이다. Vim의 자동완성 기능 그 자체만 썼다면 여기서 아무것도 나오지 않았을 가능성이 높은데 (실제로 다른 파일을 열어서 인덱싱이 되어 있다면 import가 자동완성 될 수도 있다) neocomplcache는 알아서 이 편집 중인 파일에 맞게 자동완성 정보를 미리 보유하고 있다.

댓글 4개 :

Wook :

저 수동을 자동으로 바꾸어주는 설정은 어디에 입력하나요?

Seorenn :

vim 설정은 당연히 ~/.vimrc 파일이죠 ^^; 윈도우의 경우라면 vim이 설치된 디렉토리에서 _vimrc 파일을 찾아보면 될겁니다.

bro :

좋은 글 감사합니다. 현재 neocomplcache를 설치해봤는데요..
object c의 omni를 활성화하려면 어떻게해야하나요?

Seorenn :

bro// vim으로 objC 코딩을 하질 않아서 잘 모르겠습니다. ^^;