저자동고유연성을 갖춘 대표적인 CharityWare 텍스트 편집기(윈도우즈의 노트패드notepad.exe같은)의 하나. ViEditor라고 하는 전통적 에디터의 개량판(Vi iMproved).
최근에 발표된 Vim 6.0의 경우 폴딩이라는 기능(DougEngelbart가 최초 고안)이 추가되었다. EmacsEditor에서는 십년 전부터 있어왔던 기능이지만, Vim의 가볍고 빠른 특징을 좋아하는 사람들에게는 여간 반가운 일이 아니다. 이 기능은 윈도우 탐색기의 디렉토리 나무구조와 비슷하다고 보면 된다. 즉, 접혀진 항목을 클릭하면 그 속의 내용이 계층적으로 주르륵 표시되고, 다시 클릭하면 깨끗하게 접혀진다. 숲과 나무를 함께 살피기에 편리하며, 프로그래밍을 할 때 무척 유용하다.
vim 예찬 ¶
프로그램예찬에서:
- VI Forever!! 게으른 프로그래머를 위한 축복입니다. --DaNew
- 마우스 없이도 빠르고 간편하게 에디팅을 할 수 있다는 쾌감. MS Visual Studio도 vi명령어를 알아들으면 얼마나 좋을까요 --선
DeleteMe gvim_win32 ole버젼이 이걸 위한거라고 알고있습니다.
gvim_win32 ole는 단순히 현재 gvim61.exe로 배포되는 윈도우용 gvim을 말씀하시는 건가요? --RedPainAnswerMe 윈도우에서 리눅스처럼 vi나 screen같은 걸 쓸수 있게 해놓은 에뮬(?) 같은 거 있나요? 있을것도 같은데.. 아니면 screen기능을 지원하는 에디터라던가.. - 선
자세한 것은 저도 모르고, gvim61ole.zip이 따로 있습니다. http://www.math.technion.ac.il/pub/vim/runtime/doc/if_ole.txt와 VisVim을 참조하세요
정말 유용한 정보군요. 제가 윈도우 프로그래밍을 공부하려 했을 때 가장 불편했던 것이 에디팅이었는 데요. vim 골수 유저들은 저랑 같은 생각을 했으리라 여기집니다. --RedPain
한글처리가 제대로 안될때 ¶
한글이 1바이트씩 지워진다거나, dw 등이 제대로 작동하지 않는다면..
- vim --version에서 +encoding +multi_byte인지 확인한다.
- .vimrc에 다음 부분을 확인하고 없으면 넣어준다. 윈도우즈에서는
c:\vim\_gvimrc
set fileencoding=euc-kr set encoding=euc-kr
- Linux상이나 로케일이 지원되는 유닉스상에서
.bash_profile
혹은.profile
에 다음과 같이 로케일만 지정해도 된다.
export LANG=ko_KR.EUC-KR
- export를 사용하여 시스템 로케일을 바꿀 필요없이 다음 alias를 .bashrc에 추가해주는 방식도 있다
alias vi='LANG=ko vim'
유니코드 편집하기 ¶
- vim --version에서 +iconv +multi_byte인지 확인한다.
- .vimrc에 다음 부분을 확인하고 없으면 넣어준다.
set fileencoding=utf-8 set encoding=euc-kr
- vim 6.1버전(패치 6.1.048버전)부터 xterm에서 첫가끝으로 옛한글을 입력할 수 있다.
vim 6.2버전에서 .vimrc에 fileencoding은 건들지 말고 set fileencodings=utf-8,cp949 해주면 파일 로드할때 자동으로 utf-8인지 cp949(또는 euc-kr)인지 판별해서 fileencoding 변수 값을 정해줍니다.
추가 신택스 하이라이팅 파일 ¶
vim으로 신택스 하이라이팅된 것을 HTML로 바꾸기 ¶
vim은 강력한 신택스 하이라이트로 nvi, elvis에 비해 압도적인 지지를 받고 있는데, code2html이나 enscript, py2html과 같은 HTML 하이라이팅 툴에 비견할 만할 HTML 컨버터로 만들 수 있는데, 그 스크립트를 간단히 소개하자면,
#!/bin/sh VIM=/usr/local/bin/vim for f in $*; do $VIM -e $f << EOF :syntax on :set background=dark :%s/ / /g :runtime! syntax/2html.vim :w $f.html EOF done
중간에 %s/..부분은 짐작했겠지만 탭을 스페이스로 바꾸는 것인데, 미리 바꿔주지 않으면 탭이 ^I 로 표시가 되므로, 자기가 원하는 탭사이즈 만큼 스페이스로 써주면 되고(모인모인에서는 탭을 허용하지 않아서 스페이스로 대체가 되었으니 앞부분은 탭을 입력하시길.), 흰색 배경은 light, 검은색 배경을 dark인데, light는 눈이 부셔서 보기가 힘들다.
vim 스크립트 ¶
vim 은 EmacsEditor 처럼 내장언어를 가지고 있다. 몇줄 안되는 script 를 가지고, vim 내부에서 많은 일을 할 수 있다. 테트리스도 할 수 있다 !!
http://vim.sourceforge.net/scripts/index.php
http://vim.sourceforge.net/scripts/index.php
BufExplorer 등의 플러그인이 특히 유용하다.
See Also 플러그인과 개선
자동 완성 ¶
Auto Completion이라고 한다. 프로그램을 작성하다가 긴 변수이름을 다시 치기가 귀찮을 때 사용하면 편리하다. 현재까지 입력된 글자와 동일하게 시작하는 단어를 찾아준다.
CTRL-P는 현재 위치 이전, CTRL-N은 이후의 짝을 찾는다. (계속 누르면 하나씩 이전, 이후로 진행 가능)
만약 파일 이름에 대해 자동 완성을 사용하고 싶으면 Auto Completion 모드에서 CTRL-F를 누른다. (Auto Completion 모드는 삽입 모드에서 CTRL-X를 누르면 된다)
JavaLanguage compile ¶
nmap <F4> :lcd<CR>:Run<CR> nmap <F9> :w<CR>:make<CR> set makeprg=cmd\ /c\ \"cmd\ \/c\ javac\ %\ 2>&1\" set errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%# com! -nargs=* -complete=file Run !java %< <args>
윈도우즈에서 조합창 없이 한글 입력하기 ¶
윈도우즈용 gvim을 사용해 보면 한글을 입력할 때 별도의 조합창이 열리기 때문에 보기가 좀 껄끄럽습니다.
외국에서 만들어진 대부분의 프로그램들이 다 그렇지만요....
아무튼 어설프게 수정을 좀 해봤습니다.
입력중에 캐럿이 글자 전체를 감싸는 따위의 기능은 없지만 그럭저럭 볼만합니다.
수정에 사용된 버전은 6.3입니다.
외국에서 만들어진 대부분의 프로그램들이 다 그렇지만요....
아무튼 어설프게 수정을 좀 해봤습니다.
입력중에 캐럿이 글자 전체를 감싸는 따위의 기능은 없지만 그럭저럭 볼만합니다.
수정에 사용된 버전은 6.3입니다.
--- gui_w32.c Mon Jun 07 14:30:18 2004 +++ gui_w32.c Thu Mar 03 10:58:10 2005 @@ -776,6 +776,15 @@ if (!_OnImeNotify(hwnd, (DWORD)wParam, (DWORD)lParam)) return MyWindowProc(hwnd, uMsg, wParam, lParam); break; + + case WM_IME_STARTCOMPOSITION: + _OnImeStartComposition(hwnd, wParam, lParam); + return MyWindowProc(hwnd, uMsg, wParam, lParam); + + case WM_IME_ENDCOMPOSITION: + _OnImeEndComposition(hwnd, wParam, lParam); + return MyWindowProc(hwnd, uMsg, wParam, lParam); + case WM_IME_COMPOSITION: if (!_OnImeComposition(hwnd, wParam, lParam)) return MyWindowProc(hwnd, uMsg, wParam, lParam); @@ -1478,22 +1487,54 @@ return lResult; } +static char_u bskey[] = {CSI, 'k', 'b'}; +static char_u delkey[] = {CSI, 'k', 'D'}; +static char_u backkey[] = {CSI, 'k', 'l'}; + + static LRESULT +_OnImeStartComposition(HWND hwnd, WPARAM dbcs, LPARAM param) +{ + add_to_input_buf(" ", 1); + add_to_input_buf(backkey, (int)sizeof(backkey)); + return 1; +} + + static LRESULT +_OnImeEndComposition(HWND hwnd, WPARAM dbcs, LPARAM param) +{ + add_to_input_buf(delkey, (int)sizeof(delkey)); + return 1; +} + static LRESULT _OnImeComposition(HWND hwnd, WPARAM dbcs, LPARAM param) { char_u *ret; int len; - if ((param & GCS_RESULTSTR) == 0) /* Composition unfinished. */ - return 0; - - ret = GetResultStr(hwnd, GCS_RESULTSTR, &len); - if (ret != NULL) + if ((param & GCS_RESULTSTR) != 0) { - add_to_input_buf_csi(ret, len); - vim_free(ret); - return 1; + ret = GetResultStr(hwnd, GCS_RESULTSTR, &len); + if (ret != NULL) + { + add_to_input_buf_csi(ret, len); + vim_free(ret); + return 1; + } } + else if ((param & GCS_COMPSTR) != 0) + { + ret = GetResultStr(hwnd, GCS_COMPSTR, &len); + if (ret != NULL) + { + add_to_input_buf(delkey, (int)sizeof(delkey)); + add_to_input_buf_csi(ret, len); + vim_free(ret); + add_to_input_buf(backkey, (int)sizeof(backkey)); + return 1; + } + } + return 0; }