일단 스샷부터 ^^;
환경으로는, 일단 vim을 사용하고, 플러그인은 taglist.vim, project.vim, cscope_quickfix.vim, matchit.vim, railsvim.vim을 사용.
set nocp filetype on filetype indent on filetype plugin on syntax on color ron set sm set ruler set history=1000 set backspace=indent,eol,start set backup set backupdir=~/.vim/backup set directory=~/.vim/tmp set cmdheight=2 set ignorecase set incsearch set hlsearch set fencs=ucs-bom,utf-8,euc-kr.latin1 set enc=euc-kr set iminsert=0 set imsearch=0 set noea " automatically delete trailing Dos-returns,whitespace autocmd BufRead * silent! %s/[\r \t]\+$// autocmd BufEnter *.php :%s/[ \t\r]\+$//e " Omnicompletion au FileType ruby,eruby set omnifunc=rubycomplete#Complete et si au FileType ruby,eruby let g:rubycomplete_rails = 1 " 80 column setting au BufNewFile,BufRead *.c,*.h,*.rb,*.java,*.CPP,*.cc,*.C,*.hpp,*.H exec 'match Todo /\%>' . &textwidth . 'v.\+/' " Indent settings set ts=4 set sw=4 set sts=4 " Compiler setting au FileType c set makeprg=gcc\ % au FileType cpp set makeprg=g++\ % au FileType java set makeprg=java\ % au FileType ruby set makeprg=ruby\ -wc\ % map <F2> :w<cr> map <F3> <c-w>w map <F4> :res<cr> map <F5> :w<cr> :make %<cr> :cope<cr> map <F6> :WMToggl<cr> :Tlist<cr> map <F7> :TlistSessionSave map <F8> :TlistSessionLoad map <F9> :q<cr> map <c-w><c-w> :WMToggle<cr> map <c-w><c-t> :Tlist<cr> map <c-w><c-p> :TlistSessionSave tlist<cr> map <c-w><c-u> :TlistSessionLoad tlist<cr> map <c-w><c-f> :FirstExplorerWindow<cr> map <c-w><c-b> :BottomExplorerWindow<cr> " changing window size when splitted map <c-j> <C-W>- map <c-k> <C-W>+ imap <c-j> <esc><C-W>-i imap <c-k> <esc><C-W>+i " copy and paste map <c-a> <esc> :0<cr>vG$ botright cwindow " showmarks settings let showmarks_enable = 0 " Taglist settings let Tlist_Process_File_Always = 0 let Tlist_Enable_Fold_Column = 0 let Tlist_Display_Tag_Scope = 0 let Tlist_Sort_Type = "name" let Tlist_Use_Right_Window = 1 let Tlist_Display_Prototype = 1 let Tlist_Exit_OnlyWindow = 1 let Tlist_File_Fold_Auto_Close = 0 let winManagerWindowLayout = 'FileExplorer|BufExplorer' " Automatic folding au BufWinLeave *.rb mkview au BufWinEnter *.rb silent loadview au BufWinLeave *.c mkview au BufWinEnter *.c silent loadview au BufWinLeave *.cpp mkview au BufWinEnter *.cpp silent loadview au BufWinLeave *.C mkview au BufWinEnter *.C silent loadview au BufWinLeave *.h mkview au BufWinEnter *.h silent loadview au BufWinLeave *.H mkview au BufWinEnter *.H silent loadview au BufWinLeave *.hpp mkview au BufWinEnter *.hpp silent loadview au BufWinEnter *.hpp set syntax=cpp " C++ man page au FileType c,cpp noremap K :exec '!man std::' . expand ("<cword>")<CR> au FileType ruby noremap K :exec '!ri ' . expand("<cword>")<CR> if !exists( "*EndToken" ) function EndToken() let current_line = getline( '.' ) let braces_at_end = '{\s*\(|\(,\|\s\|\w\)*|\s*\)\?$' if match( current_line, braces_at_end ) >= 0 return '}' else return 'end' endif endfunction endif imap <c-_> <ESC>:execute 'normal o' . EndToken()<CR>O
그외에,
(1) vi 실행은 vi +Tlist (옵션이 있지만 항상 Tlist쓰는건 싫어서..). 그리고 winmanager띄울때는 F6. 파일 탐색기 CTRL+WT, 태그 탐색기 CTRL+WB. 태그 탐색기 창에서 x 쳐서 태그창 vertical split 키웠다 줄였다를 수행하고, 파일 탐색기에서 tab 치면 새창으로 파일이 열린다.
(2) set makeprg는 필요에따라 편집중에 수정하고 :mak(컴파일), :cw(에러가 있으면 결과 창 열기), :cope(무조건 결과 창열기), :ccl(결과 창 닫기), :cr(처음 에러로), :cn(다음 에러로), :cp(이전 에러로) 를 사용하여 에러를 고침
(3) 소스는 taglist.vim을 사용해 navigate하지만 :ctags -R *을 사용해 필요하면 태그 생성하고 CTRL+] 와 CTRL+T로 돌아다님.
(4) mark는 :marks 로 전체 마크 보고 ‘m마크 로 이동.
(5) 레퍼런스는 SHIFT+K로 보고, C++ 의 경우는 SGI STL 문서와 cplusplus.com, http://www.cppreference.com 와 구글님께 물어봄. 그외 다들 보는 책인 EC++, MEC++을 봄.
(6) 새 문서 부를때는 F3->F4->O 눌러서 파일열어서 봄.
(7) zapping은 v}zf, za, mkvie, lo
(8) Jump간 이동은 CTRL+O, CTRL+I
(9) 문단간 이동 {,}
(10) 괄호 대응 확인 %
(11) 선언보기 [I, 선언 및 사용보기 gd, 새창으로 선언보기 ^wi
(12) gf – 커서가 위치한 곳에 있는 파일 열기 (예: #include “xxx.h”에서 xxx.h를 연다.)
(13) `. – 최종 수정한 곳으로 점프
(14) CTRL+X, CTRL+L – 라인 completion
(15) grep은 단순히 :grep foo *.c 와 같이 수행. 그 뒤, 컴파일과 동일한 방식으로 grep의 결과를 traverse
(16) identifier 선언을 새창으로 열기 CTRL+W, I, 커서 밑에 위치한 파일명의 파일을 새창으로 열기 ^W f, ctags로 identifier 선언 연동은 ^W, ^]
(17) 이전 파일 열기 ^6. 이전파일을 새창으로 ^w^6. 버퍼 탐색시 ls 로 보고나서 b(uf) 번호, 번호 ^W ^6. 또는 winmanager 좌하단의 bufexplorer를 쓸 수 있음. 이때는 C+W,C+F 또는 C+W,C+B 로 file explorer와 buf explorer를 탐색함.
(18) 위아래 창 바꾸기 CTRL+W,R 현재창만 남기고 다 닫기 ^Wo
(19) cscope -R -b 로 db 생성한후, csc(또는 cs) s (검색)을 할 수 있다. 또 g(전역 정의 찾기 – ctags와 같은 역할), i(해당 파일을 include 하는 파일 찾기), f (파일 찾기), c (이 함수를 호출하는 곳 찾기)가 있음. 창 나누며 검색한 결과를 보고 싶은 경우 csc 대신 scs사용. 또는 cscope_quickfix.vim의 방법을 사용해 C+\, S/G/F/I/C/D 를 사용할 수도 있음. 이 단축키를 쓸 경우 quickfix window가 열려서 편리함.
(20) 인덴트시에는, v 로 영역설정후 << 또는 >>을 하여 인덴트 조정 가능. 더 편하게 하려면 v로 영역 설정후 = 를 눌러 자동 설정할 수 있음. 특정 블럭에 적용하려면 =% 또는 v}=. 전체 파일은 gg=G. 붙여넣기 하면서 인덴트를 맞추려면 ]p
(21) ESC 대신 CTRL+[ 를 쓴다. 손이 편하다.
(22) C 키는 C++ 클래스에 대한 man page용으로 맵핑하였음. D 키는 STL extension에 대한 man page
(23) txt를 html로 변환 :runtime! syntax/2html.vim
(24) 현재파일을 abc.def로 변환하고 해당 파일을 열기: sav abc.def
(25) 커서 고정하고 화면 위 아래로 이동 ^y, ^e
(26) vimusage – 전체 help
(27) g-, g+, earlier 1h, later 1h: undo/redo
(28) sort, vimgrep: 내부 sort, 내부 grep(외부 grep 프로그램 없이)
(29) ctags 돌린뒤 해당 태그에 대한 파일 열기: vi -t task_struct
(30) 태그 위치 지정하기: set tags+=파일명
(31) 태그로 점프: tj 태그명. tn, tp.
(32) ctags 바이너리 서치: set tagbsearch
또한 전반적으로 unix에서 C++ 개발을 vi로 하는건 참 힘들다.
vi 와 결합하여 제대로 볼 수 있는 man 문서도 없고,
ctags, cscope 등도 C++과 결합이 되어있지 않다.
gcc.gnu.org에 libstdc++를 찾아가면 man 이 있지만 매우 부족함. libstdc++ 의 처음 시작 페이지는 man C++Intro 임.
그외 http://www.rayninfo.co.uk/vimtips.html 에 다수. (완전 암호 같음.)
* 설정 및 플러그인 한번에 받기: vim setting and plugins