VIM and Python - a Match Made in Heaven이 안된다는 분들을 위한 작은 가이드

"VIM and Python - a Match Made in Heaven"을 진행했던 많은 친구들의 질문에 대답하기 귀찮아서 만들어본 문서입니다. VIM이나 Python에 대한 내용은 설명하고 있지 않습니다.

주의사항

  • 원문을 진행하다 만나게 되는 작은 오류에 대한 작은 가이드 입니다.

VIM and Python이 안되는 '분들을'위한 작디 작은 가이드(일까? 과연? 그러한가?)

[...] I feel it’s my duty to provide a counterexample by way of the only TRUE Python development environment you will ever need – and that environment is of course VIM. That’s right. [..] On the down side though, VIM can be a pain to configure, but fear not – This article will show you how to get a powerful VIM environment setup, geared towards wrangling Python day in and day out.

이 글의 원저작분께서 왜 이런 감정을 몸소 'feel'하시는지 알 수 없지만, 요즘 유행하는 '참 바다씨'에 버금가는 '참 파이썬씨'가 되려면 VIM을 잘 써야 된다는 주장을 하셨습니다. 그럼에도 불구하고 해당 튜토리얼을 따라하면 '나만 안되는'일이 발생하곤 합니다. 저와 함께 수행(예토전생?)의 길을 떠나봅시다.

만약 VIM 사용법이 익숙하지 않으시면 이 곳저 곳을 확인해 보시기 바랍니다. 전 이 곳을 추천합니다. 그렇지만 여기부터 먼저 들러보시는건 어떤가요? 단돈 89달러에 이 모든 압박을 해결하실 수 있습니다!

설치 및 업그레이드

대부분의 *NIX에는 VIM이 설치되어 있습니다.

$ ./vim --version

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Aug 22 2015 15:38:58)  
Compiled by root@apple.com  
Normal version without GUI.  Features included (+) or not (-):  
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs
-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path
+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv
+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype
+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn
-python3 +quickfix +reltime -rightleft +ruby/dyn +scrollbind +signs
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
 -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe  
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses  

엄청나게 굉장한 내용이 출력되지만 체크해야 할 항목은 두 가지 입니다. * vim > 7.3 이상 * Python 지원; 위에서 '+python' 부분

만약 VIM이 설치되어 있지 않거나 위의 두 가지 조건(7.3, +python)이 출력되지 않으면 VIM을 어떻게(응?) 해야 하는데, 이런 귀찮음은 받아들이기 곤란하기 때문에 brew를 이용해서 VIM을 설치해 보도록 하겠습니다.( * brew 설치는 이 곳에 가시면 됩니다.

$ brew update
$ brew install vim

[!] 새로 설치한 VIM이 실행되지 않는 경우

brew를 이용해서 열심히 설치했는데 vim --version을 하게 되면 설치가 안되었다는 결과가 출력되곤 합니다. '왜 나만 안되는가?'에 대해서 고민하기 전에 다음과 같이 PATH를 확인해 보도록 하겠습니다.

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

위의 $PATH에서 확인하실 수 있듯이, brew로 설치한 VIM이 실행되도록 하려면 '/usr/local/bin'이 '/usr/bin'앞에 위치해야 합니다. $PATH를 변경하셔야 되는 분들은 이곳을 참고해 주세요.

VIM의 확장(Extensions) 관리자 설치하기

VIM에는 몇가지 확장기능을 관리하는 것들이 있습니다. 그런데 'Real Python'에서 강력하게 권장하는 것은 Vundle 입니다. Vundle을 설치하게 되면 VIM의 설정 파일인 .vimrc에서 모든 확장을 관리 할 수 있습니다.

$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

이렇게 된 이상 우리는 .vimrc파일을 만들어 보겠습니다.

$ touch ~/.vimrc

해당 파일의 상단에 아래의 내용을 추가해주세요.

set nocompatible              " required  
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim  
call vundle#begin()

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

" Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin)


" All of your Plugins must be added before the following line
call vundle#end()            " required  
filetype plugin indent on    " required  

해당 설정이 끝나면 VIM을 실행시키고 명령행 모드에서 :PluginInstall로 플러그인을 설치하면 기본적인 Vundle 설정은 끝납니다.

Python IDE를 설정해 봅시다.

Split Layouts에서 배우는 단축키 등록 방법

한번에 여러개의 파일을 볼 필요가 있을 때 화면을 분할해서 활용해야 합니다. VIM에서 화면을 분할하는 방법은 아래와 같습니다. * 수평분할 : :sv <filename> * 수직분할 : :vs <filename>

화면을 분할하게 되면 분할된 화면의 이동이 가장 큰 문제인데, 해당 단축키가 형태로 되어있기 때문에 녹녹치 않습니다. 쉽게 말해서 손가락이 많이 피곤합니다. 따라서 분할된 화면을 좀 더 수월하게 이동하기 위해서 단축키를 등록하는게 일반적인 방법입니다. 단축키를 등록하는 방법은 아래와 같습니다.

nnoremap <C-J> <C-W><C-J> " move to the split below  
nnoremap <C-K> <C-W><C-K> " move to the split above  
nnoremap <C-L> <C-W><C-L> " move to the split to the right  
nnoremap <C-H> <C-W><C-H> " move to the split to the left
  • 'nnoremap'등과 같은 설정에 대한 자세한 사항은 이 곳에서 확인 하실 수 있습니다.

[!] 그런데 .vimrc 어느 부분에 입력하면 될까요?

.vimrcPlugin을 설정하는 부분은 "Plugin 'gmarik/Vundle.vim'" 아래에 위치시키면 됩니다. 그리고 Plugin설정을 제외한 모든 부분은 "filetype plugin indent on" 아래에 위치시키면 됩니다.

set nocompatible              " required  
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim  
call vundle#begin()

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

" Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin)

call vundle#end()            " required  
filetype plugin indent on    " required

let g:SimpylFold_docstring_preview = 1

"split navigations
nnoremap <C-J> <C-W><C-J>  
nnoremap <C-K> <C-W><C-K>  
nnoremap <C-L> <C-W><C-L>  
nnoremap <C-H> <C-W><C-H>

Code Folding, Plugin 설치를 복습해보자!

클래스나 메소더 정의 라인만 보여주는 방법이 필요할 때가 있습니다. 이런 저런 방법이 있지만 아래 플러그인 하나만 설치해주시면 됩니다.

Plugin 'tmhedberg/SimpylFold'  

그리고 VIM의 명령행에서 :PluginInstall로 해당 플러그인을 설치하셔야 됩니다. 해당 플러그인을 설정 파일에 적으셔도 설치하지 않으시면 작동하지 않습니다.

Auto-complete

VIM에서 자동완성을 도와주는 기능 입니다. 해당 기능을 사용하기 위해서 .vimrc의 플러그인을 설치하는 부분에 아래의 내용을 추가해 주시고 해당 플러그인을 설치하시면 됩니다.

Bundle 'Valloric/YouCompleteMe'  

그리고 플러그인의 내용을 설정하시기 위해서 아래와 같은 내용을 넣어주시면 됩니다

let g:ycm_autoclose_preview_window_after_completion=1  
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>  

[!] 그래도 동작하지 않아요!

YouCompleteMe의 경우 '~.so' 파일이 없다는 에러가 나옵니다. YouCompleteMe를 사용하기 위해서는 필요한 몇가지 것들을 컴파일 해야 합니다. 컴파일 하기 위해서 'cmake'를 설치해주시고, '~/.vim/bundle/YouCompleteMe`로 이동하셔서 './install.py'를 실행시키면 됩니다. 쉽게 말씀드리자면 '컴파일 하셔야 됩니다'로 귀결 됩니다.

$ brew install cmake
$ cd ~/.vim/bundle/YouCompleteMe/install.py

Python Indentation

들여쓰기 부분의 경우 원문에 있는 내용을 복사하면 에러가 납니다. 아래 부분을 참고하셔서 설정파일을 수정하시기 바랍니다.

au BufNewFile,BufRead *.py  
    \ set tabstop=4 |
    \ set softtabstop=4 |
    \ set shiftwidth=4 |
    \ set textwidth=79 |
    \ set expandtab |
    \ set autoindent |
    \ set fileformat=unix |

au BufNewFile,BufRead *.js,*.html,*.css  
    \ set tabstop=2 |
    \ set softtabstop=2 |
    \ set shiftwidth=2 |

이젠 다른 분들의 설정파일을 참고해 봅시다!

위의 내용들 정도만 주의하시면, 나머지 내용은 복/붙을 진행하시면 됩니다. 그리고 진행하시면서 발생하는 에러의 경우 검색하시면 충분한 해답을 얻을 수 있습니다(좀 과도한 해결책을 드릴껍니다).