4. vim에 추가된 기능들

4.1. multi-window

vim은 멀티 윈도우 기능을 지원합니다. 이 기능은 창을 분할해서 하나의 vi 에 여러 개의 파일을 보면서 편집할 수 있도록 해 주는 기능입니다. :sp 로 창을 분 할하거나 [ctrl]-wn 으로 창을 새로 만들 수 있습니다. 창간의 이동은 command 모드 에서 [ctrl]-ww나 [ctrl]-wk, [ctrl]-wj 등으로 할 수 있습니다. 직접 해보시는 편이 이해가 쉬우리라는 생각이 드네요. 창을 닫을 때는 각 창에서 파일을 닫아도 되고 [ctrl]-wc 로 닫을 수 있습니다. 저는 개/인/적/으로는 창 기능을 거의 쓰지 않습니 다. 가뜩이나 적은 모니터에 창까지 분할하면 볼 수 있는 내용이 줄어드니까요. ^^ 물론 :resize 등의 명령이나 [ctrl]-w+ [ctrl]-w- [ctrl]-w=등의 명령으로 창의 크기 의 조절이 가능합니다. 이러면 좀 쓸만합니다.

4.2. 확장 정규표현식

아래 내용은 vim 패키지에 포함된 정규표현식에 사용되는 기호들입니다. 이 것들이 다 필요한지는 의심스럽군요. 위에서도 잠깐 말했듯이 자주 사용되는 정규식 들을 기호화 해 놓았을 뿐입니다.
 	Character classes {not in Vi}:
\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] 
\U \U non-uppercase character [^A-Z] 
\e \e [ESC] 
\t \t [tab] 
\r \r [CR] 
\b \b [BS]
\n \n matches [NL] Not available yet! Will be used 
for multi-line patterns 
~ \~ matches the last given substitute string 
			

4.3. visual mode

vim에서 [ctrl]-v 를 누른 채로 이동을 하면 반전된 영역이 생기는 것을 볼 수 있습니다. 처음에 [ctrl]-v를 누르면 block으로 영역이 생깁니다. 이때 v를 입력 하면 영역이 문자 단위로 잡히고, V를 누르면 라인단위로 영역이 생깁니다.
				선택된 영역이 생겼을 때 쓸 수 있는 명령들 
~	대문자 <-> 소문자 전환
d	삭제
c	치환
y	버퍼에 복사
>	set shiftwidth로 정의해 놓은 만큼 우로 이동
<	set shiftwidth로 정의해 놓은 만큼 좌로 이동
:	선택한 영역에 대해서 ex 명령을 수행
J	줄을 합친다.
U	대문자로 만든다.
u	소문자로 만든다.
^]	tag를 찾는다.
	
대문자 <-> 소문자 전환 삭제 치환 버퍼에 복사 set shiftwidth로 정의해 놓은 만큼 우로 이동 set shiftwidth로 정의해 놓은 만큼 좌로 이동 선택한 영역에 대해서 ex 명령을 수행 줄을 합친다. 대문자로 만든다. 소문자로 만든다. tag를 찾는다.

4.4. tag stack

tag란 한 마디로 설명하자면 tags 파일에 존재하는 직접 이동을 위한 표시입 니다. (내용을 보면 이것도 매크로입니다.--) 프로그램을 작성하다보면 함수의 내용 을 알고 싶은 경우가 생기죠. 이런 때 그 함수로 직접 이동을 했다가 다시 편집하던 곳으로 이동을 할 수 있도록 해 줍니다. 다음과 같은 프로그램이 있다고 합시다.
main.c

void main(){
hello()
bye()
}
			
my.h
					
void hello(){
puts(Hello, vi user)
}
void bye(){
puts(Good bye)
}
			
자 이제 ctags로 tags 파일을 만듭니다. 다음과 같이 하면 되겠지요. :!ctags *.[ch] 혹은 다른 셀상에서 [nu11@foo vi-test]$ ctags *.[ch] 이제 tag stack의 기능을 활용해 봅시다. vi main.c로 main.c를 열어봅시다. hello() 앞으로 이동을 합니다. 어떻게 갈지는 알아서들 하시길... 이 위치에서 [ctrl]] 키를 누릅니다. (^]입니다. 컨트롤키를 누른 상태에서 ]) 화면이 바뀌면서 void hello(){ 의 맨 앞에 hello가 위치하게 되죠. 함수의 내용을 확인하였으면 다시 [ctrl]t를 누 릅니다. 다시 원래 위치로 복귀를 합니다. 다시 bye()가 있는 줄에서 [ctrl]]를 누르 면 다시 my.h가 열리면서 void bye()줄에 커서가 위치합니다. 다시 복귀는 [ctrl]t. vim의 HELP에도 tags화일이 존재합니다. :help로 help 문서를 보다보면 ||로 둘러싸인 것들이 있는데 이 위에서 ^]를 누르면 HYPER TEXT처럼 그 파일로 이동을 합 니다. 다시 ^t를 누르면 복귀구요.

4.5. 프로그래밍을 위한 명령들

vim에는 tag stack이외에도 프로그래밍에 편리한 기능을 제공합니다. 바로 컴파일 후에 에러가 난 곳으로 바로 이동을 할 수 있도록 해 주는 기능입니다. 우선 컴파일시에 만들어진 error 파일을 저장해야 합니다. 만약에 Makefile이 만들어져 있 다면 :make 명령 한 번만 내리면 자동으로 errorfile이 만들어지고 에러가 발생한 행 으로 이동을 합니다. :cl을 입력하면 에러 리스트가 나오고 :cn을 입력하면 에러가 난 다음 행으로 자동으로 이동을 합니다. :cN 은 반대 방향으로 에러가 난 행으로 이 동을 합니다. 여러 파일로 이루어진 소스의 경우에도 다 열어가면서 들어갑니다.
main.c

void added(){
This makes error
}
void main(){
hello()
bye()
added()
}
my.h

		
void hello(){
this also makes error
puts(Hello, vi user)
}
void bye(){
puts(Good bye)
}
			

Makefile

all : main.c my.h
gcc -o test main.c my.h
clean : test
rm -f test
				
이렇게 만들어 놓고 vi main.c에서 :make를 해 봅시다. 에러가 한 번 출력된 후에 my.h의 this also makes error 라인에 커서가 위치하고 vi의 맨 아래줄에는 (4 of 12): `this' undeclared (first use this function) 라고 출력이 될 껍니다. :cn을 해 봅시다. (5 of 12): (Each undeclared identifier is reported only once로 메 시지가 바뀌었지요. 몇 번 :cn을 하다보면 다시 main.c의 This makes error 라인에 커서가 위치하죠. 몇 번 해보시면 충분히 이해하리라 생각합니다. Makefile 파일을 만들지 않고 할 수 있는 방법은 없는가? 분명히 있겠죠. 단순히 컴파일 에러 메시지가 들어 있는 파일만 있으면 동작을 하니까요. 해보도록 하 죠. :!gcc -c main.c >& err.out 이렇게 하면 error 메시지가 err.out에 저장이 되겠 지요. 다음에 할 일은 파일을 지정해 주는 것입니다. :cf err.out 자 이제 :make했던 것과 같이 :cn을 하면서 디버깅을 할 수 있습니다.