1. vim 소개
vim 은 유닉스에서 널리 사용되고 있는 텍스트 에디터인 vi의 한 종류로써 전통적인 vi 에디터에 비해 많은 기능이 추가된 강력한 에디터이다. vim은 그 기능에 비해 상대적으로 가벼워 사이즈가 큰 파일을 편집할 때도 높은 편집 속도를 낼 수가 있다. 오늘날 Window 환경에서 WYSIWYG을 지원하는 많은 에디터들이 있지만 vi처럼 달되?숙달 될수록 작은 손놀림으로도 높은 편집 속도를 낼 수 있는 에디터는 없?것이다. vim은 기능이 다양할 뿐만 아니라 다양한 운영체제를 지원한다. 모든 리눅스/유닉tm 뿐만 아니라 과거 16bit 도스에서부터 Windows-XP에 이르는 MS 환경까지 거의 모든 플랫폼에서 vim을 사용할 수 있다. 또한 vim은 국제화가 무척 잘 되어 있는 에디터이다. vim 이 설치되어 있는 환경이 한글 Windows 2000, 한글화된 리눅스 혹은 유닉스라면 모든 메시지가 한글로 출력될 뿐만 아니라 한글 입력 또한 문제가 없을 것이다. 물론 영문 Windows 및 영문 환경의 리눅스 혹은 유닉스라면 메시지가 영문으로 출력될 것이다. 앞으로도 vim을 통해 출력되는 메시지를 설명할 때 영문 혹은 한글 두가지를 모두 설명할 것이다. 흔히들 vi를 개발자를 위한 에디터로 알고 있지만 vi는 개발자뿐만 아니라 어떠한 텍스트 편집에도 강력한 기능을 발휘하는 범용 텍스트 에디터이다. 리눅스나 유닉스를 처음 접하는 사용자에게는 vi 와 같은 에디터가 처음으로 다가오는 큰 벽이 아닐 수 없다. 컴퓨터를 처음 접하고 나서 맨 처음 배운 에디터가 vi 가 아니고서야 편리하고 화려한 에디터와 워드 프로세서만을 접해온 사용자에게는 분명 배우고 어렵고 힘들 수밖에 없을 것이다. 하지만 고진감래라 했던가? 힘들게 배운 만큼 충분히 보상은 따를 것이다. 이 연재를 충실히 따라하고 손에 익을 때까지 연습하다보면 어느새 현란한 손놀림으로 순식간에 텍스트를 편집하는 멋진 실력가가 되어 있을 것이다.
2. vi 준비 운동
이번 호에서는 본격적으로 vim 의 세계에 들어가기 전에 기본적인 vi 명령에 익숙해지는 시간을 가져 보기로 하겠다. vi를 처음 접하는 사용자에게 가장 어려운 개념은 바로 여러 가지 “Mode”가 있다는 것이다. vi 에는 맨 처음 파일을 오픈 하거나 특별한 명령을 대기하는 "Normal Mode", 내용을 입력할 수 있는 "Insert Mode", 명령을 내릴 수 있는 "Command Mode", 그리고 Vim에는 특별히 "Visual Mode"라는 것이 있다. 현재 자기가 어떤 모드에 있는 지는 좌측 하단을 보면 어림잡아 알 수 있다.
여러분의 터미널에서 위와 같이 “vim 파일이름” 명령을 입력했을 때 뜨는 화면은 “Normal Mode” 이다. 아래 그림에서 알 수 있듯이 "Normal Mode" 에서는 좌측하단에 특정 Mode를 가르키는 메시지 없이 비어 있을 것이다.
위처럼 ‘ ~ ‘ 로 시작하는 줄은 파일에 내용이 없음을 나타낸다. 위의 그림은 파일에 아무 내용이 없다고 생각하면 된다.
자 이제 내용을 입력해 보기로 하자. 위의 입력 모드에서 "i" 를 누르면 다음 그림처럼
"Insert Mode"로 변경 될 것이다. "Insert Mode"로 들어가게 되면 좌측 하단에 “-- 끼워넣기 --” 혹은
"-- INSERT --" 라는 메시지가 출력될 것이다. 메시지는 국제화에 따라 한글 환경 혹은 영문 환경에 따라 다르게 출력될
뿐 기능에는 전혀 영향을 주지 않는다. “Insert Mode"에서는
vi에 익숙하지 않은 사용자는 간혹 자기가 어느 Mode에 있는 지 몰라 문서 편집을 망치는
경우가 있다. 물론 좌측 하단에서 현재 어느 Mode 인지 알려주긴 하지만 이 영역이 단순히 Mode 뿐만 아니라 다양한
메시지도 출력하기 때문에 자신이 어느 Mode 에 있는지 정확히 알지 못할 수 있다. 이때 가장 좋은 방법은
3. 기본적인 편집 명령
3.1 한 문자 씩 이동 (h k j l)
vi에서 이동은 "Normal Mode"에서
행해진다. vi 는 기본적으로 방향키 대신 일반적인 문자키를 사용한다. 그럼 먼저 문자 하나하나 사이를 이동하는 것부터
알아보도록 하자. vi 는 h(좌), j(하), k(상), l(우) 4개의 키를 사용하여 이동을 한다. 물론 "Insert
Mode"나 "Normal Mode"에서 방향키를 이용하여 이동할 수도 있지만 "Normal Mode“에서 h, j, k, l
이 4개의 키를 이용하는 것이 훨씬 이동속도를 빠르게 해준다. 한가지 vi는 대문자와 소문자를 구분하기 때문에 Caps Lock
이 눌려있는 상태에서 대문자를 입력하지 않도록 유의해야 한다. 만약 대문자를 입력하게 되면 전혀 다른 동작을 하게 된다.
이동키는 손에 어느 정도 익을 때까지 충분히 연습해 보기 바란다.
3.2 삭제 ( x )
문자 하나를 삭제하기 위해서는 삭제하고자 하는 문자로
이동한 후 ‘x' 키를 누르면 된다. 물론 삭제 역시 "Normal Mode"에서 이루어진다. 만약 5개의 문자를 지우고 싶다면
xxxxx 이렇게 다섯 번 연달아 누르면 된다.
3.3 Undo 와 Redo ( u, Ctrl+u )
편집을 하다 보면 어떤
문자나 문장을 삭제하였거나, 입력한 문장이 마음에 들지 않을 때 차라리 이전 내용으로 돌아가고 싶을 것이다. 이 때 사용할 수
있는 기능이 “Undo” 이고 “Normal Mode"에서 'u'를 입력하면 된다. 만약 "Insert Mode"에서 내용을
입력하다 입력한 내용을 취소하고 싶다면 '
3.4 입력 (a)
‘i'를 통해 "Normal Mode"에서 “Insert Mode"로 들어가게 되면 현재 커서 위치에 바로 입력 할 수 있게 된다. 그렇다면
3.5 줄 삭제, 추가 (dd, o, O)
이제 기본적인 줄 단위 조작에 대해
알아보도록 하자. 편집 중인 문서에서 한 줄을 삭제하고자 하면 ‘dd', 즉 연달아 ’d'를 두 번 입력하면 된다. 물론 삭제한
이후 바로 되돌리고 싶다면 ‘u'를 누르면 될 것이다. 빈 줄을 추가하기 위해 지금까지 배운 방법을 활용한다면 먼저 줄의 맨
끝으로 이동하여 "Insert Mode"로 들어간 다음에
3.6 반복
실행 커서를 오른쪽으로 5칸 옮기고 싶을 때, 10개의 문자를
삭제하고 싶을 때, 3줄을 없애고 싶을 때, 같은 명령을 원하는 횟수만큼 반복하여 원하는 결과를 얻을 수 있을 것이다. 하지만
어느 누가 단순하게 반복되는 조작을 좋아 할 수 있을까? vi 에디터는 원하는 명령 앞에 반복하고 싶은 횟수를 지정하여 원하는
만큼 명령을 반복 실행 할 수 있다. 예를 들어 ‘3l' 은 오른쪽으로 3칸 이동, '4dd' 는 4줄 삭제를 나타낸다. 삭제
및 이동 명령은 단순히 명령어 앞에 반복하고 싶은 횟수만 지정하면 되지만 'i', 'a', 'o', 'O' 와 같이 삽입, 추가
명령과 함께 사용할 경우 반드시
3.7 저장, 빠져 나가기
지금까지 익힌 vi 명령을 통해 기본적인 편집을 할 수
있게 되었다. 이제 지금껏 정성들여 편집한 문서를 저장하고 종료할 차례이다. 문서를 저장하거나 종료하기 위해서는 “Normal
Mode"에서 ':' (콜론)을 쳐 “Command Mode"로 들어가야 한다. 일단 "Command Mode"로 들어오면 아래
그림처럼 좌측 하단에 ':' 이 적히게 되고 명령을 기다리게 된다.
다른 이름으로 파일 저장 종종 편집하고자 하는 파일의 소유권이 자기 자신에게 있지만 권한이 없는 파일을 vim 으로 열어 열심히 편집한 뒤에 저장을 하려고 할 때 쓰기 권한이 없어 파일을 저장하지 못하는 경우가 있다. 이 때 물론 다른 이름으로 저장할 수도 있지만 'w!'처럼 ‘w'뒤에 '!'를 함께 적어주어 강제로 파일을 저장시킬 수 있다. 파일을 저장한 후 vim을 종료하는 명령은 'q' 이다. 물론 'q' 역시 "Command Mode"에서 입력을 해주어야 한다. 만약 저장하지 않은 상태에서 모든 편집을 취소하고 vim을 종료하고 싶으면 'q!'처럼 뒤에 ‘!'를 추가해 주면 된다. 끝으로 저장과 동시에 종료 할 수도 있는데 이때는 ‘wq' 와 같이 'w'와 ’q'를 나란히 같이 적어주면 된다.
4. 추가적인 편집 명령
지금까지 아주 기본적인 편집 명령을 살펴보았다. 지금까지 몇 안되는 편집 명령을 알아보았지만 Mode 변화에 익숙하기만 해도 vi 의 반 이상은 배운 것이라 해도 과언이 아니다. 앞으로 몇가지 명령들을 차근차근히 익히다 보면 편집 속도가 눈에 띄게 증가하게 될 것이다.
4.1 이동
이전 장에서 문자 단위로 이동하는 것을 연습해 보았다. 이번에는 단어
및 페이지 단위 이동과 줄에서 시작 및 끝으로 이동하는 방법을 배워보도록 하겠다. 아무래도 단어 단위로 이동하게 되면 문자
단위로 이동하는 것보다 이동 속도가 훨씬 빠를 것이다. 한 단어 오른쪽으로 이동하는 명령은 'w', 왼쪽으로 이동하는 명령은
'b' 이다. 여기에서 알파벳이나 숫자를 제외한 모든 문자도 하나의 단어처럼 취급을 한다.
You'll take away the
위와 같은 문장의 시작에서 차례로 'w'를 누르게 되면 다음과 같이 커서가 이동할 것이다.
You'll take away the
이와 달리 대문자인 'W' 와 'B' 명령은 단어를 오로지 Space 로 구분하게 된다. 즉 위의 문장의 시작에서 'W'를 누르면 따옴표와 'l' 로는 커서가 이동하지 않고 다음처럼 이동할 것이다.
You'll take away the
다른 명령과 마찬가지로 '2w', '3b' 와 같이 단어 이동 명령 앞에 숫자를 사용하게 되면 해당되는 크기만큼 명령을 반복하게 된다. "Normal Mode"에서 '0' 이나 '^' 명령은 줄의 시작으로, '$' 는 줄의 끝으로 이동하는 명령이다. 파일 내에서 원하는 줄로 이동을 시킬 수도 있다. 실습을 위해 "Command Mode" 로 들어가 "set number" 라는 명령을 입력해 보도록 하자.
:set number
그러면 다음 그림과 같이 파일 내용을 줄 번호와 함께 보여주게 될 것이다. 자 이제 다시 "Normal Mode"에서 '3G', '5G' 와 같이 명령을 내리면 3번째 줄, 5번째 줄로 이동하게 된다. 즉 원하는 줄로 이동하고 싶을 때는 'G' 명령 앞에 원하는 ‘줄의 번호’를 적어 주면 된다. 줄의 번호를 보고 싶지 않다면 다시 "Command Mode"에서 "set nonumber" 라는 명령을 주면 된다.
:set nonumber
이렇듯 번호가 보이지 않는 상태에서 현재 자신이 몇 번째 줄에 있는지, 그리고 전체 파일 중 어느 정도 즈음에 있는지 알고 싶을 때는 'Ctrl+g' 명령을 내려주면 된다. 끝으로 자주 사용하는 이동 명령 중에 페이지 단위 이동이 있다. 한 페이지 위는 'Ctrl+u', 페이지 아래는 'Ctrl+d' 명령을 내려주면 된다. Up and Down 의 첫 번째 문자라고 생각하면 익히기가 쉬울 것이다.
4.2 단어 삭제(2d3w)
한 문자를 삭제하는 명령은 'x' 였다. 그럼 한 단어를 삭제하는 명령은 무엇일까? 바로 ‘dw' 명령이다. 'dw' 명령은 반복 명령과 함께 사용하면 여러 단어를 한꺼번에 삭제 할 수 있는데, 그 횟수를 어디에 적어 주느냐에 따라 의미가 약간씩 달라지게 된다. '3dw' 는 단어를 3회 삭제하는 것이고, 'd3w'는 3단어를 삭제하는 것이다. 결과적으로 동일하게 커서 다음의 3단어를 삭제하게 된다. 그럼 '2d3w' 는 무엇일까? 바로 3단어를 2회 삭제하게 되는데, 이렇게 되면 커서 다음의 총 6단어를 삭제하게 된다.
A love like ours is love that's hard to find
위의 예에서 커서가 처음 love 의 'l' 에 있고, '3dw' 혹은 'd3w' 명령을 내리면 'love like ours' 3 단어가 삭제 된다. 현재 위치에서 라인 끝까지의 삭제는 'd$' 이다.
A love like ours is love that's hard to find
위에서 that의 ‘t'에 커서가 있고, 'd$' 명령을 내리면 줄의 ’that's hard to find' 모두가 삭제 될 것이다. 마지막으로 삭제 명령인 'd'와 잘 어울릴 수 있는 명령 중에 'f' 명령이 있다. 'f'는 같은 줄 내에서 특정 문자가 있는 곳으로 커서를 옮겨주는 명령이다. 다음 문장에서 'fe' 명령을 문장내에 'e' 이 있는 곳으로 커서가 이동하게 된다.
A love like ours is love that's hard to find
'df' 명령은 지금까지 ‘d' 명령의 특징을 이해하신 분이라면 금방 눈치를 챘을 것이다. 바로 특정 문자가 있는 곳까지 모든 문자를 삭제하게 된다. 위 문장의 처음 위치에서 'dfe' 라는 명령을 내리면 다음과 같이 A love 까지가 삭제 되게 된다.
like ours is love that's hard to find
4.3 .
. 은 vi 의 여러 명령 중에서 가장 간단하면서도 또한 강력한 명령이기도 하다. 명령은 가장 최근에 수행했던 삭제 명령을 반복 수행하게 해준다. 만약 가장 최근 삭제 명령이 'dd' 였다면 현재 위치에서 . 명령을 실행하면 한 줄이 삭제 된다. 최근 명령이 dw 였다면 . 명령은 한 단어를 삭제할 것이다. 즉 가장 최근에 어떤 삭제 명령을 내렸느냐에 따라 . 명령은 달리 동작하게 된다. 다음과 같이 'f<' 와 'df>', '.' 명령을 잘 조합하면 HTML 태그를 제거할 수 있을 것이다.
We've come too far to leave it all behind | 'f<', 'df>','j' | 삭제 |
How could we end it all this way? | f<.f<.' | strong 태그삭제 |
When tomorrow comes and we both regret |
'f<.' |
삭제 |
4.4 매크로
명령은 간단한 조작으로 같은 명령을 반복 실행할 때 유용하였다. 여러
명령을 반복 실행하기 위해서 매크로를 사용할 수 있다. 매크로는 "Normal Mode"에서 q 명령으로 등록을 시작하여 q 로
등록을 마친다. "Command Mode"의 q 명령과 혼동하지 말기 바란다. 매크로의 이름은 알파벳 소문자 하나로 정할 수
있다. 그리고 매크로는 @으로 실행한다. 만약 매크로 이름이 a 였다면 @a 로 매크로를 실행할 수 있을 것이다.
위의 태그 없애기를 매크로를 사용하여 다시 해보기로 하자. 먼저 매크로를 등록해 보면
qa ^ | 'a'라는 매크로 등록 |
f< | 시작 줄의 시작으로 이동 |
df>> | '<' 문자로 이동 '>' 까지 삭제 |
q |
매크로 등록 마침 |
위의 매크로를 태그제거에 응용해 보면
We've come too far to leave it all behind | @a | 삭제 |
How could we end it all this way? | 2@a | strong 태그삭제 |
When tomorrow comes and we both regret |
@a |
삭제 |
이렇듯 간단한 매크로 활용으로도 편집속도를 높일 수 있다.
4.5 기타(덮어쓰기, 줄합하기, 대소문자 변경)
'r' 명령은 현재 커서에 있는 문자를 'r' 다음에 오는 문자로 덮어쓰기를
한다.tomorrow 커서가 현재 't' 위에 있고 '5ra' 라는 명령을 내리면 커서 뒤로 다섯 문자를 a 로 덮어써
aaaaarow 로 변경을 시킬 것이다. 'R' 명령은
5. 정리
이번 회를 통해 vi 의 기본적인 편집 명령을 알아보았다. 주로 간단한 명령 위주로
설명을 했지만 적은 분량은 아니라고 생각한다. 처음엔 약간 손에 익지 않더라도 몇 번씩 꾸준히 연습하다보면 자기도 모르게 손이
먼저 움직이게 될 것이다.
h, j, k, l 좌, 하, 상, 우 로 한 문자씩 이동
x
u, Ctrl+U
i, a
dd
o, O
w, b
dw
d$
df
.
q, @r,
R
J
~
한 문자 삭제
Undo, Redo
"Insert Mode"로 전환
한줄 삭제
한줄 추가(커서 밑줄, 커서 윗줄)
단어 단위 이동(우, 좌)
한 단어 삭제
현재에서 줄 끝까지 삭제
해당하는 문자까지 삭제
최근 삭제 명령 재 실행
매크로 등록 및 매크로 실행
덮어쓰기
줄합하기
대소문자 변경
We've come too far to leave it all behind | @a | 삭제 |
How could we end it all this way? | 2@a | strong 태그삭제 |
When tomorrow comes and we both regret |
@a |
삭제 [출처] [본문스크랩] VIM 강좌 - VIM 시작하기|작성자 히트 |
이번 회에서는 vim 내에서 특정 표현을 검색하고 치환하는 방법을 배워보도록 하겠다. 좀더 복잡한 패턴의 검색을 위해서는
정규표현식이라는 것을 사용해야만 한다. 비단 vim 뿐만 아니라 많은 유틸리티에서도 사용하는 정규표현식을 어느 정도 익히게 되면
어렵게만 느껴졌던 많은 명령어들이 그만큼 친숙하게 다가올 것이다.
1. 검색
이번 장에서는 vim을 통해 검색하기 위해 다음과 같은 기본적인 내용에 다루기로 한다.
- 순방향, 역방향 검색
- 검색 옵션
1.1 순방향, 역방향 검색
일
반적인 검색이란 문서의 시작 혹은 현재 위치에서 문서의 끝방향으로 검색을 해나가게 되는데 이를 순방향 검색이라 한다. 반대로
현재의 위치에서 문서의 처음 방향으로 검색을 해나갈 수도 있는데 이를 역방향 검색이라 한다. 이 두 가지 방식의 검색은 단지
종이 한 장 차이만 날뿐 복잡한 차이는 없다.
vim는 '/' 명령으로 순방향 검색을 실시한다. "Normal
Mode"에서 '/'를 쳐주게 되면 다음 그림처럼 커서가 좌측하단으로 이동하면서 밑줄에 '/' 가 적히게 된다. 이 상태에서
검색하고 싶은 문자열을 적어주면 된다. 반대로 역방향 검색은 '/' 대신 '-' 로 검색 명령을 내리면 된다.

변경전 확인
/ 나 - 로 검색 명령을 내린 뒤 를 치게되면 커서가 처음 발견한 위치에 놓이게 된다. 같은 검색을 계속하기 위해서는 "Normal Mode" 상태 그대로에서 'n'을 누르면 된다. 이 때 검색 방향으로 다음 발견한 위치에 커서가 놓이게 된다.
다음 예에서 ‘/it’ 으로 검색 한 후 'n'을 누르게 되면 14, 16, 17, 22 번째 줄 순서대로 커서가 이동해가게 된다.
13 A love like ours is love that's hard to find
14 How could we let it slip away-
15
16 We've come too far to leave it all behind
17 How could we end it all this way-
18 When tomorrow comes and we both regret
19 The things we said today
20
21 A love like ours is love that's hard to find
22 How could we let it slip away-
위의 예에서도 보듯 'n'은 검색 방향으로 검색 결과를 추적해 간다. 만약 검색방향의 반대 방향으로 추적을 하고 싶으면 'N'을 누르면 된다.
한가지 주의 할 것은 vim을 통해 검색할 때 ‘^$*[]’ 등과 같은 특수 문자는 뒤에서 배울 정규표현식을 위해 특별한 용도로 사용된다. 그렇기 때문에 '$' 문자 자체를 검사하고 싶다면
$ 앞에 \를 추가하여 \$ 와 같이 검색해야 한다.
1
2 $ dollar
3 Good Morning!
4
위의 예에서 '$' 라는 문자를 검색하기 위해 /$ 로 명령을 내리면 아마 검색 결과가 줄의 끝을 가르킬 것이다. 이에 대한 자세한 이유는 뒤에 설명하기로 하고 제대로 한다면 /\$ 로 검색하기 바란다.
여러 가지 검색어로 검색을 한 경우 vim 는 history 기능으로 전에 검색했던 검색어를 쉽게 재활용 할 수 있다.
지금까지 다음과 같이 세 검색어로 검색을 한 경우
/aaa
/bbb
/cccc
/를 누른 상태에서 화살표 Up, Down 키를 누르면 전에 검색했던 검색어로 찾아 들어가게 된다. 원하는 검색어를 찾을 경우 만 쳐주면 다시 검색을 실시 할 수 있다.
1.2 검색 옵션
이 번 절에서는 검색 결과나 방법에 영향을 줄 수 있는 몇 가지 옵션에 대해 알아보도록 하겠다. 특별한 옵션이 없다면 vim 은 검색할 때 대소문자를 구별한다. 그래서 /abc 와 /ABC 는 전혀 다른 검색 결과를 보여주게 된다. 대소문자를 구분하지 않고 검색하고 싶다면 "Command Mode"에서 다음과 같은 명령을 내려주면 된다.
:set ignorecase 혹은 :set ic
다시 대소문자를 구분하고 싶으면
:set noignorecase
명령을 내려주면 된다.
일 단 vim에서 검색을 하게 되면 검색어에 해당되는 결과는 바탕이 강조되어 보이게 된다. 이 결과는 다른 검색을 할 때까지 그대로 표시가 되는데 가끔 편집할 때 눈이 피로해 보이는 경우가 있다. 만약 강조(highlight)되는 것을 없애고 싶다면 다음과 같은 명령을 내려주면 된다.
:set nohlsearch
다시 강조하게 하고 싶으면
:set hlsearch
명령을 내려주면 된다.
vim 이 디폴트로 세팅되어 있다면 검색어를 완벽히 입력하고 를 쳐야만 비로소 검색을 시작하게 된다. 이와 반대로 ‘find' 라는 단어를 찾을 때 f, i, n, d 한글자 한글자 입력할 때마다 그때 그때의 결과를 바로 볼 수 있는 검색을 incremental searching 이라고 한다. 이러한 검색을 사용하면 정확히 찾고자 하는 단어가 떠오르지 않을 때 조금씩 단어를 완성해가면서 검색을 할 수 있다. 검색 방법을 incremental searching 으로 바꾸려면
:set incsearch
이란 명령을 입력하면 된다. 반대로 해제는 다른 옵션과 마찬가지로 앞에 no를 앞에 붙여
:set noincsearch
명령을 내려주면 된다.
2. 정규 표현식(regular expression)
정 규표현식이란 주로 문자열 내에서 검색이나 조작에 사용되는 표현식으로써 특정한 패턴을 가지고 그 패턴에 부합되는 문자열을 찾아내 원하는 일을 수행 할 수가 있다. 정규표현식은 비단 vim 뿐만 아니라 sed, grep, 과 같은 유틸리티부터 시작해서 vim, emacs 와 같은 편집기 그리고 perl, php 와 같은 프로그래밍 언어에까지 문자열을 다루는 프로그램에는 거의 모두 사용되고 있다. 하지만 정규표현식이 쓰이는 모든 프로그램에서 동일한 문법으로 정규표현식을 규정하고 있지는 않는다. 그렇기 때문에 vim에서 사용하는 정규표현식을 완벽히 익혔다 하더라도 다른 프로그램에서 정규표현식을 사용할 때는 표현이 적절한 지 미리 알아 보아야 한다. 하지만 그렇다고 너무 걱정할 필요는 없다. 문법이 다르다고는 하지만 기본적인 내용은 모두 같고 약간의 형식만 다르기 때문이다. 이번 절에서는 정규표현식의 기본적인 문법을 검색으로 실습하며 익혀 보기로 하겠다.
2.1 문자 패턴
[abc] : a, b, c 문자 중 한 문자를 가리킨다.
만 약 b[abc]ll 라고 검색을 하면 ball, bbll, bcll 이 세 개의 문자열 중 하나가 검색 될 것이다. [] 안에는 알파벳이나 숫자가 올 수 있고 이 안에 나열되어 있는 문자 중 한 문자를 가리키게 되는 것이다. 즉 [abc] 는 검색에서 한 문자처럼 취급을 받을 것이다. 만약 [] 안에 특수 문자를 넣고 싶으면 앞에 꼭 \를 넣어줘야 원하는 패턴을 만들 수 있다.
[a-z], [0-9], [A-Z0-9] : [] 안에는 문자의 범위가 들어 갈 수도 있다.
[a-z] 는 결코 a, -, z 라는 문자 중 한 문자를 가리키지 않는다. 대신 알파벳의 모든 소문자 a, b, c .... x, y, z를 가리킨다. - 가 [] 안에 들어가게 되면 문자의 범위를 나타내는 특수한 역할을 하게 되는 것이다. 비슷하게 [0-9] 는 숫자 [A-Z0-9] 는 알파벳 대문자와 숫자를 나타낸다.
. : 정규표현식에서 . 은 new line 문자(엔터)를 제외한 모든 문자를 가리킨다. 즉 알파벳 혹은 공백과 같은 특수문자, 숫자 모두 . 에 속하게 된다.
[^a-z] : ^ 가 [] 안에 들어오면 안에 나열되어 있는 문자를 제외한 다른 모든 문자를 나타낸다. 이와 같이 하면 알파벳 소문자를 제외한 모든 문자, 즉 대문자, 숫자, 특수문자 모두가 이에 해당된다.
특수문자 : 특수문자는 항상 \ 와 같이 쓰여야 문자 그대로의 의미를 나타낸다. 공백(Space)는 '\ ' 로 Space 앞에 \를 붙여주면 된다.
그럼 지금까지 익힌 문자 패턴을 이용하여 몇가지 예를 들어 보기로 하겠다.
첫 문자는 무조건 대문자로 시작하고 곧바로 숫자가 2자리 오는 패턴을 정규표현식으로 만들면 어떻게 될까- 대문자는 [A-Z], 숫자는 [0-9], 그리고 숫자가 2번 오기 때문에 [A-Z][0-9][0-9] 이렇게 하면 표현식이 완성된다.
2.2 위치
^문자열 : '^' 다음에 문자열이 오면 해당 문자열이 줄의 처음에 오는 경우이다.
밑의 문장에서 /^The 로 검색을 하게 되면 줄의 맨 처음에 위치한 The 만 표현식에 해당된다. [ ] 내에 있던 ^ 과 혼동하지 않기를 바란다.
The things we said today, The things we said today
두 번째 The 는 문장의 처음에 오지 않았기 때문에 표현식과 맞지 않는 표현이다.
문자열$ : 문자열 다음에 $를 붙이게 되면 해당 문자열이 줄의 끝에 오는 경우를 가리킨다.
위의 예에서 /today$ 로 검색하면
The things we said today, The things we said today
뒤에 있는 today 만 검색된다. 가운데 있는 today 는 줄의 끝에 있지 않기 때문이다.
2.3 반복
반복을 지정하는 표현식은 문자 뒤에 적어 앞에 있는 문자가 몇 개까지 반복되는 지를 지정한다.
* : 0 번 이상
\+ : 1 번 이상 (vim only)
\- : 0번 혹은 1번 (vim only)
\+ 와 \- 는 전통적인 vi 에서는 제공되지 않고 vim 에서만 사용할 수 있다. 물론 리눅스에 설치되어 있는 vi는 vim 이기 때문에 사용 가능하다. 그럼 차근차근 예를 들어 설명해 보면,
ab* 는 b라는 문자가 없을 수도 있고 한번 이상 올 수도 있다. 그렇기 때문에 a, ab, abb, abbb, 모두 이 표현식을 만족한다.
ab\+ 는 ab* 와 달리 반드시 b 라는 문자가 한번 이상 와야 한다. 때문에 a 는 이 표현식을 만족시키지 못한다. ab, abb, abbb처럼 반드시 a 뒤에 b가 한번 이상은 존재해야만 한다.
ab\- 는 a 뒤에 b가 올 수도 오지 않을 수 도 있다. 즉 a, ab 둘다 이 표현식을 만족한다.
그럼 abc 와 같은 문자열이 반복되는 정규표현식은 어떻게 만들 수 있을까- 바로 문자들을
\( 와 \) 안에 묶어 두면 된다.
\(abc\)* 는 abc 문자열이 0번 이상 반복되는 표현식이고
\(abc\)\+ 는 abc 문자열이 1번 이상 반복되는 표현식이다.
※ 만약 여러분이 /\(abc\)* 와 같은 검색을 명령을 내리면 vi 는 아마도 모든 문자가 검색결과로 지정 될 것이다. 왜냐하면 * 특성 자체가 0번도 인정하기 때문에 굳이 abc 라는 문자열이 없어도 표현식을 만족하기 때문이다.
짧은 단어를 검색하고자 할 때 간혹 그 단어가 포함된 다른 단어까지 같이 검색 되어지곤 할 것이다. 일 예로 'be' 란 단어를 검색하다보면 behind 와 같이 검색어가 포함된 단어도 같이 검색이 된다. 만약 be 앞뒤로 공백 문자가 있는 단어 자체를 검색하고 싶을때, 지금까지 배운 방법을 사용하면 '\ be\ '처럼 할 수 도 있다. 하지만 이나 까지 모두 고려하려다 보면 표현식이 약간 지저분해 질 수 있다. 이때 깔끔히 사용할 수 있는 정규표현식이 \<\> 이다.
/\ 로 검색을 하면 완벽한 단어인 be (앞뒤로 공백문자가 있는) 가 검색 된다.
지금까지 배운 정규표현식을 응용하여 검색을 해보도록 하자.
반드시 줄의 시작은 알파벳 하나 이상으로 시작하고 중간에 하나 이상의 공백 문자 다음에 2개 이상의 숫자가 오는 패턴은 어떻게 정규표현식으로 나타낼 수 있을까-
먼저 하나 이상의 알파벳으로 줄이 시작하기 때문에
^[A-Za-z]\+
와 같은 표현식을 쓸 수 있다. 대소문자를 따로 언급하지 않았기 때문에 대문자와 소문자 모두 속해 있어야 한다.
중간에 하나 이상의 공백 문자가 오는 것까지 첨가하면
^[A-Za-z]\+\ \+
로 \ \+ 가 추가되었다.
끝으로 2개 이상의 숫자가 오기 때문에
^[A-Za-z]\+\ \+[0-9][0-9]\+ 와 같이 쓸 수 있다.
3. 바꾸기
검색과 함께 빼놓을 수 없는 것은 바꾸기 일 것이다. 대부분 검색을 하게되면 검색으로 끝나지 않고 다른 단어로 바꾸는 작업이 같이 이루어진다.
3.1 바꾸기 문법
검색한 패턴을 다른 단어로 바꾸기 위해서는 먼저 범위를 지정하고 검색어와 변경할 문자열을 지정하면 된다. 이번 절에서는 기본적인 바꾸기 작업을 배워 보도록 하겠다.
바꾸기 위한 기본적인 문법은 다음과 같다.
:<시작줄 번호>,<끝 번호> s/검색어/바꿀단어/옵션
위의 문법으로 다음과 같은 예를 들 수 있다.
:1,10 s/The/the/g
해 석해 보면 1번째 줄에서 10번째 줄 사이에 있는 "The" 라는 단어를 "the"로 바꾸라는 명령이다. 맨 끝의 g 라는 옵션은 모든 검색어에 대해 변경을 실시하게 해준다. 만약 g 옵션이 없을 경우 한 줄에 2 개 이상의 The 가 있을 경우 첫 번째 "The" 만 "the"로 변경을 하게 된다.
이외에 줄 번호를 가리키는 특별한 문자가 있다.
. : 현재 커서가 놓여 있는 줄의 번호
$ : 마지막 줄
:.,$ s/The/the/g
위의 명령은 현재에서 마지막 줄까지 모든 "The"를 "the" 로 바꾸게 한다.
바꾸기 문법중 검색어에는 2장에서 배운 정규표현식을 사용 할 수 있다. 만약 모든 줄에서 다른 단어에 포함되지 않은 "be" 라는 단어를 검색하여 대문자 "BE"로 변경하고 싶다면
:1,$ s/\/BE/g
처럼 명령을 내릴 수 있다.
만약 정규표현식에 익숙하지 않다면 완벽한 예제를 보며 차근차근 익히기 바란다.
3.2 정규표현식과 변수
2장의 정규표현식에서 \( \) 는 문자열을 하나의 단위로 보게 하는 역할을 하였다. 하지만 바꾸기에 사용 될 경우 변수 역할도 하게 된다.
abcd 100 이란 문장과 \([a-z]\+\)\ \([0-9]\+\) 이러한 정규표현식이 있다고 하자.
위 의 문장과 정규표현식을 분석해 보면 앞의 abcd 는 뒤의 정규표현식 \([a-z]\+\) 에 해당하고 숫자 100 은 \([0-9]\+\) 에 해당하는 것을 알 수 있을 것이다. 그리고 가운데 공백은 정규표현식 '\ ' 에 해당한다.
정규표현식에서는 \( \)에 대해 하나의 단위로 묶으면서 동시에 \1, \2 와 같은 변수에 대응을 시킨다. 즉 위와 같은 경우 첫 번째 \( \) 는 \1에, 두 번째 \( \) 는 \2 라는 변수에 저장되는 것이다.
다음과 같은 문서가 있다고 보자.
height 150
weight 60
age 20
위와 같은 문서에서 문자와 숫자의 위치를 바꿔 다음과 같이 만들고 싶다.
150 height
60 weight
20 age
정규표현식의 변수와 vim의 바꾸기를 사용하여 앞 뒤 순서를 한번 바꾸어 보도록 하겠다.
:1,$ s/\([a-z]\+\)\(\ \+\)\([0-9]\+\)/\3\2\1/g
다소 복잡해 보이지만 차근차근 분석해 보도록 하겠다.
1,$ : 검색의 범위를 처음에서 끝 줄까지로 지정을 하였다.
s/.../.../g : 언제나 검색 및 바꾸기는 이러한 문법을 사용한다.
자 그럼 검색어 부분을 분석해보도록 하자.
\([a-z]\+\)\(\ \+\)\([0-9]\+\)
이 검색어를 \( \) 로 구분해 보면 다음 3개로 나뉘어 진다.
\([a-z]\+\) → \1 알파벳 문자 1개 이상
\(\ \+\) → \2 공백 문자 1개 이상
\([0-9]\+\) → \3 숫자 1개 이상
자 그럼 여기까지 검색어 부분을 분석해 보았다. 그럼 변경할 문자열을 분석해 보자.
\3\2\1
이것은 검색어 \1\2\3 의 순서만 바꾼 것이다.
자 그럼 해당 줄 별로 변수에 들어간 내용을 표로 그려보면
내용 |
\3 |
\2 |
\1 |
\3\2\1 |
height 150 weight 60 age 20 |
hegit weight age |
" " " " " " |
150 60 20 |
150 height 60 weight 20 age |
끝으로 바꾸기 명령과 같이 쓰일 수 있는 옵션을 하나 더 알아보도록 하겠다.
지 금까지는 바꾸기 명령은 구간내의 모든 검색 결과에 대해 바꾸기를 수행하였다. 물론 모든 검색 결과를 바꾸는 경우라면 문제가 없겠지만, 그 중에 변경하지 않아야 할 내용이 있다면 선택적으로 바꾸기를 행하고 싶을 수도 있을 것이다. 검색 결과에 대해 일일이 변경 여부를 물어보면 선택적으로 변경할 수 있는 옵션이 있다.

:1,$ s/.../..../gc
바꾸기 명령에 'c' 옵션을 추가하면 변경전 하나한 확인한 후 바꾸기를 실시하게 된다.
2 회차에서는 편집에 꼭 필요한 검색 및 바꾸기를 해보았다. 정규표현식의 경우 어렵게 느껴졌을 수도 있겠지만, vim 뿐만 아니라 다른 프로그램에서도 활용될 수 있기 때문에 당장 이해가 되지 않더라도 꾸준히 연습할 가치가 있을 것이다.
[출처] [본문스크랩] VIM 강좌 - 검색 및 정규표현식|작성자 히트
지금까지 배워온 vi 에디터, 이미 다른 편집기에 손이 익은 사람이라면 쉽지 만은 않았을 것이다. 하지만 이것만은 알아두자!
vi 에디터는 손에 익으면 익을수록 몸이 덜 고생하는 편집기이다. 지금까지 사용한 대부분의 명령어들이 화살표나 조합키를 사용하는
경우가 드물기 때문에 손가락이 온 자판을 휘젓고 다닐 필요가 없기 때문이다. 이번 차 Ю玲【??필요한 부분을 복사해서 붙여 넣을
수 있는 블록과 여러 파일을 열고 편집할 수 있는 다중창 그리고 단축키를 지정하는 방법에 대해 알아보도록 하겠다.
1. 블록 설정
이번 단원에서는 특정한 구간을 설정하여 삭제하거나 복사하는 기능을 소개하고자 한다.
1.1 붙여넣기
'x' 나 'dd' 와 같은 삭제 명령 후에 삭제된 데이터들은 완전히 없어지는 것이 아니라 vim의 메모리에 저장되어 있어 원하는 위치로 커서를 이동시킨 후 붙여 넣기를 할 수 있다.
삭
제된 문자나 줄을 붙여 넣을 수 있는 명령은 'p' 이다. 다음은 'p' 명령으로 삭제된 데어터를 붙어 넣는 장면이다. 먼저
please 의 첫 문자에 커서가 놓인 상태에서 3x 명령으로 'ple' 3개의 문자를 삭제하고 4j 명령으로 오른쪽으로 4
문자 이동하였다. don't 의 첫 문자에 커서가 놓여있을 때 'p' 명령을 내리면 현재 커서가 위치한 곳 다음에 삭제된
'ple' 세 문자를 붙여 넣기를 실시한 것을 알 수 있다.
'p' 명령은 삭제된 내용을 커서 다음에 붙여 넣었다. 반대로 대문자 'P' 명령은 커서 앞에 삭제된 내용을 붙여 넣는다.
삭제된 내용을 붙여넣는 것은 다른 에디터의 Cut&Paste 와 비슷한 기능이다. Cut 이 아닌 Copy&Paste를 하기 위해서는 Vim의 'Yank' 기능을 이용해야 한다.
Yank
는 'y' 명령을 이용하고 사용법은 삭제 명령인 'd' 와 비슷하다. 먼저 한 단어를 복사하기 위해서는 'yw', 한 줄을
복사하기 위해서는 'yy'를 사용한다. 물론 여러 단어 혹은 여러 줄을 복사하기 위해서는 앞에 원하는 만큼의 숫자를 적어 주면
된다.
1.2 마크
위에서 문자, 단어, 줄 단위로 Cut&Paste 및 Copy&Paste를 해보았다. 하지만 여러 줄과 단어에 걸쳐있는 구간을 원하는 대로 설정하기 위해서는 vi의 마크 기능을 이용해야 한다.
마
크란 a~z 사이 임의의 한 문자에 현재의 위치를 기억시키는 것이다. 매크로에서 알파벳 a~z 중 한 문자를 지정했던 것을
떠올리면 이해하기가 쉬울 것이다. 마크를 사용하는 방법은 기억시키고 싶은 위치에 커서를 옮긴 후, 먼저 ‘m’을 누른 후 a~z
임의의 알파벳 하나를 누르면 된다. 만약 'a' 라는 문자에 현재의 위치를 기억시키고자 하면 'ma'를 연달아 입력하면 된다.
알파벳에 위치를 기억시키기 때문에 총 26 곳의 위치를 저장할 수 있다. 그리고 일단 'a' 라는 문자에 위치를 기억시킨 후
커서를 다른 곳으로 옮긴 상태에서
`a(작은 따옴표가 아니라 숫자 ‘1’ 왼쪽에 있는 키)
를 누르면 a 가 기억하고 있던 위치로 커서가 옮겨진다.
그럼 마크를 이용하여 다음 구간을 Cut&Paste 해보도록 하자.
Cut&Paste 할 영역
먼
저 삭제하고자 하는 곳의 시작 위치로 커서를 이동한 후 'ma'를 누른다. 그리고 삭제하고자 하는 곳의 끝 위치로 이동한 후
'd`a'를 누르면 원하는 구간의 내용이 삭제 될 것이다. 이제 붙여넣기 하고자 하는 쪽으로 커서를 옮긴 후 'p' 명령을
내려주면 된다.
이
번에는 마크를 이용하여 Copy&Paste를 해보자. 삭제할 때와 똑같이 시작 위치에서 'ma'를 누른다. 이제 끝
위치로 이동하여 'y`a'를 누른다. 삭제 때와 달라진 것은 d 가 y 로 변한 것 밖에 없다. 끝으로 원하는 위치에 가서
'p' 명령을 내리면 된다.
1.3 Visual Mode
vim은 다른 vi
에디터와 달리 Visual Mode 라는 것이 있다. 마크를 사용한 블록 설정은 설정한 구간에 시각적인 효과를 주지 않기 때문에
간혹 구간 설정이 제대로 되었는지 모르는 경우가 있다. Visual Mode 는 바로 Visual Block 으로 구간에
시각적인 효과를 준다.
Visual
Block을 생성하는 방법은 간단하다. "Normal Mode"에서 'v' 명령을 내리면 바로 "Visual Mode" 로
들어간다. 구간 설정을 위해 Visual Mode 로 들어가려면 먼저 블록을 잡고 싶은 시작 위치로 가서 'v'를 입력한다.
그러면 바로 Visual Mode 로 들어가게 되는데, 이때 커서를 블록의 끝 위치로 이동시키기만 하면 Visual Block
이 완성된다. 블록이 생성된 상태에서는 삭제나 복사를 할 수 있다. Visual Block 이 생성된 Visual Mode
상태에서 구간을 삭제하고 싶다면 'd' 나 'x'를 누르면 구간내의 내용이 사라지고 바로 "Normal Mode" 로 상태가
바뀌게 된다. 만약 Visual Block 이 생성된 Visual Mode 상태에서 구간을 복사하고 싶다면 'y'를 누르면
된다. 이제 남은 일은 붙여넣기를 하고 싶은 위치로 커서를 이동 시킨 후 'p' 명령만 내려주면 된다.
"Visual Mode"를 빠져나가 "Normal Mode" 로 돌아가기 위해서는 다른 Mode 와 마찬가지로 를 누르면 된다.
“Visual Mode”를 사용하면 블록 내에 있는 모든 문자의 대소문자를 변경 시킬 수 도 있다.
Visual Block을 이용한 대소문자 변경
먼저 원하는 구간을 Visual Block 으로 잡은 뒤 대소문자 변경 명령인 '~' 명령만 내려주면 된다.
2. 여러 파일 편집
문서를 편집하다 보면 다른 파일로부터 내용을 발췌하는 일이 빈번하다. 이 때 파일 여러 개를 동시에 열어두고 편집하면, 다른 파일로부터 내용을 복사해 현재 편집중인 파일에 붙여 넣기가 편할 것이다.
파일을 동시에 여러 개 열고 싶다면, 단지 vim을 실행할 때 원하는 파일들의 이름을 인자로 넘겨주면 된다.
$ vim test.txt test2.txt
2.1 편집 파일 변경
$
vim test.txt test2.txt 처럼 vim을 실행할 때 2개 이상의 파일을 열게 되면 일단 첫 번째 파일인
test.txt 가 화면에 나타나게 된다. 두 번째 파일을 편집하기 위해서는 현재 편집 중인 파일을 :w 로 저장한 후
:next 명령을 내리면 된다. 만약 저장하지 않고 다음 파일을 편집하려 하면
위
와 같이 변경된 후 저장하지 않았다는 에러 메시지를 출력한다. 위의 메시지에서도 알 수 있듯이 만약 저장하지 않고 다음 파일로
넘어가고 싶다면 :next! 와 같이 !를 추가하면 된다. 저장과 다음 파일로 전환을 동시에 할 수도 있다. :wnext 명령은
현재 파일이 변경되었으면 저장한 후 다음 파일을 편집할 수 있도록 한다.
계속해서 :next 명령으로 다음 파일로
넘어가다 마지막 파일까지 오게 되면 더 이상 :next 로 이동할 수 없게 된다. 이전 파일로 가는 명령은 :Next 혹은
:prev 이다. 비슷하게 저장하고 이전 파일로 가기 위해서는 :wprev 혹은 :wNext 명령을 내리면 된다.
현재 파일에서 다음 파일로 넘어가기 위해서는 미리 저장을 하거나 :wprev, :wnext 같은 명령을 써야만 했다.
하지만
:set autowrite
명령을 내려주면 :next 나 :prev 로 파일을 전환할 때 자동으로 파일을 저장해 준다. 자동 저장 기능을 해제하기 위해서는
:set noautowrite
명령을 내려주면 된다.
이렇듯 파일 사이를 전환하다 현재 무슨 파일을 편집하고 있는지 알기 위해서는
:args
명령을 사용한다.
:next 나 :prev 는 vim을 기동할 때 나열했던 파일의 순서대로 편집 위치를 이동시킨다. 나열했던 파일들 하나씩 하나씩 이동하지 않고 처음 파일 혹은 나중 파일로 한번에 이동하기 위해서는
:rewind
:last
명령을 사용하면 된다. :rewind 는 처음 파일, :last 는 마지막 파일로 이동을 시킨다.
이
런 방법 외에도 다음 Ctrl-^를 사용 할 수 있다. 다음 그림처럼 one.c two.c three.c four.c 총 네
개의 파일을 열 경우 첫 번째 파일로 바로 가기 위해서는 1Ctrl-^, 두 번째 파일로 바로 가기 위해서는 2 Ctrl-^
명령을 내리면 된다. 그리고 이전 파일로 가기 위해서는 숫자 없이 Ctrl-^ 명령만 내려주면 된다.
2. split
지금까지는 한꺼번에 여러 개의 파일을 열 수 있었지만 실질적인 편집은 한 창에 한 파일 씩 진행하였다. 만약 한 창에 여러 개의 파일을 동시에 열어 놓고 편집하고 싶다면 창을 분할해야 한다.
창을 분할하기 위해서는
:split
명령을 사용한다. :split 으로 창을 분할하면 다음과 같이 가로로 창이 나뉘어 진다.
:split 으로 창 나누기
단순히 :split 명령만 내리면 위와 같이 같은 파일을 분할 된 두 창 모두에서 편집하게 된다. 분할과 동시에 새로운 파일을 열고자 한다면
:split 파일이름
과 같이 파일이름을 동시에 적어주거나 이미 :split 으로 분할이 된 상태라면
:e 파일이름
명령으로 새로운 파일을 불러오면 된다.
위와 같이 창이 분할 된 상태에서 다른 창으로 이동 하기 위해서는
Ctrl-ww (Control 키를 누른 상태에서 w를 두 번 입력한다.) 명령을 내리면 된다.
창을 위와 같이 수평으로 나눌 수도 있지만 다음 명령으로 수직으로 나눌 수도 있다.
:vsplit
:vsplit 파일이름
split 앞에 v를 붙여주면 수직으로 창을 분할한다. 이미 분할 된 창에서도 :split 이나 :vsplit 으로 얼마든지 창을 더 분할 할 수 있다.
다음 그림은 :split 으로 분할된 창을 다시 :vsplit을 이용하여 위아래 창 모두 수직으로 분할한 모습니다.
창을 총 4등분한 모습
물
론 창이 아무리 많이 분할되더라도 창과 창 사이는 Ctrl-ww 명령으로 이동 할 수 있다. 만일 창이 굉장히 많이 열려있다면
(물론 이렇게 많은 창을 열고 편집하는 사람은 없을 것이다.), 창 하나하나를 Ctrl-ww 명령으로 이동하는 것이 무척 지루한
작업 일 수도 있다. 이때
Ctrl-wh, Ctrl-wj, Ctrl-wk, Ctrl-wl (Ctrl-w 와 방향을 나타내는 h,j,k,l 키를 조합한 것이다.)
명령을 사용하면 상,하,좌,우 원하는 방향으로 창을 이동할 수 있다.
창을 닫는 명령은 간단하다. 우리가 흔히 아는 방법인 :q, :q! 로 커서가 위치한 창을 닫을 수도 있고
Ctrl-Wc
명령으로 창을 닫을 수 있다.
3. 단축 과 Key Mapping
3.1 단축
편
집을 하다보면 같은 단어가 반복되는 경우가 많다. 그런데 그 단어라는 것이 매우 길거나 익숙하지 않은 특수 문자가 섞여 있다면
반복되는 지루한 작업에 염증을 느끼게 될 것이다. 이러한 단어들이 편집자의 생각대로 자동으로 타이핑이 된다면 몸과 마음이 얼마나
편하겠는가? vi 는 자주 반복되는 단어를 짧은 몇 개의 문자에 등록 한 후 자동으로 단어가 완성 되는 단축 기능을 제공한다.
단축 기능의 사용법은 다음과 같다.
:abbreviate va variables
위에서 "va" 는 단축어이고 "variables"는 완성될 단어를 뜻한다. 위와 같이 등록 한 후 "Input Mode"에서 “va” 까지만 입력한 후 , , 과 같이 단어 사이를 분리해주면 va 가 variables 로 변경된다. 만약 "var" 까지 입력하면 "variables"로 변하지 않는다.
단어뿐만 아니라 다음과 같이 공백이 있는 문장도 단축어에 등록 할 수 있다.
:abbreviate 안 안녕하세요! 여러분!!
이제 “안” 이라고 입력한 후 를 누르면 “안녕하세요! 여러분!!” 으로 변할 것이다.
지금까지 등록된 단축어를 모두 보고 싶으면 :abbreviate 라는 명령을 주면 된다.
:abbreviate
:abbreviate 결과
한가지 주의할 점은 단축 기능은 명령어에도 적용이 된다는 것이다. 우리가 자주 사용하는 명령 중 :set 명령이 있다. 만약 "set"을 단축어로 등록하면 어떻게 될까?
:abbreviate set setting
이 상태에서 우리가 :set 명령을 입력하면 아주 곤혼스러운 결과가 생길 것이다.
위와같이 명령을 내리기 위해 “:set” 까지 입력 한 후 를 누르게되면 바로 :setting 으로 바뀌기 때문에 정상적인 명령을 내릴 수 없게 된다.
물론 이와 같은 단축어를 등록하지 않는 것이 가장 최상의 방법이겠지만, 혹시라도 이런 일을 당하게 되면 다음과 같이 단축어를 삭제할 수 있다.
:unabbreviate set
명
령어가 하나 둘 늘어나면서 익히고 외우기가 무척이나 힘이 들 것이다. VIM을 위해 모든 명령을 완벽히 외울 필요는 없다.
첫부분만 알고 있어도 자동완성 기능으로 명령을 내릴 수 있기 때문이다. 이번엔 명령어를 완벽히 입력하지 말고 다음처럼 “
:a
” 만 입력한 상태에서 을 눌러보도록 하자.
:a
위 상태에서 여러 번 누르게 되면 그때마다 다음처럼 명령어가 변경되는 것을 확인 할 수 있을 것이다.
:append
:abbreviate
:abclear
...
...
만약
:ab
과 같이 미리 알고 있는 처음 문자수가 많다면 그만큼 쉽게 명령어를 찾아 낼 수가 있다.
3.2 Key Mapping
Vim 에서는 Key Mapping을 통해 여러 명령을 하나의 Key로 실행할 수 있다. 전에 언급했던 매크로와 기능상 아주 유사하지만 정의 방법과 명령 실행 방법이 약간 다르다.
Key Mapping을 정의하는 명령은 다음과 같다.
:map 명령들
를 눌렀을 때 한 행을 복사하고 붙여넣기를 할 수 있는 Key Mapping 은 다음과 같이 정의 할 수 있다.
:map yyp
위의 의 경우 키보드의 Function Key를 직접 눌러도 되고 일일이 를 문자 그대로 입력해도 된다.
Key 매핑을 해지하는 명령은 다른 명령과 비슷하게
:unmap
처럼 할 수 있고, 정의 되어 있는 map 의 리스트는
:map
명령으로 확인 할 수 있다.
4. 설정 저장하기
지
금까지 여러 명령을 실행해 보았다. 실행한 명령 중에는 현재 진행 중인 편집 뿐만 아니라 추후에도 자주 사용하게될 명령도 있을
것이다. Key Mapping 이나 단축같은 경우 좋은 예라 할 수 있을 것이다. 이러한 명령들은 다음과 같은 파일에 저장할 수
있다.
$HOME/.vimrc
$HOME/_vimrc
$HOME/.exrc
$HOME/_exrc
Vim
이 기동 될 때 위의 파일을 순서대로 검사하며 4개의 파일 중 제일 먼저 읽히는 파일의 내용만 적용하게 된다. 만약
$HOME/.vimrc 파일과 $HOME/.exrc 파일 2개가 동시에 존재한다면 $HOME/.vimrc 파일만 적용 될 것이다.
현재 편집중인 vim 의 모든 설정을 .vimrc 파일에 저장하려면
:mkvimrc 명령을
.exrc 파일에 저장하려면
:mkexrc 명령을 입력하면 된다.
만약 $HOME 디렉티리에 이미 파일이 존재한다면 저장할 수 없다. 이때는
:mkvimrc 파일이름 혹은
:mkexrc 파일이름
명령을 사용할 수 있으며, 이러한 파일은 vim 이 기동될 때 자동으로 적용되지 않기 때문에 적용하기 위해서는
:source 파일이름
명령을 사용하면 된다.
$HOME/.vimrc 나 $HOME/.exrc 파일에는 지금껏 사용해왔던 명령들이 나열될 수 있다. .vimrc 파일에 다음과 같은 명령을 나열해 주면, 기동될 때마다 자동으로 명령들이 적용 될 것이다.
:abbreviate va variables
:map yyp
:set hlsearch
:set incsearch
[출처] [본문스크랩] VIM 강좌 - 블록 설정, 다중창 및 단축키 지정|작성자 히트
리눅스 사용 용도에 대한 많은 설문 조사를 보게 되면, 개발 플랫폼에 대한 비중도 만만치 않게
나오고 있다. 물론 그만큼 대부분의 일반사용자를 끌어 들일만한 프로그램이 없다는 뜻이기도 하지만, 반대로 개발자를 위해 더 없이
좋은 환경을 가지고 있다는 의미이기도 하다. 당연한 말이겠지만 vim 은 개발자를 통해 개발되었고, 그만큼 개발자를 위해 많은
기능들이 추가되어온 편집기이다.
4.1 Syntax Highlight 먼저 Syntax highlight 기능에 대해 알아보자.
C
언어와 같은 Programming Language 에는 변수, 상수, 키워드 등 단어 하나하나에 특별한 의미가 있다. C
언어뿐만 아니라 HTML 과 같은 Mark Up Language 에도 태그별로 특별한 의미가 있다. 이렇게 특별한 의미가 있는
단어별로 다른 색이나, 역상으로 다른 효과를 주는 것을 Syntax Highlight 이라 하고, 이 기능은 다음 명령어로
활성화 시킬 수 있다.
:syntax on
Syntax highlight을 활성화 시키게 되면 C, C++, Java, HTML, XML 과 같은 언어의 특성과 문법에 맞게 미리 지정된 색상을 보여준다.
이
렇게 여러 색상을 사용하면서 텍스트 파일을 편집할 때 화면 배색이 맞지 않게 되면, 가독성도 떨어지고 눈이 쉽게 피로해지게
된다. vim 은 바탕화면이 어두운지 혹은 밝은지를 판단하여 전체적인 색상을 밝거나 어둡게 조절할 수 있다. 하지만 vim 이
배경의 밝기를 잘못 판단할 수도 있다. 다음 명령으로 vim 이 현재 터미널의 배경을 어떻게 추측하는지 알아보도록 하자.
:set background?
위와 같은 명령을 주면 현재 background 의 세팅 값을 알 수 있다. 필자의 경우 배경이 무척 어두움에도 불구하고 다음처럼 vim 은 밝은 색으로 추측하고 있다.
만약 여러분의 배경이 어둡다면 다음처럼 vim 에게 알려주면 편집하는 문자의 색을 밝게 해줄 것이다.
:set background=dark
마찬가지로 배경이 흰색처럼 밝다면 다음 명령으로 이를 지정할 수 있다.
:set background=dark
Vim
은 색상이 제대로 나오고 있는지 테스트 할 수 있는 방법을 제공하고 있다. VIM 에는 C, C++, HTML, JAVA 와
같은 다양한 언어나 형태별로 설정을 지정하는 RUNTIME 디렉토리가 있다. 이중에는 Color를 테스트 할 수 있는 파일도
있는데, 이 파일을 이용하여 색상을 테스트 해보도록 하겠다. vim을 연 상태에서 다음과 같은 명령을 입력해 보도록 하자.
:edit $VIMRUNTIME/syntax/colortest.vim
:source %
$VIMRUNTIME/syntax/colortest.vim 은 색상 테스트용 Run Time 파일이고, 그 다음 줄에서 '%' 가 가르키는 것은 이전 명령에서 첫 번째 인자를 가르킨다. 즉
:source % 는
:source $VIMRUNTIME/syntax/colortest.vim 명령과 동일하다.
vim
은 파일의 확장자를 보고 어떤 규칙을 정할지 결정을 한다. 확장자가 .html, .htm 은 HTML 문서로, .c, .h 와
같은 파일은 C 언어로 인식을 한다. C 언어의 문법에 맞게 작성한 문서라도 확장자가 없다면, C 언어에 맞게 규칙을 적용하지
않게 되는데 이런 경우
:set filetype=c
명령을 사용하게 되면 C 언어에서 사용하는 확장자가 아니더라도 C 언어의 규칙대로 Syntax Highlight를 적용할 수 있다.
4.2 들여쓰기 C 언어에서의 들여쓰기
긴
프로그램을 작성하기 위해서 가독성 높은 코딩 습관은 필수적이라 하겠다. 프로그램 코드의 가독성에 가장 중요한 요소는 바로
들여쓰기 있다. 들여쓰기는 개개인의 코딩 습관에 따라 방식이 다르지만, 위의 그림처럼 보통 함수나 조건문과 같이 새로운 블록이
생성될 때
마다
:set shiftwidth=4
현재 설정된 shift 의 크기는
:set shiftwidth?
명령으로 알 수 있다.
주로 들여쓰기는
>> : 오른쪽으로 Shift
<< : 왼쪽으로 Shift
2>> : 2줄 오른쪽으로 Shift

위 와 같이 Shift 명령으로 들여쓰기를 할 수도 있지만 Vim은 Auto Indent(자동 들여쓰기) 기능을 제공하여 더욱 편하게 코딩을 할 수 있도록 도와주고 있다. Vim 는 cindent, smartindent, autoindent 와 같은 세가지 타입의 자동 들여쓰기를 제공한다.
cindent
C, C++, Java 스타일의 자동 들여쓰기이다. 새로운 블록이 시작될 때 자동으로 인식하고 들여쓰기를 행하여 준다.
:set cindent
명령으로 cindent를 활성화 시킬 수 있다. 만약 C 나 JAVA 파일을 편집할 때 자동으로 cindent를 활성화 시키고 싶다면 다음과 같은 명령을 미리 $HOME/.vimrc 파일에 저장해 두는 것도 좋을 것이다.
:filetype on
:autocmd FileType c,cpp,java :set cindent
첫 번째 :filetype on 명령은 파일의 타입을 체크하고, 두 번째 명령은 C, C++, JAVA 파일 일 경우 cindent를 적용하게 하는 것이다.
smartindent
smartindent 는 cindent처럼 블록이 시작하면 자동으로 들여쓰기를 해주게 된다. 하지만 cindent 에서는 #define, #ifdef 와 같이 # 으로 시작하는 전처리기에 대해서 들여쓰기를 무시하고 첫 번째 칸으로 커서를 이동시켜 주는데 반해 smartindent 는 전처리기에 대해서도 동일한 들여쓰기를 행하게 된다.
smartindent 는
:set smartindent
명령으로 활성화 시킬 수 있다. smartindent 는 cindent 만큼 똑똑하지는 않지만 다음에 설명할 autoindent 보다는 똑똑한 셈이다.
autoindent
autoindent 는 단지 줄 바꿈할 때 커서를 전 줄의 시작위치에 놓아 주기만 한다. cindent 와 smartindent 가 블록이 시작할 때 마다 자동으로 들여쓰기를 해주고, 블록이 끝나면 들여쓰기를 해제해주는데 비하면 별로 하는 일이 없는 셈이다. autoindent 는 C 나 JAVA 보다는 Python 과 같은 언어에서 사용하면 좋을 것이다.
:set autoindent
명령으로 활성화 시킬 수 있다.
=%
=% 명령을 사용하면 특정 블록에 대한 들여쓰기를 자동으로 실행할 수 있다. 일단 다음 그림처럼 블록이 시작하는 위치인 ‘{’ 에 커서를 위치 시킨 후 ‘=%’ 명령을 실행해보자! 그럼 다음 그림처럼 자동으로 들여쓰기가 행해진 것을 알 수 있다.

% 는 ( ), { }, [ ] 와 같은 괄호 한쪽 끝에서 다른 한쪽 끝으로 이동하는 명령이다. =%처럼 들여쓰기에도 사용할 수 있고 다음과 같이 d% 명령으로 괄호 내의 모든 내용을 삭제 할 수도 있다.

>% 과 <%명령은 { }를 포함하여 블록내의 내용을 각각 오른쪽 및 왼쪽으로 shift 시킨다. 커서를 블록의 시작인 { 에 놓고 >%과 <%명령을 실행하면 블록의 끝인 } 까지 모든 내용을 shift 시킬 것이다. 만약 { } 은 남겨두고 내용만 옮기고 싶다면 커서를 { 에 두고 >i}혹은


만약 Visual Mode를 사용한다면 원하는 구간을 Visual Block 으로 잡고 바로 Shift 명령을 내려주면 된다.
4.3 변수, 매크로 찾기
프 로그램을 작성하다 보면 변수나 매크로를 빈번하게 정의하게 된다. 변수나 매크로가 하나 둘 늘어나다 보면 어디에 변수 정의 부분이 있는지 찾기 힘든 경우가 있다. 물론 매크로도 마찬가지로 매크로에 해당하는 값을 잊어버려 당황하는 경우가 종종 있을 것이다. vim은 비록 완벽하진 않지만, 변수나 매크로의 정의를 찾아내기 편리한 명령을 제공하고 있다.

위 의 그림에서 va_global 의 정의 부분을 알기 위해 printf() 함수 내의 va_global 에 커서를 올려 놓고 gd 명령을 내리면 최근 va_global 의 대입문으로 커서가 이동한다. gD 명령을 이용하면 위의 화살표처럼 곧장 va_global의 선언부로 커서가 이동할 것이다. 만약 hlsearch 가 세팅되어 있다면 모든 va_global 이 역상으로 표시 되고 n, N 과 같은 검색관련 명령도 적용이 가능하다.
비슷하게 [d명령은 가장 처음 매크로를 정의한 부분을 화면 하단에 보여준다.

[d 대신 ]d를 사용하면 커서 이후에서 정의를 찾게 된다. 만약 정의 내역이 없다면 아래와 같이 정의를 찾을 수 없다는 메시지가 출력된다.

[D명령은 여러번 정의 될 경우 그 리스트를 아래와 같이 보여준다.

4.4 매뉴얼 보기
프로그램을 작성하다 보면 함수에 대한 레퍼런스 매뉴얼을 참조해야 할 경우가 있다. 매뉴얼을 참조하기 위해 편집하던 Vim을 빠져나가 man 이라는 Unix 명령을 내릴 수도 있지만
Vim 에서는 더욱 간단한 방법을 제공하고 있다. 편집 도중 원하는 함수에 커서를 두고 K명령을 내리면 바로 man 페이지를 보여주게 된다. 만약 mkdir 이라는 함수에 커서를 올려 놓고 K 명령을 내리면 vim 은 자동으로 man mkdir을 실행한 후 결과를 화면에 보여주게 되는 것이다. 이러한 경우 man 페이지의 특징상 개발자 가이드가 아닌 시스템 명령어를 출력할 수도 있다. 만약 다른 매뉴얼이 아니라 개발자 매뉴얼을 보이게 하고 싶다면 그냥 K가 아닌 2K명령을 내려보기 바란다. 그러면 vim 은 내부적으로 man 2 mkdir 을 실행할 것이다.
4.5 Tag
C 나 C++ 와 같은 언어에서는 빈번하게 함수 호출이 이루어진다. 대부분의 경우 함수에 대한 설명만으로 함수에 대해 이해한 뒤 호출을 하지만, 디버그를 위해서나 여러 가지 이유로 함수의 정의 자체가 궁금할 수도 있을 것이다. 함수의 내용이 지금 편집하고 있는 파일 내에 있다면 바로 검색해서 볼 수도 있겠지만 만약 다른 파일에 있다면 다른 파일을 열어 검색해야 하는 불편함이 있을 것이다. 지금 어느 정도 조금씩 느껴갈 것이라 예상하지만, 리눅스에서는 값비싼 통합환경이 부럽지 않을 만큼 다양한 툴을 무료로 제공하고 있다. 그 중 하나 ctags 는 다양한 언어에 대한 태그 파일을 생성해주는 툴이다.
커맨드 라인에서
$ ctags *.c
라 는 명령을 내려주면 현재 디렉토리 내에 tags 라는 태그 파일을 생성해 준다. 태그파일 내에는 함수들이 어느 파일의 어느 위치에 있는지 정보가 담겨 있다고 이해하면 될 것이다. ctags 는 리눅스 배포본의 ctags 라는 이름의 패키지에 담겨 있다. ctags 는 C 언어뿐만 아니라, JAVA, C++, PHP, Fortran, List, ASP, COBOL 과 같이 널리 알려있는 대부분의 언어를 지원한다.
자 이제 vim 에서는 이 태그 파일을 어떻게 활용하는지 알아보도록 하자. 이미 ctags 명령어를 통해 tags 파일을 만들었다는 가정 하에 다음 그림처럼 addrtot() 라는 함수 위에 커서를 올려 놓은 후 Ctrl+]명령을 내려보자. Ctrl+]명령을 내리면 바로 그 함수의 정의 부분으로 화면이 전환된다.

위 의 그림을 보면 subnettot.c 라는 파일을 편집하던 도중 Ctrl+] 명령으로 addrtot.c 라는 파일로 전환된 것을 볼 수 있을 것이다. 파일이 전환된 상태에서 다시 이전 위치로 커서를 이동시키고자 한다면 Ctrl+T명령을 내리면 된다. 이전 위치로 이동한 상태에서 다시 addrtot() 함수가 있던 곳으로 커서를 이동 시키려면 :tag명령을 주고
위 의 2번째 화면에 addrtot_again() 이라는 함수를 호출하는 부분이 있다고 해보자. 그 위치에서 Ctrl+]명령을 주면 addrtot_again() 함수가 정의되어 있는 곳으로 이동하게 될 것이다. addrtot_again() 함수가 정의되어 있는 곳에서 Ctrl+T명령을 주게되면 위의 그림에서 2번째 화면으로, 다시 한번 Ctrl+T명령을 주면 첫 번째 화면으로 이동하게 된다.
Ctrl+T 명령으로 첫 화면으로 이동한 상태에서 :2tag명령을 내린 뒤
지금까지 vim 으로 검색한 태그 목록은 :tags명령으로 확인 할 수 있다.


:tag <태그> 명령을 내리면 위와 같이 함수의 정의 부분으로 편집 화면이 전환 된다. 지금까지 명령어의 변화를 감지한 독자라면 화면을 분할하며 함수의 정의 부분으로 이동하는 명령을 쉽게 눈치 챌 수 있을 것이다.

:stag <태그> 명령은 위와 같이 화면을 상하로 분할하며 함수의 정의 부분을 분할된 창에 보여준다. 이 상태에서 전 강좌에서 다룬 분할된 창에서의 명령을 모두 사용할 수 있다.
:tag <태그> 명령을 내려보다 보면 <태그> 에 해당되는 내용을 vim 이 검색한다는 것을 알 수 있다. vim을 포함한 모든 유닉스에서 정규표현식을 이용하면 검색 기능에 날개를 달 수 있다. <태그>에 정규표현식을 사용하고 싶을 때는 <태그>앞에 ‘/’를 추가해 주면 된다.
:tag /<정규표현식을 사용한 태그>
예를 들어
:tag /^addr
명 령을 내리게 되면 "addr" 이라는 문자열로 시작하는 함수의 정의 부분으로 커서가 이동하게 된다. 하지만 정규표현식을 통해 검색하게 되면 검색 결과가 하나 이상이 될 수 있다. 기본적으로 위의 명령을 내리면 addr 로 시작하는 첫 번째 함수로 이동하게 된다. 검색된 모든 태그들의 리스트는 :tselect 명령으로 볼 수 있다.
:tselect
다음은 위 명령의 결과 이다.

:tselect 명령을 실행하기 이전에 커서는 addrbytesof 함수의 정의 부분에 위치해 있었을 것이다. 위와 같은 상태에서 앞에 보이는 번호를 입력해 주면 해당하는 함수의 정의 부분으로 이동할 수 있다. vim 은 검색된 태그들 사이로 이동할 수도 있다. 현재 :tag /^addr 명령을 내린 직후 이거나 :tselect에서 1번을 선택하여 addrbytesof 함수의 정의 부분에 있다면, 이상태에서 :tnext 명령을 내려 2번째 검색 결과인 addrbytesptr 함수의 정의 부분으로 이동할 수 있다. 정규표현식으로 검색한 태그 내에서 이동하는 명령은 다음과 같다.
명령 | 설명 |
:tnext |
검색 결과의 다음 태그로 이동 |
:tprevious |
검색 결과의 이전 태그로 이동 |
:trewind |
검색 결과의 처음 태그로 이동 |
:tlast |
검색 결과의 마지막 태그로 이동 [출처] [본문스크랩] VIM 강좌 - vim 으로 폼나는 개발자가 되어보자|작성자 히트 |
'개발 > 프로그래밍(일반)' 카테고리의 다른 글
[스크랩] O_NONBLOCK 그리고 EAGAIN (0) | 2009.12.11 |
---|---|
[스크랩] find 옵션 (0) | 2009.12.03 |
[스크랩] 리눅스 네트웍 프로그래밍 gcc (0) | 2009.12.03 |
멀티 플랫폼 C개발자 (플랫폼간 의존성 없애기) (0) | 2009.12.02 |
BSD 소켓 프로그래밍(Socket Programming) 예제 (0) | 2009.12.02 |