초보 개발자의 Vim 개인 설정

그동안 미루고 미루어 오다가 드디어 Vim 개인 설정을 마쳤습니다. 웹에 퍼져있는 여러 vimrc 파일들을 참조하고 Vim 영문매뉴얼도 뒤져 보았네요. 그리고 제 영어 실력이 어느 정도인지를 뼈져리게 깨달았습니다. OTL

플러그인

사용하는 플러그인은 아래와 같습니다.

  • a.vim : C/C++ 헤더파일 생성/스위치 플러그인.
  • c.vim : C/C++ 지원 플러그인.
  • taglist : 함수, 메소드, 클래스 등의 목록을 별도의 창에 보여주는 플러그인. ctags 필요.
  • NERD_tree.vim : 향상된 익스플로러 플러그인.
  • dic : 터미널용 야후/네이버 사전 프로그램. Vim의 Shift+k 키로도 사용 가능.

vimrc

scripte utf-8
" vim: set fenc=utf-8 tw=0: "
" 파일의 첫부분에 위의 2줄을 꼭 남겨 두십시오. "

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 6l4ck3y3(까막눈)의 Vim 설정 파일 "
" 마지막 수정: 2010-06-14 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 프로그램 기본 설정 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 오리지널 Vi 와의 호환성을 없애고, Vim 만의 기능들을 쓸 수 있게 함. "
set nocp

" 모든 옵션을 원래대로 복원 "
set all&

" 명령어 기록을 남길 갯수 지정 "
set hi=100

" 오류음 대신 비주얼벨 사용 "
set vb

" 매크로 실행중에 화면을 다시 그리지 않음 "
set lz

" 프로그램 시작시 플러그인 로드 "
set lpl

" 인코딩 설정 "
" 문서를 읽을 때 BOM 을 자동으로 제거하려면, fencs 맨 앞에 ucs-bom 를 추가하세요. "
"let &tenc=&enc "
set enc=utf-8
set fenc=utf-8
set fencs=utf-8,cp949,cp932,euc-jp,shift-jis,big5,ucs-2le,latin1

" 인쇄 옵션 설정 "
" set printencoding=utf8 "
" set printmbcharset=ISO10646 "
" set printmbfont=r:나눔고딕코딩,c:yes,a:yes "
" set printfont=나눔고딕코딩\ 10 "

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 모양 설정 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

if has("gui_running")

" gVim의 기본폰트 설정 "
    if has("win32")
        set gfn=Fixedsys:h10:cHANGEUL
    elseif has("unix")
        set gfn=나눔고딕코딩\ 10
    endif

" gVim의 배경테마 설정 "
    colorscheme desert

" gVim 시작시 크기지정 "
    set lines=30
    set co=150

endif

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 편집 기능 설정 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" ESC키를 누르면 한글 모드가 해제 "
" 입력모드에서 이전 언어 설정 모드 유지 "
inoremap <ESC> <ESC>:set imdisable<CR>
nnoremap i :set noimd<CR>i
nnoremap I :set noimd<CR>I
nnoremap a :set noimd<CR>a
nnoremap A :set noimd<CR>A
nnoremap o :set noimd<CR>o
nnoremap O :set noimd<CR>O    

" 입력모드에서 Ctrl+d로 백스페이스 기능 "
map! <C-d> <BS>

" Shift+Enter로 아래줄로 커서 넘기기 기능 "
map <S-CR> <ESC>o
map! <S-CR> <ESC>o

" 괄호 자동 완성 후 입력모드로 전환 "
map! () ()<ESC>i
map! (); ();<ESC>hi
map! [] []<ESC>i
map! {} {}<ESC>i
map! {}; {};<BS><ESC>i<CR><ESC>O<BS>
map! <> <><ESC>i
map! '' ''<ESC>i
map! "" ""<ESC>i

" 현재 줄의 마지막에 이어 쓰기 "
map! <C-TAB> <S-CR><ESC>i<BACKSPACE>

" 파일의 종류를 자동으로 인식 "
filetype on

" 자동 문법 강조 "
syntax on 

set nocompatible         " Vim 디폴트 기능들을 사용함 "
set number                " 줄 번호를 붙임  "
set backspace=2         " 삽입 모드에서 백스페이스를 계속 허용 "
set autoindent             " 자동 들여쓰기 "
set cindent             " C 언어 자동 들여쓰기 "
set smartindent         " 역시 자동 들여쓰기 "
set nowrap                 " 자동 줄바꿈 안함  "
set nowrapscan             " 찾기에서 파일의 맨 끝에 이르면 계속하여 찾지 않음 "
set ignorecase             " 찾기에서 대/소문자를 구별하지 않음 "
set incsearch             " 점진적으로 찾기  "
set nobackup             " 백업파일을 만들지 않음 "
set nojoinspaces         " J 명령어로 줄을 붙일 때 마침표 뒤에 한칸만 띔 "
set ruler                 " 상태표시줄에 커서 위치를 보여줌 "
set tabstop=4             " 간격 "
set shiftwidth=4         " 자동 들여쓰기 간격 "
set keywordprg=ydic        " K를 눌렀을 때 실행할 명령어 "
set showcmd             " (부분적인)명령어를 상태라인에 보여줌 "
set showmatch             " 매치되는 괄호의 반대쪽을 보여줌 "
set autowrite             " :next나  :make 같은 명령를 입력하면 자동으로 저장 "
set linespace=3         " 줄간격 "
set title                 " 타이틀바에 현재 편집중인 파일을 표시 "
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\     " 다중 문서 작업을 위한 Status 줄 "
set tags+=./tags        " add current directory's generated tags file to available tags "

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 플러그인 설정 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" c.vim 플러그인의 C_InsertTemplate() 함수 맵핑 설정. "
noremap <unique> <script> <Plug>CommentFuncDes :call C_InsertTemplate("comment.function")<CR>
noremap <unique> <script> <Plug>CommentFrame :call C_InsertTemplate("comment.frame")<CR>

" omnicppcomplete.vim 플러그인 설정. "
" autocmd CursorMovedI * if pumvisible() == 0|pclose|endif "
" autocmd InsertLeave * if pumvisible() == 0|pclose|endif "

" let OmniCpp_MayCompleteDot = 1         autocomplete with . "  
" let OmniCpp_MayCompleteArrow = 1          autocomplete with -> "
" let OmniCpp_MayCompleteScope = 1          autocomplete with :: "
" let OmniCpp_SelectFirstItem = 2          select first item (but don't insert) "
" let OmniCpp_NamespaceSearch = 2          search namespaces in this and included files "
" let OmniCpp_ShowPrototypeInAbbr = 1    show function prototype (i.e. parameters) in popup window "
" let OmniCpp_DisplayMode = 1 "
" let OmniCpp_LocalSearchDecl = 1 "

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 단축키 설정 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" F1은 프레임 형식의 주석 달기, Ctrl+F1은 함수에 대한 설명 달기 "
map <F1> <Plug>CommentFrame
map! <F1> <ESC><F1><ESC>a
map <C-F1> <Plug>CommentFuncDes
map! <C-F1> <ESC><C-F1><ESC>a

" F2는 탭 열기, Ctrl+h,l로 탭 이동 "
map <F2> :tabnew<CR>            
map <C-h> gT
map <C-l> gt

" F3은 저장 "
map <F3> :w!<CR>                   
map! <F3> <ESC><F3>

" F4는 현재창 닫기 "
map <F4> :q!<CR>

" F5는 TagList 열기 "
map <F5> :TlistToggle<CR>

" F6은 파일 비교하기, Ctrl+F6로 파일 비교하기 해제 "
map <F6> :diffthis<CR><C-w><C-w>:diffthis<CR>
map <C-F6> :diffoff<CR><C-w><C-w>:diffoff<CR>

" F7은 Hex 모드 "
map <F7> :%!xxd<CR>

" F8은 ctags 생성 "
map <F8> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR>

" Ctrl+k는 폴딩 접기, Ctrl+j로 폴딩 열기 "
map <C-k> v]}zf<CR>
map <C-j> zo<CR>

" Ctrl+s는 소스파일과 헤더파일 전환 "
map <C-s> :A<CR>

" Ctrl+e는 디렉토리 목록 열기, Ctrl+Enter로 파일 선택 후 디렉토리 목록 닫기 "
map <C-e> :NERDTree<CR>

" Ctrl+y 사전 검색, 단어 위에서 Shift+k를 눌러도 동작 "
map <C-y> :!ydic 

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Vim 개인 설정 완료  "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


코딩 습관

전 코딩할 때 괄호나 따옴표가 있으면 미리 닫고나서 그 내부를 작성합니다. 그래서 ( ) 이 다음에 방향키로 왼쪽으로 이동해야 하죠. 이런 제 습관 때문에 “+Space 조합으로 괄호 자동 완성 후 입력모드로 전환” 이라는 것을 설정하였습니다. 이 설정 덕분에 상당히 편하게 코딩할 수 있게 되었죠.

Vim에서 인쇄는?

vimrc 파일을 보시면 알겠지만, 인쇄와 관련하여 몇몇의 설정이 주석으로 처리되어 있습니다. Vim에서 한글을 프린터로 인쇄하려고 노력한 흔적입니다. ㅜㅜ 몇 날 몇 일동안 새벽까지 잠을 안 자면서까지 관련 문서를 뒤져봐도 뾰족한 수가 안 나오네요.

분명 Vim에서는 한국어, 중국어, 일본어를 지원하고 있습니다. 그리고 인쇄에 관해서는 별도로 printmbfcharset와 printencoding 설정을 해주아야 하죠. 그런데 설정을 하고나서 아무것도 없는 빈 백지만 인쇄되는 기이한 현상이 발생하는 것입니다. 이 문제를 해겨하려고 수 십장의 A4 용지와 많은 시간을 허비했죠. 결국은 치솟는 스트레스를 진정시키고 GG 선언했습니다. (어쩌면 나눔고딕코딩 폰트의 문제일지도…)

저 주석은 그걸 잊지 않겠다는 의미로 남겨 두었습니다.

덧붙임

만약 위 인쇄와 관련하여 해결방법을 알고 계신다면 조언을 부탁드립니다. 그리고 쓸만한 플러그인도 추천 부탁드리구요.

Similar Posts

  • RSS 피드를 직접 만들어 보자. Feed43 활용…

    PC사랑 홈페이지의 포인트경매를 아시나요? 경매방식이 재미있고 제품들도 쓸만해서 제가 좋아하는 컨텐츠입니다. 예전에는 매일 홈페이지에 들어가서 경매가 어떻게 되어가는지 확인했지만, 이제는 RSS로 받아서 쉽게 확인하고 있습니다. Feed43을 이용하지요. Feed43에 대해 소개한 글들을 보면 어떻게 RSS를 만드는지 자세하게 나와있지 않아 참 힘들었습니다. 이번도 2시간의 삽질을 거쳐 간신히 RSS 피드를 만들었습니다. 2시간동안 삽질했더니 이제 어느정도 알겠더군요. 그래서 제가…

  • python :: Socket Communication with Thread

    지난 DEFCON 18 예선 문제를 풀 때 만들었던 소켓 라이브러리입니다. 그 이후로 퍼징툴을 만들면서 조금씩 고쳤죠. 수신 모듈을 스레드로 활성화해서 네트워크를 통해 받은 데이터를 바로 콘솔에 출력합니다. 예외처리는 하지 않았습니다. connThread를 상속받는 코드에서 예외처리를 할 수 있습니다. Method connThread (host, port)– 소켓 생성자입니다. 접속할 IP주소(host)와 포트번호(port)를 입력받습니다. close ()– 소켓을 닫습니다. reconnect ()– 재연결합니다. sendMsg…

  • Visual Basic :: Unload 문을 이용한 메모리 관리

    Visual Basic으로 프로그램을 짜면 Form부터 구성합니다. 하나의 프로젝트 안에 여러 개의 Form을 구성할 수도 있죠. 여기서 2개 이상의 Form으로 구성된 프로그램을 구동시키면 모든 Form이 Load 된다는 사실이 중요합니다. “Load”라는 의미는 메모리에 저장된다는 뜻입니다. 보통 ‘종료’, ‘X’ 같은 버튼을 누르거나 코드를 다 수행하면 프로그램이 종료되지만, 이 때 활성화 되어 있던 Form만 메모리에서 삭제됩니다. 즉, 비활성화 되어…

  • C :: [열혈강의 C 프로그래밍] p.115 char_add.c

    tothefelix 님의 블로그에서 아래의 코드를 가져왔습니다. 언뜻 보면 정상적인 코드인 것 같으나, 유심히 보면 자료형이 잘못된 것을 알 수 있습니다. 1바이트의 char 형 변수에 4바이트의 int 형 값을 넣는 오류입니다. 명백히 코드 상의 오류지요. 정말 열혈강의에 저런 코드가 예문으로 나와 있다면 무척 실망입니다. 역시 국내 C 레퍼런스로는 김상형 님의 “혼자 연구하는 C/C++“가 최고의 레퍼런스가 아닌가…

  • C :: 1byte씩 메모리 읽기

    Shinnara 님이 알려주신 1byte씩 메모리를 읽는 방법입니다. 스택이나 정적메모리 영역 등에 이용할 수 있겠네요. unsigned char에 대해서는 거들떠 보지도 않았는데 이번 기회로 참 유용하다는 걸 알게되었습니다. ptr = (unsigned char *) &fNumber; 이 부분에 대해서는 지난 글에서 설명했었지요. 차이라고는 unsigned * 대신에 unsigned char *을 사용함으로써 4byte가 아닌 1byte씩 끊어 읽을 수 있다는 것입니다. 아래…

  • C :: 자료형의 범위를 구해보자. – 정수

    long double 자료형의 범위를 구하겠다고 시작한 일이 쉽지만은 않네요. 그래서 쉬운 것부터, 정수형 자료형의 범위를 구하는 것부터 시작하였습니다. 처음에는 무작정 1씩 더해가는 방식으로 해봤습니다. 무지 비효율적입니다. OTL. 그 다음에 시도한 것은 pow() 함수를 이용하여 더해가는 방식을 사용했습니다. 멍청한 거죠? 그냥 pow() 함수로 구하면 되는 것을요. 그땐 왜 더한다는 생각만 했던지. 생각 해보니까 컴퓨터는 이진수를 다루기…

0 Comments

  1. inoremap :set imdisable

    이부분에 관해서는, 수정 도중에 방향키를 움직이면 제대로 동작하지 않더군요..

  2. esc 키나 ctrl+c 를 누르시면 명령모드로 바뀌는데, 그 상태에서 u를 입력하시면 입력된 게 취소됩니다. 그리고 다음 찾기는 n 을 누르시면 되구요 이전 찾기는 shift+n 을 누르시면 됩니다.

  3. 정말 잘쓰고 있습니다.. 그런데 이걸로 바꾸고 나서 i나 a편집 상태일때 방향키 입력시.. abcd;; 이런식으로 나오면서 줄바뀌는데.. 어떻게 하면 제거할 수 있죠? 또 /눌러서 바꿀때 다음 찾기는 어떻게 해야하나요?!

  4. 많은 정성이 들어간듯합니다.
    유용한 옵션들이 많네요
    혹 담아 가도 될까요?
    많은 정성이 들어간듯해서 무단펌은 안될꺼 같고 해서 ^^
    고생하셨습니다.

  5. vi에서 프린트를 하면 항상 글꼴이 다르게 나와서 문제였었는데, 덕분에 잘 해결하고 갑니다. 감사합니다.
    [적용 옵션]
    set printfont=Fixedsys:h10:cHANGEUL

    [추가]
    위의 본문에서 주석으로 남기신 인쇄 관련 옵션들은 대부분 vim을 빌드할 때, 컴파일 옵션을 추가로 주어야 사용할 수 있는 기능이더군요.
    제가 가지고 있는 vim에서는 printfont만 사용이 가능했습니다.

    ” 인쇄 옵션 설정
    ” set printencoding=utf8
    ” set printmbcharset=ISO10646
    ” set printmbfont=r:나눔고딕코딩,c:yes,a:yes
    ” set printfont=나눔고딕코딩\ 10

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다