행복아울렛
vim 초 간단 매뉴얼 본문
- 무한 Undo & redo 기능
- 커맨드 및 레지스터 저장기능
- syntax hilight기능
- split기능
1. 이동
t/T, f/F, |, ^,$
- 글자단위이동
[0]f[A]: 현재 라인에서 가장 가까운 해당글자위로 이동(오른쪽)
[0]F[A]: 현재 라인에서 가장 가까운 해당글자위로 이동(왼쪽)
[0]t[A]: 현재 라인에서 가장 가까운 해당글자 바로 전 이동(오른쪽)
[0]T[A]: 현재 라인에서 가장 가까운 해당글자위로 이동(왼쪽)
[0]|: 해당 column으로 이동(ex 30| : 30번째 column으로 이동)
※
- vi에서는 대문자 명령과 소문자 명령 사이에는 반대의 뜻이 담겨 있습니다.
(예를 들어 f는 오른쪽 방향의 이동 F는 왼쪽 방향의 이동)
- [0] : 숫자를 입력합니다.
- [A] : 글자를 입력합니다.
ex) 3tA : tA를 3번 반복합니다. 따라서 현재 라인의 3번째 A바로 앞으로 커서가 이동합니다.
아래의 예문에서 보시면 맨 앞에 있는 커서에서 3tA를 입력하시면 SPEAKER의 E의 위치에 커서가 이동합니다.
TANNOY ACTIVE SPEAKER
^
- | : 백스페이스 바로 및 또는 바로 왼쪽에 있는 \와 같이 있는 글자입니다.(파이프군요 ^^)
^: 현재라인의 시작부분으로 이동(공백무시)
0: 현재라인의 시작부분으로 이동(공백포함)
$: 현재라인의 끝부분으로 이동
g[jk]라인이 엄청 길어서 한라인을 넘어선 경우 실제 다음라인이 아닌 보이는 다음라인으로 이동하고자 할 때 jk앞에 g를 입력하시면 눈에 보이는 다음라인으로 넘어갑니다.
워드단위이동(공백기준)
w: 다음 단어의 처음으로
b: 이전 단어의 처음으로
e: 단어의 끝으로
글자단위의 이동은 매크로 작성의 기본이 됩니다. 매크로작성시 가변적인 부분들은 위 글자단위 이동등을 통하여 절대적인 명령으로 매크로를 기록해야 합니다. 예를들어
this is a test.
this is a new test.
위 문장을 printf문으로 싸는 매크로를 작성시 hhhhhhlllll이런 식으로 이동하게 되면 윗 예제 아래 예제에 동일한 매크로를 작성할 수 없게 됩니다. 따라서 ^, $등으로 이동해서 매크로를 작성해야 가변적인 특성들을 아우르는 매크로를 만들 수 있습니다.
ex) 현재 라인을 printf("[현재라인]\n");으로 바꾸어 주는 매크로 작성 시
^iprintf("<ESC>a\n");<ESC>
2. 블럭지정
- 복사, 삭제, 변경등 편집단위를 묶기 위해 블럭지정
v: 글자단위 블럭지정
V: 라인단위 블럭지정
Ctrl+v: 블럭단위 블럭지정
※ gv: 이전에 블럭 지정해 둔 부분 다시 블럭 지정하기
3. vimrc & viminfo
- $HOME/.vimrc
vi가 수행시 실행하는 초기화 명령이 들어 있는 파일
여기에 map이나, abbr set 명령등 자신이 vim수행시 필요한 사항들을 기록해둔다.
- $HOME/.viminfo
vi가 수행하는 동안 필요한 임시내용들을 저장하는 파일.
찾기나, ex 명령, 버퍼등의 정보가 여기에 저장되므로 반복 입력시 처음부터 다 입력할 필요 없이 화살표를 통해 이전 명령들을 검색할 수 있게 됨.
4. map
- map 은 자기만의 명령을 만들어 냄.
ex) map ; %
map <F1> :q!<CR>
map <F3> :set nu!<CR>
map :%!sort "현재 문서를 알파벳 순으로 정렬하기
- vmap은 visual모드에서만 사용가능한 맵
ex) vmap <space> zf "블럭지정한 부분을 fold기능으로 묶어버림
- imap은 insert모드에서만 사용가능한 맵
ex)
imap <C-j> <DOWN> "Control+j는 입력모드에서 아래화살키로 변경
imap <C-k> <UP>
imap <C-h> <LEFT>
imap <C-l> <RIGHT>
imap <TAB> <Space><Space><Space><Space>
ex)
map <f1> :set nu!
map <f2> :wq!
map <f3> :set ic!
map <f6> I/* <ESC>A */<ESC>
map <f7> :s#/\* \(.*\) \*/#\1<CR>:nohlsearch<CR>
5. abbr
- 입력시 지정해 놓은 글자로 변경됨!
ex)
abbr q1 q!
abbr Q1 q!
abbr Wq wq
abbr p# printf("\n");
abbr inculde include
abbr THe The
abbr em@ email:butcool@hitel_net
abbr #b /**************************************************************
abbr #e **************************************************************/
6. macro
- macro기록법
q[버퍼명] -> macro기록시작
명령들 수행
q -> macro 기록 종료
- macro 수행
@[버퍼명]
여기서 버퍼명:a-z
- macro는 아래의 global command, norm mode command와 결합하면 아주 유용하게 사용할 수 있음.
7. global command
- g
Execute the Ex Command on the lines within where pattern matches.
- v
Execute the Ex Command on the lines within where pattern does not match.
ex) 전체 문서에서 특정패턴을 포함한 라인만을 제거하거나, 또는 그 반대로 특정패턴을 포함한 라인만 남겨놓고 나머지는 모두 제거할 때.
%g/지우는라인/d
%v/남기는라인/d
8. norm mode command
- Execute Normal mode commands
:norm WhateverYouWantToDo
ex) :norm Iprintf("<ESC>A\n");<ESC>
현재 라인을 printf로 감싸주는 명령
9. 외부명령의 수행
- ex mode에서 !로 수행함.
:%!sort -> 전체문서를 정렬하기.
:%!uniq -> 전체문서중 중복된 부분 삭제하기.
:r !ls -> 현재 커서 위치에 ls한 결과를 삽입하기
:r !pwd -> 현재 커서 위치에 pwd한 결과를 삽입하기
※ex mode에서 'r'은 덧붙임 기능.
10. 여러파일의 편집 vi `grep -l abc *.c`
:b1<CR>
:b2<CR>
.
.
.
:bn<CR>
:bp<CR>
*참고
shell에서 ``는(ESC밑 물결무늬모양 키) ''(Enter옆 따옴표)와는 다른데, 이것은 쉘에서 명령입력 시
[``으로 감싼 명령을 실행한 결과를 가지고 명령을 수행해라] 라는 의미입니다.
예를 들어 date +%y%m%d를 쉘에서 수행하게 되면 오늘 날짜의 연월일을 출력하게 됩니다. 이를 mkdir `date +%y%m%d`를 쉘에서 수행하게 되면 오늘날짜의 디렉토리가 생성되게 됩니다.
11. 자동완성기능
- 자동완성 기능이란 입력모드에서 문서의 매칭되는 단어들을 자동으로 완성 시켜주는 기능.
잘못입력된 변수명으로 인한 오류를 줄이기 위해
긴 단어 입력시 손가락 아픔을 방지하기 위해
- 사용법
단어를 입력하다 귀찮을 때 아래와같은 명령 수행
Ctrl+p(previous)
Ctrl+n(next)
12. fold기능
- 소스코드 등의 중요하지 않은 부분들을 묶어서 간단하게 표시하고자 할 때 사용함.
- 사용법
zo : 닫혀있는 폴드 열기
zc : 폴드 닫기
zf : 폴드 생성하기
zd : 현재 위치의 폴드 삭제하기
zR : 현재 문서의 모든 폴드 열기
ZM : 현재 문서의 모든 폴드 닫기
zE : 현재 문서의 모든 폴드 삭제
zD : 현재 위치의 겹쳐진 폴드 삭제
set fdm=marker
;폴드를 마커에 의존해서 동작하게 한다. 기본적으로는 ,의 짝으로 이루어지게 되어 있음.
set fdm=marker를 .vimrc파일에 넣어두고 사용하게 되면, 파일을 열 때마다 설정할 필요가 없음.
또는 /* vim: set fdm=marker: */ 이런 식으로 문서의 맨 처음이나 맨 끝에 두게 되면, 자동으로 설정되어, set fdm=marker라고 설정해 두지 않아도 vim 구동시 자동으로 동작하게 됨.
13. split기능
- 화면을 가로 또는 세로로 쪼개서 여러 파일을 동시에 편집할 때 또는 다른 파일을 참조하면서 코딩시에 유용하게 사용할 수 있는 기능.
:sp 가로로 쪼개기
:vsp 세로로 쪼개기
ctrl+w s 가로로 쪼개기 다른 방법
ctrl+w v 세로로 쪼개기 다른 방법
ctrl+ww 쪼개진 창 간 이동
ctrl+w= 쪼개지 창 사이즈 동일하게
쪼개진 창사이즈 조절(세로)
ctrl+w [0]+
ctrl+w [0]-
쪼개진 창사이즈 조절(가로)
ctrl+w [0]>
ctrl+w [0]<
14. diff기능
- vim의 split기능을 이용하여 두 파일간 차이를 한눈에 쉽게 비교할 수 있다.
vi -d file1 file2
- set dip=iwhite,icase
;vim으로 diff시 unix diff의 -i -b 옵션 같은 기능
공백무시, 대소문자 무시 비교 시 사용
15. register(= named buffer)
- 윈도우의 클립보드와 같은 기능으로, vim에서 사용가능한 버퍼는 알파벳[a-z]까지 26개 및 다양한 특수 문자 및 숫자에 특수한 기능으로 설정되어 있다.
ctrl+R + W%"
ctrl+r,w : 현재 커서 밑 단어
ctrl+r,% : 현재 파일 명
ctrl+r," : 현재 버퍼 내용
- :register or :reg
;현재의 register내용을 보여 줌.
"" ^[
"0~9
"a
"s
"w
"- ^[
".
": register
"% DBBG_rep.ch
"/ prep_map
16. vim+ctags
- vim과 ctags는 유닉스 환경에서 프로그래밍 시 없어서는 안될 필수의 기능이다.
ctags는 소스파일을 읽어서 각종 변수 및 구조체 함수의 위치를 태그로 만들어 tags라는 파일로 생성해서 이를 vim에서 함수 및 변수명을 통한 파일간 이동을 쉽게 해주는 툴이다.
- tags파일 생성법
ctags -R
ctrl+] -> tag로 이동
ctrl+t ->
vi -t tagname
17. 정규표현식
- 특정한 패턴을 기술하기 위한 Meta 언어를 이용하는 패턴 묘사.
^ 행의 시작에서 정규 표현식의 첫번째 문자가 매치(대괄호 안에서는 부정의 의미)
. 개행문자를 제외한 임의의 문자 한 개와 매치
[] 대괄호 안에 있는 임의의 문자와 매치하는 문자 클래스
* 바로앞에 있는 패턴이 0번 혹은 그 아상 반복되는 것
$ 행의 끝에서 정규표현식의 마지막 문자가 매치
\+ 앞에 있는 정규 표현식이 한 번이나 그 이상 반복하여 매치할 수 있음을 의미.
A\{1,3\}
;문자 A가 한번에서 연속 세번까지 나타난 문자열 매치
\| 앞에 있는 정규 표현식 혹은 뒤에 있는 정규 표현식에 매치
\< 단어의 시작
\> 단어의 끝
\( \) 정규표현식 여러 개를 새로운 정규표현식 한 개로 묶는다.
\s 공백(탭, 스페이스)
\d 숫자
18. #*
- 커서밑 단어 쉽게 찾기
# == ?\<ctrl+r ctrl+w\>
;커서밑 단어와 같은 단어 위로 탐색
* == /\<ctrl+r ctrl+w\>
;커서밑 단어와 같은 단어 아래로 탐색
19. 파일간 복사
1) register를 이용하는 방법.
2) split기능을 이용한 방법.
3) :r 명령을 이용한 방법.
20. undo & redo
- vim에서는 무한 undo & redo가 가능하다.
undo : u
redo : ctrl+r
21. 숫자의 증감 ctrl+a ctrl+x
- 숫자를 자동으로 증감 시키는 기능
add
extract
-사용법
101ctrl+a
100ctrl+x
22. ctrl+o <TAB>
- ctrl+o : 찾기 등의 명령으로(마커이동) 이동한 곳으로 이동
- <TAB> : 되돌아가기
23. set syn=c
- 확장자가 다른 파일 강제 syntax할당
확장자가 틀려서 syntax 칼라매핑이 안될 때.
24. VIMRUNTIME
echo $VIMRUNTIME
help file, syntax file, plugin file등이 있음.
.profile에 export VIMRUNTIME=...로 추가
-----------------------------------------------
- 백문이 불여일타!
- vi는 배우는 것이 아니라 몸으로 익히는 것이다!
-----------------------------------------------
-- vim: set fdm=marker: