2003년 4월 9일 수요일

vim tip, 설명서

:help 라고 치면 vim의 tutorial을 볼 수 있다. 매우 강력하고 기능이 많다.
===============
shell에서 ctags -R * 라는 명령을 치면 C, C++, Java, PHP 등의 소스코드를 navigation 할 수 있다.\
navigation 방법 --
^] (ctrl-])를 누르면 함수의 정의(definition)을 볼 수 있다. ^T를 누르면 다시 원래로 돌아간다.

tags.sh 파일
---------------
find . /usr/include 기타 디렉토리들 -name '*.[ch]' | ctags -R --extra=fq -L -

===============
Vim 자동완성기능.
함수, 변수명을 몇 글자 치다가 이미 나온 글이라면 ^p (ctrl-p), ^n (ctrp-n)을 누르면 완성된다.
원하는 것이 아니라면 ^p,^n을 계속 눌러 원하는 것이 나올 때까지 찾는다.
----
vi에서 한글키로 모드 선택하게 하기. (writen by 임동현)
vi 에서 한글로 입력을 하려고 보면 i key가 먹지 않아 고생하신 분이 많으실 겁니다.(즉 영문키로 전환해서 i를 누르고 다시 한글키를 눌러야 합니다.) 그때 간단한 mapping을 적용하시면 영문키로 전환하지 않고서도 쉽게 한글을 입력하실수 있습니다. 이것을 응용하면 다른 작업도 편한히 하실 수 있을 겁니다.

다음의 문장을.. /home/유저/.vimrc 뒤에 넣으시고...
사용해 보세요..........

"map ㅡ m
map ㅜ n
map ㅠ b
"map ㅍ v
"map ㅊ c
map ㅌ x
"map ㅋ z
"map ㅣ l
"map ㅏ k
"map ㅓ j
"map ㅗ h
map ㅎ g
"map ㄹ f
map ㅇ d
map ㄴ s
map ㅁ a
map ㅔ p
map ㅐ o
map ㅑ i
"map ㅕ u
map ㅛ y
"map ㅅ t
map ㄱ r
"map ㄷ e
"map ㅈ w
"map ㅂ q
---
vim 6.0 이상에서 지원하는 접기(fold)기능 사용하기.

@ 첫번째 방법 :23,29zf  (23~29번째 줄을 접는 다.)

@ visual mode로 선택한 줄 접기.

vim에는 v로 영역을 선택할 수 있습니다. v는 일반적으로 마우스로 화면을 긁는 기능과 같고, ctrl+v는 사각형 모양으로 선택을 합니다.
첫번째 방법과 마찬가지로 영역(줄)을 선택한 다음 zf로 접습니다

@ 함수(function)전체를 한 번에 접기.

함수의 첫째줄 아무 곳에서나 v를 눌러 visual 모드로 들어갑니다. 그리고 j를 눌러 아랫 줄로 이동하신 다음 ]}를 누르면 함수 전체 줄을 선택하실 수 있습니다. 그런다음 zf를 눌러서 함수 전체의 내용을 접을 수 있습니다.

여기에서 쓰인 ]}명령은 {과 상응하는 }가 있는 곳으로 커서를 옮기는 기을을 합니다. 이 예제의 경우 for문에 {} 블럭이 있지만 첫줄에서 v를 누르고 j로 아랫줄로 이동했기 때문에 함수 전체를 감싸는 {에 상응하는 }로 이동하게 되는 것입니다. for문 안에서 ]}를 누르면 for문을 감싼 {}블럭의 }로 커서가 이동하는 것을 보실 수 있습니다.

접은 곳 다시 펴기 & 또 다시 접기

접은곳은 몇 줄이 접혀 있는지 표시하고 syntax on 옵션을 설정했을 경우에는 cyan색으로 표시됩니다. 이곳에서 zo를 누르시면 접은 곳의 내용을 다시 화면에 표시하고, 이 펴진 내용중 아무곳에서나 zc를 누르면 접은 곳을 다시 접을 수 있습니다.

-------------------------------
i 현재 칸에 편집(insert)
I 그 줄 맨 앞에서 insert
a 다음 칸에 편집(append)
A 그 줄 맨 끝부터 append

~ 대소문자 치환
r 한글자 변경
R 여러글자 변경
p 아랫줄에 되돌리기
P 현재행에 되돌리기
w 다음 단어의 처음으로 이동
b 현재 단어의 첫부분으로 이동
0(숫자) 현재 행의 맨 앞으로 이동
^ 현재 행의 맨 앞으로 이동
$ 현재 행의 맨 끝으로 이동
Ctrl-f 한 화면 뒤로
Ctrl-b 한 화면 앞으로
G 파일의 끝으로
/ 단어 검색
? 단어 검색(backword)
/,? 뒤에 나오는 표현은 regular expression(regex)이다

- regular expression -
^ 줄의 처음
$ 줄의 끝
. 아무 글자나 한 글자
* 앞의 내용이 0번 이상 반복됨
\+ 앞의 내용이 1번 이상 반복됨
\< 단어의 시작
\> 단어의 끝
\{mai,max\} min 이상 max이하의 횟수만큼 반복됨
[A-Z] A부터 Z중 아무 글자
[^A-Z] A부터 Z의 글자가 아닌 다른 글자.
[AB] A,B중 아무글자
\i      \i      isident=@,48-57,_,192-255 에 해당하는 글자들입니
                set isident 명령으로 확인 및 정의할 수 있습니다.
\I      \I      "\i"와 같지만 숫자는 제외
\k      \k      keyword로 사용하는 문자, set iskeyword 참고
\K      \K      "\k"와 같지만 숫자제외
\f      \f      파일이름으로 사용하는 문자, set isfname참고
\F      \F      "\f"와 같지만 숫자 제외
\p      \p      프린트 가능한 문자, set isprint참고
\P      \P      "\p"와 같지만, 숫자 제외
\s      \s      whitespace character: <Space> and <Tab>
\S      \S      non-whitespace character; opposite of \s
\d      \d      digit:                          [0-9]
\D      \D      non-digit:                      [^0-9]
\x      \x      hex digit:                      [0-9A-Fa-f]
\X      \X      non-hex digit:                  [^0-9A-Fa-f]
\o      \o      octal digit:                    [0-7]
\O      \O      non-octal digit:                [^0-7]
\w      \w      word character:                 [0-9A-Za-z_]
\W      \W      non-word character:             [^0-9A-Za-z_]    
\h      \h      head of word character:         [A-Za-z_]        
\H      \H      non-head of word character:     [^A-Za-z_]      
\a      \a      alphabetic character:           [A-Za-z]        
\A      \A      non-alphabetic character:       [^A-Za-z]        
\l      \l      lowercase character:            [a-z]            
\L      \L      non-lowercase character:        [^a-z]          
\u      \u      uppercase character:            [A-Z]  
\e esc
\t tab
\r <cr>
\b backspace
\| or(또는)
[:alnum:] 알파벳, 숫자
[:alpha:] 알파벳
[:blank:] 공백문자 탭문자 포함
[:cntrl:] control 문자
[:digit:] 숫자
[:graph:] 공백문자를 제외한
[:lower:] 소문자
[:upper:] 대문자
[:print:] 프린트 가능한 문자 공백
[:punct:] 구두점문자 ) ( , . " ' : ; _ 등등
[:space:] 공백문자
[:xdigit:] 16진수 숫자

dd 현재 행 삭제
dw 현재 단어 삭제
d$ 현재 위치부터 현재 행 끝까지 삭제
dG 현재 위치부터 현재 파일 끝까지 삭제

yy 현재 행을 버퍼에 저장
yw 현재 단어를 버펴에 저장
y$ 현재 위치부터 현재 행 끝까지 저장
yG 현재 위치부터 현재 파일 끝까지 저장

u undo
U 그 줄에서 행해진 잡업 모두 취소
Ctrl-r redo (undo의 반대)
. 방금 전 했던 명령 반복
% 괄호의 짝으로 이동
Ctrl-l 화면 다시 그리기

:ab 상용구 보기
:ab [상용구] 대치될 문장  상용구 설정
:unab [상용구]  상용구 해제

숫자>> 현재 줄 부터 '숫자'-1 줄 만튼 탭키를 삽입
숫자<< 현재 줄 부터 '숫자'-1 줄 만튼 탭키를 삭제(있을 때만)

:wq quit after write
ZZ same as 'wq'
:q! 저장 없이 강제 종료
:e [filename] [filename]를 편집
:r [filename] [filename]이 current row 이후에 포함된다.
:! vi 내부에서 shell명령을 실행
:r! vi 내부에서 shell명령을 실행 후 standard output을 포함


:n 여러문서 편집 중 다음 파일로 어가기
:N :prev 여러문서 편집 중 앞 파일로 가기
:args 편집중인 파일들 목록 보기

검색 및 치환
[x,y]s/패턴/치환문자열/플래그 : x행부터 y행까지의 패턴을 치환문자열로 치환한다.
%s/패턴/치환문자열/플래그 : 파일전체의 패턴을 치환문자열로 치환한다.
s/패턴/치환문자열/플래그 : 현재행의 패턴을 치환문자열로 치환한다.
g 플래그 : 일치하는 패턴을 모두 치환
c 플래그 : 치환할 때마다 물어보고 치환

m[영문자] : 현재 위치는 [영문자]로 책갈피 - [a-z][A-Z] 52개
'[영문자] : [영문자]로 책갈피된 곳으로 이동

"[영문자] : 레지스터 명을 명시 (책갈피와는 다르다.)
"[영문자]yy : [영문자]레지스터에 복사
"[영문자]p : [영문자]레지스터에서 가져옴

멀티 윈도우 기능
:sp 가로로 창 분할
:vsp 세로로 창 분할

ctrl-wk 다음 창으로 이동
ctrl-wj 앞 창으로 이동


visual mode

~ 대소문자 전환
J 줄을 합친다.
U 대문자로 전환
u 소문자로 전환

==============
:g/^$/d - 문서 전체에서 빈줄을 없애 준다.

10~30행의 마지막에 <br>을 삽입하고 싶을 때.
:10,30s/$/<br>/g
-------------------------------------------
============================
11
22
33

11 11
22 22
33 33
으로 만들고 싶을 때
:s/\(.*\)/\1 \1/
하면 된다...
\( 와 \) 안에 있는 것이 \1 로 표현 되게 됨

=============================
I 라는 글자가 있는 line 을 지우고 싶을 때
/I
해서 I 가 hightlist 되게 한후
:map q nddq
로 macro 를 지정한 후
q 를 누리면 된다...
(분석 : q 라는 키를 누르면 nddq 가 눌러지도록 하
는 것임 따라서 계속해서 recursive 하게 line 을 지우게 됨
참고로 n 은 다음 highlight 로 가는 거구 dd 는 그 line 을
지우는 것임)
-------------------------------------------
vim syntax highlighting 파일은 어디에 있을 까?

[ilashman@kapp06 vim] whereis vim
vim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
[ilashman@kapp06 vim] cd /usr/share/vim
                                 ~~~~~~~~~~~~~~~
[ilashman@kapp06 vim] ls
vim60z
[ilashman@kapp06 vim] cd vim60z
[ilashman@kapp06 vim60z] ls
bugreport.vim  ftplugin.vim        indoff.vim  optwin.vim   tutor
doc            ftplugof.vim        keymap      plugin       vimrc_example.vim
filetype.vim   gvimrc_example.vim  lang        scripts.vim
ftoff.vim      indent              macros      syntax
ftplugin       indent.vim          menu.vim    tools
[ilashman@kapp06 vim60z]

./syntax 디렉토리의 *.vim 파일들을 보면 알 수 있음.
./filetype.vim 파일을 보면 어느 *.vim파일이 어떤 형식을 지원하는 지 알게 됨.

-----------------------------
vim 한 화면에 여러 파일 열기

:help window 로 도움말을 보면 된다.
Ctrl-w + n : new file
Ctrl-w + j,k : 다른 file로 move
Ctrl-w + x : exchange window
Ctrl-w + _ : 창 최대로 키우기.

------------------------------
vim에서 vim을 background(백그라운드)로 만들고 shell로 잠시 나가기.
ctrl + z

되돌아 오기 (foreground, 포그라운드) :
$ fg
------------------------------
대소문자 구별 없이 문자열 search하기

방법1) :set ignorecase
          혹은 :set ic

방법2) /\c문자열
------------------------------
vim plugin

html tag <body> </body> 등이 있을 때
시작 tag에서 끝 tag로 %를 이용하여 match 되게 하는 plugin 쓰기.

http://vim.sourceforge.net/scripts/script.php?script_id=39

~/.vim/plugin/ 디렉토리에 링크에 있는 파일 받아서 푸시면 vim plugin을 쓸 수 있습니다.

------------------------------
IE html 소스 보기에서 gvim 쓰기
http://vim.sourceforge.net/tips/tip.php?tip_id=118
http://kltp.kldp.org/stories.php?story=02/04/15/7370834

------------------------------
vim에서 make 실행

1. make 실행
:make

2. 다음 에러난 위치로 커서 이동
:cnext

3. 이전 에러난 위치로 커서 이동
:cprevious

4. 에러 리스트 모두 보기
:clist

----------------------------------------
다른 곳에서 복사한 내용 붙여 넣기
방법 1)
:in  (혹은 :i)
붙여넣기
<ESC>

방법 2)
:set paste
i
붙여넣기
<ESC>
:set nopaste

-------
vim cvs plugin
http://www.vim.org/scripts/script.php?script_id=90
http://www.vim.org/scripts/download_script.php?src_id=3018

\cn 라고 치면 cvs annotation
\cv cvs diff결과를 vimdiff 형태로 볼 수 있습니다.
\cg 원래의 editing buffer로 돌아옵니다.

:help cvscommand하면 help가 나옵니다.

\ca CVSAdd
\cn CVSAnnotate
\cc CVSCommit
\cd CVSDiff
\ce CVSEdit
\ci CVSEditors
\cg CVSGotoOriginal
\cG CVSGotoOriginal!
\cl CVSLog
\cr CVSReview
\cs CVSStatus
\ct CVSUnedit
\cu CVSUpdate
\cv CVSVimDiff
\cwv CVSWatchers
\cwa CVSWatchAdd
\cwn CVSWatchOn
\cwf CVSWatchOff
\cwf CVSWatchRemove
\cv 처럼 되어있는 명령은
원래 <Leader>cv 로 되어있는데 <Leader>가 디폴트로 백슬래시로 되어있습니다.
let mapleader = "," 로 해두고 콤마를 <Leader> 키로 써도 상당히 편합니다.

:helptags ~/.vim/doc 라고 치면 help를 ~/.vim/doc에서 읽어들임
(한 번만 해주면 다음 번에도 적용됨)

댓글 없음:

댓글 쓰기