'Computer_language/Vim'에 해당되는 글 8건
- 2009.01.12 vi edit command table
- 2009.01.12 VIM 강좌 - VIM 시작하기 [출처] VIM 강좌
- 2009.01.12 VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨
- 2009.01.12 VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌
- 2009.01.12 VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌
- 2009.01.12 Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi
- 2009.01.12 가장 많이 사용되는 vim, vi 명령어 [출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어
- 2009.01.12 1. VIM [출처] VIM|작성자 료마
a : 커서 위치 다음 칸부터 입력
i : 커서의 위치에 입력
o : 커서의 다음 행에 입력
s : 커서 위치의 한 자를 지우고 입력
이동
h : 왼쪽으로 이동
l : 오른쪽으로 이동
j : 아래 행으로 이동
k : 위 행으로 이동
w or W 다음 단어의 첫 글자로 이동
b or B: 다음 단어의 첮 글자로 이동
^ : 그 행의 첫 글자로 이동
$ : 그 행의 마지막 글자로 이동
M 커서를 화면의 중앙으로 이동
z. : 현재 행을 화면의 중앙으로 이동
gg : 문서의 맨 첫 행으로 이동
g : 문서의 맨 마지막 행으로 이동
:[n] : n 행으로 이동
삭제
x, dl : 커서 위치의 글자 삭제
dw : 한 단어를 삭제
D,d$ : 커서 위치부터 행의 끝까지 삭제
dd : 커서가 있는 행을 삭제
잘라내기
(17개의 레지스터 보유 dd로 지움과 동시에 들어감 stack 형식으로 입력)
ex모드에서 : reg 명령으로 볼 수 있다.
바로 이전에 지워 레지스터에 들어있는 내용은 p 명령으로 붙여넣기 가능
복사 yy
특정한 레지스터에 있는 내용을 붙이는 방법 -> 2번 레지스터 = 2p
블록 지정
원하는 위치에서 v를 누르고 j키로 커서를 아래로 이동시키면 블록 형성
지우기 d 복사 y
사각 블록 지정 : 컨트롤 + v
블록지정 후 탭 삽입 : >
블록지정 후 탭 제거 : <
되살리기
되돌리기 : u (명령취소)
되살리기 : 컨트롤 + r
문자열 탐색
/[문자열] 이후 n은 다음 매칭 N은 이전매칭
문자열 치환
old - > new :%s/old/new/g
문서 전체에서 제일 처음 매칭되는 행의 문자열만 치환
:s/old/new/g
2행에서 4행 사이에 매칭되는 문자열을 치환
:2,3s/old/new/g
행 범위에 아래와 같이 c를 두게 되면 매칭되는 문자열에 대해 치환할 것인지 사용자에게 물어본다.
:%s/old/new/gc
특정한 패턴이 있는 행에 대해서만 치환하게 하려면 다음과 같은 형식 사용
:[범위]/[패턴]/[매칭 문자열]/[치환 문자열]/[행 범위]
주석 부분은 수정 하지 않고 변수명 치환 :g/\(^[^#].*TEST\|TEST\)/s/TEST/STR/g
#으로 시작하지 않는 TEST 문자열과 TEST로 시작하는 문자열
'Computer_language > Vim' 카테고리의 다른 글
VIM 강좌 - VIM 시작하기 [출처] VIM 강좌 (0) | 2009.01.12 |
---|---|
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
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 |
좌, 하, 상, 우 로 한 문자씩 이동 |
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 시작하기|작성자 소룡매냨
'Computer_language > Vim' 카테고리의 다른 글
vi edit command table (0) | 2009.01.12 |
---|---|
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
이번 회에서는 vim 내에서 특정 표현을 검색하고 치환하는 방법을 배워보도록 하겠다. 좀더 복잡한 패턴의 검색을 위해서는 정규표현식이라는 것을 사용해야만 한다. 비단 vim 뿐만 아니라 많은 유틸리티에서도 사용하는 정규표현식을 어느 정도 익히게 되면 어렵게만 느껴졌던 많은 명령어들이 그만큼 친숙하게 다가올 것이다.
1. 검색
이번 장에서는 vim을 통해 검색하기 위해 다음과 같은 기본적인 내용에 다루기로 한다.
- 순방향, 역방향 검색
- 검색 옵션
1.1 순방향, 역방향 검색
일반적인 검색이란 문서의 시작 혹은 현재 위치에서 문서의 끝방향으로 검색을 해나가게 되는데 이를 순방향 검색이라 한다. 반대로 현재의 위치에서 문서의 처음 방향으로 검색을 해나갈 수도 있는데 이를 역방향 검색이라 한다. 이 두 가지 방식의 검색은 단지 종이 한 장 차이만 날뿐 복잡한 차이는 없다.
vim는 '/' 명령으로 순방향 검색을 실시한다. "Normal Mode"에서 '/'를 쳐주게 되면 다음 그림처럼 커서가 좌측하단으로 이동하면서 밑줄에 '/' 가 적히게 된다. 이 상태에서 검색하고 싶은 문자열을 적어주면 된다. 반대로 역방향 검색은 '/' 대신 '-' 로 검색 명령을 내리면 된다.

변경전 확인
/ 나 - 로 검색 명령을 내린 뒤
다음 예에서 ‘/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 이 디폴트로 세팅되어 있다면 검색어를 완벽히 입력하고
: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\ '처럼 할 수 도 있다. 하지만
/\
지금까지 배운 정규표현식을 응용하여 검색을 해보도록 하자.
반드시 줄의 시작은 알파벳 하나 이상으로 시작하고 중간에 하나 이상의 공백 문자 다음에 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/\
처럼 명령을 내릴 수 있다.
만약 정규표현식에 익숙하지 않다면 완벽한 예제를 보며 차근차근 익히기 바란다.
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 강좌 - 검색 및 정규표현식|작성자 소룡매냨
'Computer_language > Vim' 카테고리의 다른 글
vi edit command table (0) | 2009.01.12 |
---|---|
VIM 강좌 - VIM 시작하기 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
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” 까지만 입력한 후
단어뿐만 아니라 다음과 같이 공백이 있는 문장도 단축어에 등록 할 수 있다.
:abbreviate 안 안녕하세요! 여러분!!
이제 “안” 이라고 입력한 후
지금까지 등록된 단축어를 모두 보고 싶으면 :abbreviate 라는 명령을 주면 된다.
:abbreviate

:abbreviate 결과
한가지 주의할 점은 단축 기능은 명령어에도 적용이 된다는 것이다. 우리가 자주 사용하는 명령 중 :set 명령이 있다. 만약 "set"을 단축어로 등록하면 어떻게 될까?
:abbreviate set setting
이 상태에서 우리가 :set 명령을 입력하면 아주 곤혼스러운 결과가 생길 것이다.

위와같이 명령을 내리기 위해 “:set” 까지 입력 한 후
물론 이와 같은 단축어를 등록하지 않는 것이 가장 최상의 방법이겠지만, 혹시라도 이런 일을 당하게 되면 다음과 같이 단축어를 삭제할 수 있다.
:unabbreviate set
명령어가 하나 둘 늘어나면서 익히고 외우기가 무척이나 힘이 들 것이다. VIM을 위해 모든 명령을 완벽히 외울 필요는 없다. 첫부분만 알고 있어도 자동완성 기능으로 명령을 내릴 수 있기 때문이다. 이번엔 명령어를 완벽히 입력하지 말고 다음처럼 “
:a
” 만 입력한 상태에서
:a
위 상태에서
:append
:abbreviate
:abclear
...
...
만약
:ab
과 같이 미리 알고 있는 처음 문자수가 많다면 그만큼 쉽게 명령어를 찾아 낼 수가 있다.
3.2 Key Mapping
Vim 에서는 Key Mapping을 통해 여러 명령을 하나의 Key로 실행할 수 있다. 전에 언급했던 매크로와 기능상 아주 유사하지만 정의 방법과 명령 실행 방법이 약간 다르다.
Key Mapping을 정의하는 명령은 다음과 같다.
:map
:map
위의
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
:set hlsearch
:set incsearch
[출처] VIM 강좌 - 블록 설정, 다중창 및 단축키 지정|작성자 소룡매냨
'Computer_language > Vim' 카테고리의 다른 글
VIM 강좌 - VIM 시작하기 [출처] VIM 강좌 (0) | 2009.01.12 |
---|---|
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
가장 많이 사용되는 vim, vi 명령어 [출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자
![]() ![]() 2004/12/03 11:17
|
리눅스 사용 용도에 대한 많은 설문 조사를 보게 되면, 개발 플랫폼에 대한 비중도 만만치 않게 나오고 있다. 물론 그만큼 대부분의 일반사용자를 끌어 들일만한 프로그램이 없다는 뜻이기도 하지만, 반대로 개발자를 위해 더 없이 좋은 환경을 가지고 있다는 의미이기도 하다. 당연한 말이겠지만 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 함수의 정의 부분으로 이동할 수 있다. 정규표현식으로 검색한 태그 내에서 이동하는 명령은 다음과 같다.
|
[출처] VIM 강좌 - vim 으로 폼나는 개발자가 되어보자|작성자 소룡매냨
'Computer_language > Vim' 카테고리의 다른 글
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
---|---|
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
가장 많이 사용되는 vim, vi 명령어 [출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어 (0) | 2009.01.12 |
1. VIM [출처] VIM|작성자 료마 (0) | 2009.01.12 |
================================================================================================ 정규표현식 =======================================================================================================================
^ : 행의 첫 문자([] 안에서는 not의 의미)
. : 아무 문자나 한 문자 의미
[] : []사이의 문자 중 하나
* : 앞의 내용이 0번 이상 반복됨
\< : 단어의 시작
\n : 새 행 문자
$ : 행의 끝
\| : or의 의미
\+ : 앞의 내용이 1번 이상 반복됨
\> : 단어의 끝
\t : 탭 문자
\{min,max\} : min이상 max이하 반복됨
[a-z]\+
: a부터 z까지의 한 글자가 한번 이상 반복되는 것(소문자로 이루어진 단어)
[a-z]\+[0-9]\+ 또는 [a-z]\+[0123456789]\+
: 소문자가 앞에오고, 뒤에 숫자가 있는단어 'like0101', 'korea117'
OK\ [a-z]\+[0-9]*
: "OK "(OK와 공백)가 앞에오고 a부터 z중 한글자가 한번 이상 반복되고 0부터 9사이 문자가 0번이상 반복되는 단어.
^[0-9]\+.*
: 행의 첫문자가 0~9까지중의 숫자가 한번이상 있고, \n을 제외한 아무글자가 0번이상 반복되는 단어.
^[^0-9]\+.*
: 위와 같지만 행의 첫문자가 0~9가 아니란 의미이다.([]안에 있는 ^는 not의 의미)
.*[0-9]$
: \n을 제외한 문자가 0번이상 반복되고 끝이 숫자로 끝나는 문자열.
\<KO
: 단어의 첫글자가 "KO"로 시작하는 단어.
KO\>
: 단어의 끝자라가 "KO"로 끝나는 단어.
[A-z]\+[0-9]\{3,4\}
: 영문자로 시작하고, 3자리에서 4자리 숫자로 끝나는 문자열.(끝은 숫자인데, 숫자가 3~4개는 되어야 한다는 의미)
\(K\|k\)orea
: Korea 혹은 korea.(첫글자 k가 소문자 혹은 대문자란 의미)
========================================================================================
================= POSIX 문자 클래스 ============================================================================================================================================
[:alnum:] : 알파벳과 숫자 [A-Za-z0-9]
[:alpha:] : 알파벳 [A-Za-z]
[:cntrl:] : 제어 문자
[:blank:] : 탭과 공백 문자
[:digit:] : 숫자 [0-9]
[:graph:] : 제어 문자와 공백 문자를 제외한 문자
[:lower:] : 소문자 [a-z]
[:upper:] : 대문자 [A-Z]
[:print:] : 제어 문자를 제외한 문자. 즉 프린터 할 수 있는 문자
[:punct:] : [:graph:] 문자 중 [:alnum:]을 제외한 문자. ex_ !, @, #, $, %, ^...
[:space:] : 화이트 스페이스 ex_ 공백, 탭, 캐리지 리턴, 새 행, 수직 탭, 폼 필드
[:xdigit:] : 16진수
1. Vim에서 POSIX 문자 클래스를 사용할 때는 대괄호를 두개 사용해야 한다.
2. 정규 표현식은 셸 명령어인 grep에서도 사용할 수 있다.
[[:lower]]\+
: 소문자로 이루어진 문자열
정규표현식 - int \(\ \|\t|\n)\+var; , POSIX 클래스 - int[[:space:]]\+var;
: "int var;" 표현식
int[[:space:]]\+myfunc[[:space:]]*(.*)[[:space:]]*{
: int + 공백이 한번이상반복 + myfunc + 공백이 0번이상반복 + ( + 어떤문자던지 0번이상 반복 + ) + 공백이 0번이상 반복 + {
: int myfunc(void) 이라는 함수를 찾을때.
: grep 에서 사용 예)
- grep "int[[:space:]]\+myfunc[[:space:]]*(.*)[[:space:]]*{" ./ -Rlz
============================================================================================ 정규표현식(Vim 확장 정규표현식) =======================================================================================================
\i(소문자 아이) : 변수 지정에 사용되는 문자들 [_0-9A-Za-z]
\I(대문자 아이) : \i와 같지만 숫자는 제외
\k : keyword로 사용되는 문자 [_\.\-0-9A-Za-z>]
\K : \k와 같지만 숫자는 제외
\f : 파일 이름으로 사용하는 문자
\F : \f와 같지만 수자는 제외
\p : 프린트 가능한 문자
\P : \p와 같지만 숫자는 제외
\s : whitespace character (공백과 Tab)
\S : non-whitespace character
\d : 숫자 [0-9]
\D : 숫자가 아닌 문자[^0-9]
\x : 16진수 숫자 [0-9A-Fa-f]
\X : 16진수 숫자가 아닌 문자 [^0-9A-Fa-f]
\o : 8진수 숫자 [0-7]
\O : 8진수 숫자가 아닌 문자 [^0-7]
\w : 영문 단어에서 사용되는 문자 [0-9A-Za-z]
\W : 영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z]
\h : 영문 단어의 시작에 사용되는 문자 [A-Za-z]
\H : 영문 단어의 시작에 사용되지 않는 문자 [^A-Za-z]
\a : 모든 알파벳 [A-Za-z]
\A : 알파벳이 아닌 문자 [^A-Za-z]
\l(소문자 엘) : 소문자 [a-z]
\L(대문자 엘) : 소문자가 아닌 문자 [^a-z]
\u : 대문자 [A-Z]
\U : 대문자가 아닌 문자 [^A-Z]
\e : Esc
\t : Tab
\r : CR
\b : Back Space
\n : LF
1. 대문자로 이루어진 단어
정규표현식 : \<[A-Z]\+\>
POSIX 문자클래식 : \<[[:upper:]]\+\>
Vim 확장 정규 표현식 : \<\u\+\>
2. "int myfunc(void) {"를 찾을때
POSIX 문자클래식 : int[[:space:]]\+myfunc[[:space:]]*(.*)[[:space:]]*{
Vim 확장 정규 표현식 : int\s\+myfunc\s*(.*)\s*{
[출처] Vim - 정규표현식|작성자 atlacpi
'Computer_language > Vim' 카테고리의 다른 글
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
---|---|
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
가장 많이 사용되는 vim, vi 명령어 [출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어 (0) | 2009.01.12 |
1. VIM [출처] VIM|작성자 료마 (0) | 2009.01.12 |
가장 많이 사용되는 vim, vi 명령어 [출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어
| Computer_language/Vim 2009. 1. 12. 00:55가장 많이 사용되는 vim, vi 명령어
여기에 작성된 vim, vi명령어는 가장 많이 사용되는 명령어만을 모아놨으며 자세한 사항은 다른 참고서를 참조하시기 바람니다.
vim의 모드 이해
vim에 대해서 이해하고자 한다면 먼저 vim의 여러 가지 모드에 대해서 이해해야 한다. vim은 3가지 모드를 가지고 있는데 명령모드, 입력모드, ex모드가 바로 그것이다.
*명령모드
명령모드는 키 입력을 통해 vim에 명령을 내리는 모드다. 명령모드에서 커서를 이동하거나, 삭제, 복사, 붙이기 등의 작업을 수행할 수 있다. 이 명령모드 때문에 대부분 처음 vim을 접하는 사람들은 생소함을 느낀다. 왜냐하면 vim을 실행하면 명령모드부터 시작하는데 명령모드에서는 아무리 타이핑해도 글자가 입력되지 않기 때문이다. 명령모드는 vim에게 명령을 내리기 위한 모드지 편집을 위한 모드가 아니라는 것을 기억하기 바란다.
*입력모드
입력모드는 실제로 문서를 편집하기 위한 모드다. 입력모드에서 글자를 타이핑하게 되면 실제로 화면에 출력되면서 글자의 입력이 가능하게 된다. 다시 한번 강조한다. vim은 명령모드와 입력모드가 있는데 명령모드는 키 입력으로 삭제, 복사, 붙이기 등의 작업을 수행하는 모드고 입력모드가 실제로 문서를 타이핑하여 편집하기 위한 모드라는 것을 기억하기 바란다. vim은 일반 에디터와 틀리게 명령모드와 입력모드가 분리되어 있다. 이러한 특징을 이해하지 못하고 접근하면 vim은 낯설고 이해하기 힘든 에디터가 된다.
*ex모드
ex모드는 라인 에디터의 ex에디터의 기능을 사용하는 모드다. vim은 ex 에디터를 기반으로 만들어진 에디터다. 그래서 ex 에디터의 기능을 그대로 사용할 수 있다. ex모드를 사용하면 특정 패턴들을 특정 문자열로 대체한다는 것과 같이 일괄적으로 처리해야 할 작업에 매우 효율적이다. 그리고 ex모드에서 ex 라인에디터의 기능만 구현되어 있는 것이 아니다. vim을 더욱 강력하게 하는 많은 기능들이 숨어있는 모드가 바로 ex모드다.
각 모드의 전환은 위 그림과 같다. vim을 처음 실행시키면 명령모드에서부터 시작한다. 명령모드에서 i,a,o,s 중 한 키를 누르면 편집이 가능한 입력모드로 전환된다.
입력모드에서 복사, 붙이기 등과 같은 작업을 수행하기 위해서는 명령모드로 다시 전환해야 한다. 입력모드에서 명령모드로의 전환은 Esc 키를 누르면 된다. 그림에서 보는 바와 같이 입력모드에서 ex모드로 바로 전환하는 것은 불가능하다. 일단 명령도드로 전환한 후 ex모드로 전환해야 한다. 명령 모드에서 ex모드로 전환하기 위해서는 :,/.? 키 중 한 키를 누르게 되면 전환하게 된다. : 키는 ex 편집기 명령과 vi의 ex모드 명령을 입력할 때 사용하고 /,? 는 특정한 패턴을 찾을 때 사용한다. / zlfmf 누른 후 찾고자 하는 패턴을 입력하면 패턴이 나오는 곳으로 커서가 이동한다. /는 정방향 탐색이고 ?는 역방향 탐색을 할 때 이요된다.
파일 열기, 저장 종료
$ vim hello.c
리눅스 셸 프롬프트 상에서 위 명령을 내리면 vim이 실행된다. ‘$’는 셸 프롬프트를 의미한다. 실행시 기존에 hello.c 파일이 존재한다면 hello.c파일이 열게 되고 hello.c 파일이 존재하지 않는다면 새로 생성하게 된다.
텍스트 입력이 끝나면 Esc 키를 눌러 입력모드에서 명령모드로 전환한다.
hello.c파일에 저장하기 위해서는 Esc키를 누르고 : 키를 눌러 ex모드로 전환하여 w 키를 누르고 Enter를 치면 된다.
종료는 명령모드에서 : 키를 눌러 일단 ex모드로 전환하고 q 키를 누르게 되면 종료하게 된다.
일반적으로 저장 후 종료하는 것은 ex모드에서 다음과 같은 형식으로 사용한다.
:wq!
wq는 저장 후 종료를 의미하고 !는 강제 저장, 종료를 의미한다.
저장 및 종료
명령어 |
설명 |
:w |
저장 |
:w file.txt |
file.txt 파일로 저장 |
:w >> file.txt |
file.txt파일에 덧붙여서 저장 |
:q |
vi종료(저장이 안됐을시 경고) |
:q! |
vi강제 종료(경고 무시) |
:wq! |
강제 저장 후 종료 |
:e file.txt |
file.txt파일을 불러옴 |
:e |
현재 파일을 불러옴 |
입력모드 전환
명령어 |
설명 |
a |
커서위치 다음 칸부터 입력 |
i |
커서의 위치에 입력 |
o |
커서의 다음 행에 입력 |
s |
커서 위치의 한 글자를 지우고 입력 |
이동
명령어 |
설명 |
h |
왼쪽으로 이동 |
l |
오른쪽으로 이동 |
j |
아래 행으로 이동 |
k |
위 행으로 이동 |
w |
다음 단어의 첫 글자로 이동 |
b |
이전 단어의 첫 글자로 이동 |
^ |
그 행의 첫 글자로 이동 Home키와 동일 |
$ |
그 행의 마지막 글자로 이동 End키와 동일 |
gg |
문서의 맨 첫 행으로 이동 |
G |
문서의 맨 마지막 행으로 이동 |
:n |
n행으로 이동 (여기서 n은 숫자임) |
삭제
명령어 |
설명 |
x |
커서 위치의 글자 삭제 |
dw |
한 단어를 삭제 |
dd |
커서가 있는 행을 삭제 |
복사 & 붙이기
명령어 |
설명 |
yy |
커서가 위치한 한 행 복사 |
p |
붙여넣기 |
Nyy |
N행만큼 복사 (N은 숫자임) |
Np |
N번만큼 붙여넣기 (N은 숫지임) |
블록 지정 관련
명령어 |
설명 |
v |
블록 지정 (v를 누른후 h j k l을 통해 블록 지정) |
y |
복사 |
d |
잘라내기 |
U |
대문자로 만듬 |
u |
소문자로 만듬 |
문자열 탐색 및 치환
명령어 |
설명 |
/문자열 |
문자열을 탐색 |
:%s/old/new/g |
문서 전체에서 old를 new로 교체 |
파일 버퍼 관련 명령 요약
명령어 |
설명 |
:ls |
버퍼의 내용을 나열 |
:bN |
N번 버퍼로 이동(N은 숫자임) |
:bwN |
N번 버퍼를 완전 삭제(N은 숫자며, 없으면 현재의 버퍼삭제) |
*여러 파일을 편집하는 방법
$vi file1.c file2.c file.3c 또는 vi *.c
버퍼 1에 file1.c가 들어가고 버퍼 2,3에 각각 file2.c file3.c가 들어가며
vim 명령어 모드에서 :b2를 입력하면 file2.c가 열리게 된다.
마킹 및 마킹한 위치로 이동
명령어 |
설명 |
ma |
a로 마킹, mb는 b로 마킹 |
‘a |
a로 마킹된 위치로 돌아감 ‘c는 c로 마킹된 위치로 돌아감 |
[출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어
'Computer_language > Vim' 카테고리의 다른 글
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
---|---|
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
1. VIM [출처] VIM|작성자 료마 (0) | 2009.01.12 |
1. VIM
VIM은 Vi IMproved의 약어입니다. 텍스트 편집기로서 유닉스에 있는 'vi'의 대부분의 명령을 지원하며, Vi IMproved가 말해주듯이 많은 새로운 명령들이 추가되었습니다.
1988년 Stevie라는 vi clone 에디터를 Bram (VIM 주 개발자)이 Amiga에 VIM (당시에는 Vi IMitation)이라는 이름으로 포팅하면서 시작되었습니다. IMitation (모방)에서 알 수 있듯이 당시 Amiga 시스템에는 쓸만한 vi가 없었기 때문에 vi의 대부분의 기능을 지원하는 에디터를 Amiga 시스템에서 사용하고자 한 것이 그 출발이었으나, 이후 새로운 기능들이 추가되고, 1992년에 유닉스 시스템으로 포팅하면서 향상된 기능들을 표현하기 위해 Vi IMproved로 바뀌게 되었습니다. 이후 multiple windows (VIM 3.0), GUI (VIM 4.0), Syntax highlighting (Vim 5.0), Folding and multi-languages (VIM 6.0) 등의 굵직굵직한 기능들과 더불어 수많은 기능들이 추가되었으며, VIM의 향상된 기능에 매료된 많은 프로그래머들에 의해 수많은 시스템으로의 포팅이 이루어지게 되었던 것입니다.
확장된 기능들을 열거하면 많은 OS를 지원한다는 것(Amiga, BeOS, Mac, MiNT, MSDOS, Windows 3.1, Windows 95/98/NT, OS/2, Unix, VMS)과 Multi level undo, GUI (Graphical User Interface), Multiple Windows and buffers, Syntax highlighting, Repeat a series of commands, Visual mode, Flexible insert mode, Block operators, Online help system, Command-line editing and history, Command-line completion, Insert-mode completion, Long line support, Text formatting, ... 등등 이루 헤아릴 수 없이 많습니다. 자세한 내용은 vim을 실행후 ':help vim-additions'를 입력해 보시기 바랍니다.
이러한 많은 확장된 기능에도 불구하고 원하신다면 VIM을 vi 호환 모드로 실행하실 수 있습니다. 그 경우 VIM은 가능한한 vi와 거의 유사하게 동작합니다. vi의 버그조차도 그대로 구현합니다.
한글 입출력도 잘 지원합니다. Console version의 경우 hanterm, Eterm (XIM) 등을 이용하여 한글 입력이 가능하고, GUI 버전의 경우에는 자체 한글 입력 기능이 있으며, XIM을 사용하여 한글을 입력하실 수도 있습니다. Linux의 경우 현재 ami, HanIM등의 XIM을 사용할 수 있는 데, 이 경우 한자, 특수문자, 일본어 등도 입력할 수 있으므로 자체 한글 입력 기능보다는 XIM을 이용하시라고 권하고 싶습니다.
2. 빔 대표적인 기능들
vi와 99.9% 호환 모드 지원
VIM을 vi처럼 사용하고자 하는 사용자를 위한 모드로서 vi의 버그조차도 그대로 흉내를 냅니다.
다단계 반복(redo)/취소(undo) 기능
다수의 화면분할 및 버퍼 기능
화면분할은 수직/수평 모두 가능
비주얼 모드 지원
텍스트를 비주얼하게 선택하여 복사나 삭제 등 여러 가지 작업을 수행할 수 있으며, 사각형 형태로 선택할 수도 있습니다.
명령행 라인의 편집 및 이력(history) 기능
이전에 입력했던 명령을 불러와서 편집 및 재실행할 수 있다.
명령행 라인 완성(completion) 기능
명령어나 파일명 등을 일부만 입력한 후에 자동으로 완성시키는 기능
텍스트 형식화(formatting)
주어진 옵션에 따라 텍스트 혹은 프로그램 소스 코드/코멘트 등의 형식을 자동으로 바꿀 수 있다.
입력모드에서의 단어/라인 완성 기능
단어 혹은 라인의 일부만 입력한 후에 현재 파일이나 태그 파일 혹은 사전 파일등에서 단어/라인을 찾아서 자동으로 완성시킬 수 있다.
자동명령: 파일명 혹은 이벤트에 따라 명령 실행
특정 파일을 열 때 혹은 특정 이벤트 발생시 자동으로 원하는 명령을 실행할 수 있다.
그래픽 사용자 인터페이스
메뉴, 도구막대, 대화상자 등
매크로 기록 기능
반복적인 작업이 필요한 경우 작업을 한 번 수행하면서 그 내용을 기록하여 간단하게 해당 작업을 반복할 수 있다.
서로 다른 많은 시스템에서 동일한 기능/환경 제공
확장된 내장 스크립트 언어 제공
태그 기능을 이용한 온라인 매뉴얼
한글을 포함한 여러 언어 지원
1바이트를 사용하는 영어, 유럽의 여러 가지 언어등과 여러 바이트를 사용하는 한글, 중국어, 일본어 등을 지원하며, 심지어는 오른쪽에서 왼쪽으로 입력을 해나가는 히브리어 같은 언어도 지원한다.
플러그인 기능
explorer 기능이나 network을 통한 파일 편집 등을 이 플러그인 기능을 이용하고 있다.
폴딩 기능
소스코드/문서의 일부분을 접거나 펴서 작업을 할 수 있으므로 한 화면에서 전체 구조를 보면서 작업이 가능
함수, 변수 등을 여러 소스코드에서 찾는 기능
200 가지 이상의 언어에 대한 문법 강조 (syntax highlighting) 기능
빠른 보완(quickfix) 모드
소스코드의 편집-컴파일-수정 단계를 빠르게 진행할 수 있음
많은 언어에 대한 자동 들여쓰기 (auto-indenting) 기능
기타 모두 다 열거할 수 없을 정도의 수많은 기능들
3. VIM 시작
당신이 vim을 처음 사용해 보신다면 일단 vim을 실행시켜보십시오. 초기화면을 보실 수 있을 것이고 거기에는 Vim의 버전, 종료하는 방법, 온라인 도움말을 보는 방법 등이 보일 것입니다. 이제 ':help'를 입력해 보시기 바랍니다. 따옴표 사이의 :help 입력 후 ENTER key를 누르시면 되겠습니다. hklj 키들에 대한 도움말, 창을 닫는 법, Vim을 종료하는 법등이 영어로 쓰여진 도움말 화면이 뜰 것입니다. 영어에 익숙치 않으시더라도 끈기를 가지고 읽어보시기 바랍니다. 어느덧 무리없이 도움말 페이지를 보고 있는 자기자신을 발견하실 수 있게 될 것입니다.
도움말 페이지는 초보자가 보기에는 너무 어려울 수 있습니다. Vim은 초보자를 위해 훌륭한 프로그램을 포함하고 있는 데, 그것은 'vimtutor'라는 초보자 교육 프로그램입니다. 일단 'vimtutor'를 실행한 후 한 문장 한 문장 읽어가면서 그대로 따라해 보시기 바랍니다. 그러면 당신은 Vim을 사용하여 텍스트 파일을 열어서 문자열를 삽입하거나 지우거나 수정한 후 그 바뀐 내용을 저장할 수 있는 기본적인 능력을 가지게 될 것입니다.
4. 빔 기능
TAG 기능
PATH 기능
치환 (substitute)
찾기 (grep/quickfix/search)
filetype과 auto command
파일이름 수정 (filename modifier)
match pair
반복 작업 (multiple repeat)
script (command line)
4.1 TAG 기능
VIM에서 <F1> 혹은 ':help<CR>'을 입력해 보셨습니까? VIM의 도움말은 바로 이 tag 기능으로 구현되어 있습니다. 물론 C와 같은 language programming을 하실 줄 아는 분들은 tag 기능에 대해 잘 아시리라 생각합니다. 특정 keyword (가령 함수명이나 상수명)위에서 <C-]> 를 치면 그 keyword가 선언된 곳으로 이동되는 기능입니다.
VIM의 경우 'ctags'라는 프로그램과 잘 어울립니다. 특정 프로그램을 분석해 보고자 한다면 이 tag 기능이 많은 도움을 드릴 것입니다. 기본적인 'ctags' 사용법은 간단합니다.
ctags *.c *.h
그러면 현재 디렉토리에 tags라는 파일이 만들어집니다. vi나 vim은 바로 이 tags 파일에서 해당 keyword를 찾아서 tags 파일이 지정한 곳으로 이동하는 것입니다. 직접 tags file의 내부를 들여다 보시기 바랍니다. vi에서 search 기능 (/ 혹은 ?)을 사용할 줄 아시는 분은 tags 파일이 keyword와 그 keyword가 선언된 파일명, 그리고 그 keyword를 찾을 수 있는 search 패턴 혹은 line 번호를 가지고 있음을 보실 수 있을 겁니다.
VIM은 tag에 대해서도 여러 가지 기능들을 제공합니다. 여러 tag 파일들을 동시에 참조할 수 있습니다.
:set tags=./tags,../include/tags,/usr/include/tags
이렇게 하시면 사용자가 <C-]>를 입력한 곳의 keyword를 위의 세 tags 파일에서 순서대로 search합니다. vim을 띄울 때마다 위의 명령을 입력하는 것은 힘든 일이죠. 그렇다고 ~/.vimrc에 넣어놓자니 작업할 directory마다 위의 설정값이 틀릴 수 있는 일이고... 작업할 directory에 .vimrc 파일을 만들어 위의 line을 넣어놓으시면 됩니다. vim은 실행되면 home의 .vimrc를 읽은 후에 현재 directory의 .vimrc를 읽게 됩니다. 물론 그 사이에는 더 많은 일들이 벌어지지만요. 이 이상의 설명은 이 섹션의 범위를 벗어나므로 생략합니다. 만일 vim이 현재 directory의 .vimrc를 읽지 않는 것 같다면 ':set all' 하셔서 noexrc가 설정되어 있는 지 확인해 보시기 바랍니다. exrc 이어야 local 디렉토리의 .vimrc를 읽습니다. 만일 noexrc라면 ~/.vimrc에서 ':set noexrc' 라는 line이 있을 가능성이 있습니다. ':set exrc'를 ~/.vimrc에 넣어놓으십시오.
같은 keyword에 대해 여러 곳에서 선언된 경우에는 가끔
tag 1 of 2 or more
과 같은 메시지가 뜨는 것을 보실 수 있을 겁니다. 이것은 해당 keyword에 대한 tag가 여러개 있다는 의미입니다. 그 keyword 위에서 g] 를 입력해 보십시오. VIM은 tag list를 나열한 후 선택할 수 있도록 해 줍니다.
C-]만 사용할 수 있는 것은 아닙니다. 현재 cursor 위치가 찾고 싶은 keyword 위에 없는 경우에는?
:ta keyword
:tj keyword
좀더 자세한 사항을 알고 싶으면?
:help tags
:help g]
:help :tjump
:help :sts
:help :tn
반드시 :help tags를 해서 대충이라도 읽어보시기 바랍니다. 여기에서 설명해 드리지 않은 많은 유용한 명령들이 거기에 있습니다.
4.2 PATH 기능
path variable에 대해 모르십니까? 지금 vim을 띄우신 후 곧바로
:set path<CR>
path=.... 형식으로 출력되는 게 보일 것입니다. 앞 섹션에서 set tags= 을 설정했던 것처럼 path도 설정해 보세요.
:set path=.,../include,/usr/include,,
마지막에 빈 ,, 가 붙는다는 사실을 알아두시고요. 이렇게 해 놓으면 언제 사용되느냐 하면 filename 위에서 gf 를 입력하면 설정된 path list에서 해당 파일을 찾아서 열어줍니다.
가령 a.c라는 C source가
#include <stdio.h>
라는 라인을 포함하고 있다면 stdio.h 위에서 gf 를 입력하시면 아마도 /usr/include/stdio.h 라는 파일을 열어줄 것입니다. 창을 분할해서 보고 싶으시면 <C-W>f 를 입력하시면 됩니다.
VIM은 find 명령도 제공합니다. 지금까지 types.h 파일을 열기 위해
:e /usr/include/sys/types.h
하셨습니까?
:find sys/types.h
을 입력해 보십시오. 그러면 VIM은 /usr/include/sys/types.h 파일을 설정된 path list에서 찾아서 열어줄 것입니다.
더 자세한 내용은?
:help :fin
:help gf
:help path
4.3 치환 (substitute)
기냥 :s 하는 건 전부 아시겠죠. 그래서! 현재 버퍼 전체에 대한 치환...
:%s/\<dir\>/DIR/g
위의 내용을 분석해 볼까요?
'%' : 현재 버퍼(파일)를 의미합니다.
s : substitute
\<dir\> : dir이라는 단어를 찾음.
dir 앞뒤의 \< 와 \>는 단어를 의미합니다.
dirx 혹은 adir은 않찾습니다.
' dir ' 혹은 ' dir.' 등과 같이 앞뒤로 alphabet같은
게 없는 것만 찾습니다.
DIR : 바꿀 문자열
g : 이게 없으면 매 라인의 첫번째 match되는 단어만 찾습니다.
어떤 파일의 내용이
adir dir dirx dir
이었다면
:%s/dir/DIR/g ===> aDIR DIR DIRx DIR
:%s/dir/DIR/ ===> aDIR dir dirx dir
:%s/\<dir\>/DIR/g ===> adir DIR dirx DIR
:%s/\<dir\>/DIR/ ===> adir DIR dirx dir
이와 같이 바뀌게 됩니다.
바꿀 것인지를 확인받고 싶다면? 마지막의 c (confirm)를 사용하시면 됩니다.
:%s/dir/DIR/cg
:%s/\<dir\>/DIR/gc
도움말이 필요하시면 언제든지
:help substitute
4.4. 찾기 (grep/quickfix/search)
여러 파일에서 특정한 단어를 찾고자 할 때 어떻게 하세요?
:q
grep fancy *.c
vim c_src_which_include_fancy.c
지금까지 이렇게 하셨습니까?
VIM 사용자라면 그냥 VIM안에서 다음과 같이 하면 됩니다.
:grep word *.c
:cl
:cc 3
VIM에는 quickfix mode라는 게 있습니다. (:help quickfix :help :grep)
:cl :cc :cn :cp ...
command line에서 make 같은 걸 하면 화면에 흘러가는 에러메시지를 하나씩 보면서 vim err발생파일.c :error-line change... 해야겠지만 quickfix mode는 error 발생 file열고 에러라인으로 가는 작업을 자동으로 해줍니다. 사용자는 수정만 하면 됩니다 (VIM안에서 :make).. 이건 software 담당자들만의 일은 아닙니다. quickfix mode는 어떤 경우의 compile/parse에도 사용할 수 있습니다. 위의 grep의 경우처럼... 이를 위해 해주어야 할 일은 도움말은 보시면 알겠지만 makeprg, errorformat을 설정해 주시면 됩니다 (:grep은 grepprg, grepformat이지만 unix에는 신경쓰지 않아도 됨).
가령 :set makeprg=latex 하고, ex.tex 파일을 작성후 :make 하면 'latex ex.tex'이 수행되며, 에러발생시 해당 라인으로 커서를 옮겨줍니다. VIM이 error format을 인식하지 못하는 경우에 :set errorformat=어쩌고저쩌고... 설정해 주면 됩니다.
참고로 이 페이지는 docbook 3.1을 이용하여 sgml문서를 html 문서로 변환하는 데, 이 역시 저는 make를 이용합니다. jade로 *.sgml 문서를 compile하게 되는 데,
set errorformat=jade:../%f:%l:%c:E:\ %m
으로 설정해 봤는 데, 일단은 에러 발생시 VIM이 에러난 곳으로 잘 찾아가네요.
이 기능이 grep과 결합하여 :grep word *.c 하면 quickfix mode를 그대로 사용할 수 있습니다. 다음과 같은 mapping을 ~/.vimrc에 추가해 놓고 찾고 싶은 단어위에서 ,gc 만 입력해도 자동으로 되겠죠?
let $grepfile="*.[ch]"
nmap ,gc :grep "<cword>" $grepfile
나는 *.v를 찾고 싶다고요. 작업 다렉토리에 .vimrc file을 만들고
let $grepfile="*.v"
즉, ~/.vimrc에 일단 기본적인 걸 추가해 놓고 작업 directory마다 특성에 맞게 $grepfile만 설정해 주면...
위에 '<cword>' 라는 게 있는 데...
:help <cword>
특정 단어를 포함하고 있는 라인을 찾고 싶다?
:help include-search
이제 파일은 하나 열어서 특정 단어 위에서 다음 명령들을 한 번씩 입력해 보세요.
[i : 현재 파일에서 cursor 위치의 단어를 포함한 첫번째 줄을 보여주!
]i : 현재 위치 뒤에서 커서 위치의 단어를 포함한 첫번째 줄
[I : 파일 전체에서 커서위치의 단어를 포함하고 있는 모든 줄
]I : 현재 위치 뒤에서 포함하는 모든 줄...
[ CTRL-I : jump (위에 것과 유추해서 해석해 주세요)
] CTRL-I : jump
기타 수도 없이 많사옵니다! 다시 한번
:help include-search
4.5 filetype과 auto command
여기 내용과 관련된 몇몇 도움말 페이지를 미리 소개하면:
:help filetype
:help autocommand
:help autocmd-filetypes
:help myfiletypefile
지금 vim file.x<CR> 하신 후에 :set ft<CR> 해 보시기 바랍니다. (<CR>은 enter key)
filetype=xxx 라고 뜨죠? VIM은 현재 버퍼에 대해 filetype에 의해 다르게 동작합니다. filetype.vim 이라는 file이 /usr/share/vim/... 혹은 /usr/local/share/vim/... 밑에 보면 있을 겁니다.
그런데, VIM이 이해 못하는 파일이 있거나 잘못 이해하는 파일이 있다면? 제 거를 가지고 설명드리면...
~/.vimrc file에 다음을 추가합니다.
let myfiletypefile=$HOME."/.vim/filetype.vim"
filetype on
그리고 ~/.vim/filetype.vim file을 만들어서 가령 다음과 같이 입력합니다.
augroup my_filetype
au!
au BufNewFile,BufRead $HOME/.mail/* set ft=mail
au BufNewFile,BufRead *.x,*.acc set ft=c
augroup END
위의 경우 *.x나 *.acc 파일을 C file로 인식하라고 VIM에게 알려줍니다. ~/.mail 밑에 있는 모든 파일은 mail folder로 인식하도록 하고요.
위에서는 기존에 VIM이 알고 있는 filetype을 그대로 이용합니다. 즉, mail이나 c 같은 filetype은 VIM이 이미 알고 있습니다. 나만의 filetype을 설정할 수도 있지만 그럼 해야 될 일이 너무 많을 것으로 생각하며, 웬만한 filetype은 VIM이 이미 지원하고 있으므로 새로운 filetype의 지정은 일반적으로 필요치 않다고 생각합니다.
현재 내가 ~/work/prj/src 에서 작업중이고 ~/work/prj/commercial-pkg와 물려서 작업이 이루어 지는 데, commercial-pkg는 코딩스타일이 나와 틀려서 vim에서 파일을 열면 이상하게 보인다... vim이 내 거와 남에 거를 구분하면 좋겄다! 대표적인 게 tabstop이 될 것입니다.
~/work/prj/src/.vimrc 파일을 만들어 다음을 추가합니다.
set ts=8 sts=4 sw=4
au BufEnter */work/prj/commercial-pkg/* :set ts=8 sts=8 sw=8
au BufLeave */work/prj/commercial-pkg/* :set ts=8 sts=4 sw=4
이 경우 내가 작업하는 파일들은 tabstop=8 softtabstop=4 shiftwidth=4 이고, commercial-pkg는 ts=8 sts=8 sw=8를 사용하게 되겠습니다. BufEnter, BufLeave는 이름 자체가 설명이 필요없을 정도로 명쾌하죠?
이런 식으로 특정 파일을 열고 닫을 때, 특수한 작업을 수행할 수가 있습니다.
언제든지 궁금할 때, 자세히 알고 싶을 때는, 도움말 페이지...
:help filetype
:help autocommand
:help autocmd-filetypes
:help myfiletypefile
4.6 파일이름 수정 (filename modifier)
파일명을 바꾸는 것이 아닙니다. 현재 버퍼의 이름으로부터 다른 파일명을 얻어온다든지 하는 기능을 의미합니다.
VIM에서 현재 directory에 없는 파일의 경우 filename 앞에 path가 붙어서 표시됩니다. 현재 directory의 파일은 파일이름만 표시되지요.
현재 directory가 ~/work/pjt/core/src 였고, 거기에서 특정 문자열에서 tagging을 하였더니
~/work/pjt/app/networking/sources/net.c
라는 파일이 열렸습니다. 그 파일에서 이것저것 하다 보니까
~/work/pjt/app/networking/sources/bind.c
파일은 열고 싶습니다.
어떻게 하세요?
:q
cd ~/work/pjt/app/networking/sources
vim bind.c
혹은 그냥 그 vim 안에서
:e ~/work/pjt/app/networking/sources/bind.c
:e ../../app/networking/sources/bind.c
이렇게 하시지 않으셨습니까?
여기 새로운 방법이 있습니다. 현재 버퍼의 파일명에서 path를 추출해서 사용하는 방법인 데, 현재 창의 파일이
~/work/pjt/app/networking/sources/net.c
이라면
:e %:p:h/bind.c
이걸 풀어보면
% : 현재 버퍼의 파일명
:p : full path로 바꿈 (filename이 path가 없는 경우)
:h : 마지막 잘라냄 ('/net.c' 가 없어짐)
위의 경우처럼 버퍼의 파일이 이미 path를 포함하고 있는 경우에는
:e %:h/bind.c
만 해도 됩니다.
만일 ~/work/pjt/app/networking/common/common.h 를 열고 싶다면?
:e %:h:h/common/common.h
':h' 를 % 에 대해 두번 수행하니까 '/sources/net.c' 가 없어지고 '/common/common.h' 를 붙이는 거죠!
여기에서 도움말을 보는 법은?
:help filename-modifiers
:help _%
기타 :~ :. :t :r :e 등등 filename을 조작할 수 있는 명령이 많이 있으니 한번 보시기 바랍니다.
4.6 match pair
C 에서 ( 나 ) 위에서 % 를 입력하면 match되는 다른 걸로 커서가 옮겨가는 거는 아시겠지요?
:help matchpair
VIM에서는 이 matchpair가 기본적으로는 (), {}, [] 로 설정되어 있습니다.
:set mps
이것은 C의 기본적인 token 들이죠. 그런데, <> 에 대해서도 %로 왔다갔다 하고 싶다면?
:set mps+=<:>
좌우가 다른 어떤 종류의 matchpair의 설정이 가능합니다.
:set mps+=!:*
설정값을 없애려면?
:set mps-=!:*
C file에서는 '#if' 관련 directive에서도 % 가 동작한다는 걸 아십니까?
#ifdef XXX
# ifndef YYY
..........
# endif
#else
...
#endif
'#' 위에서 %를 입력하면서 커서의 움직임을 보시기 바랍니다.
'#' directive를 찾는 또 다른 방법은 {# 혹은 }# 입니다.
{{ 혹은 }} 이 함수의 시작 위치로 가는 것은 아시겠죠?
4.7 MATCH ENHANCEMENTS
Benji Fisher의 홈에 가시면 matchit.vim 이라는 macro를 만날 수 있습니다. 이 파일을 받아다가 ~/
.vimrc에서
source ~/.vim/matchit.vim
을 추가하시면 어떤 keyword에 대한 matchpair도 사용할 수 있게 됩니다. 가령 shell script에서는 if else fi 사이를, 그리고 html file에서는 <body> </body> 와 같은 형태 ... 등등등...
저의 경우 .vimrc에 Makefile 관련된 기능을 추가해서 사용하고 있습니다.
aug xxx
au!
" GNU Makefile
au FileType make let b:match_words=
\ '\<ifeq\>\|\<ifneq\>\|\<ifdef\>\|\<ifndef\>,\<else\>,\<endif\>'
aug END
4.8 반복 작업 (multiple repeat)
:g 라는 게 있습니다. global의 약자라고 느껴지십니까? 다음과 같이 하면
:g/^#/d
현재 버퍼 전체에서 # 으로 시작하는 라인이 지워집니다.
(참고:)이런 작업을 하려면 regexp (regular expression)에 익숙해지시는 게 좋은 데, regexp에서 '^' 은 라인의 처음 '$'는 라인의 끝을 의미합니다.
위의 참고로부터 다음을 쉽게 이해할 수 있을 것입니다.
:g/^$/d
라인의 처음과 끝사이에 아무것도 없으면 지워라. 그러므로 빈줄을 지워라...
파일이 다음과 같은 때
# namsh
addr: nam, 222-12345, suwon
# nanin
addr: nan 333-45678, anyang
# nunin
addr: nun 123-65432, seoul
전화번호 뒤를 모두 지우고 싶다면 어떻게 하시나요?
무슥한 vi 사용자라면? (아! 울고싶어라)
jllllllllllllllxxxxxxxxxxx ... 반복
VI의 기본 명령을 아시는 분이라면?
j02f,Djj02f,D ... 반복
VIM의 repetition 기능을 아시는 분이라면? (:help complex-repeat)
qw/^addr:<CR>02f,Dq@w@w10@w100@w ...
만일 당신이 VI expert라면? 아마도 이렇게...
:g/^addr:/norm 02f,D
현재 버퍼에서 addr: 으로 시작하는 라인을 찾아서 normal 명령을 수행하는 데, normal 명령은 02f,D 이다. 잘 이해가 않가는 분은 위의 몇줄을 파일로 저장후 그 파일에서 한번 해 보세요. '02f,D'를 모르시는 분은 위의 addr로 시작하는 줄에 가셔서 커서를 중간쯤에 위치시켜놓고 02f,D 를 천천히 입력도 해 보시고요...
그래도 이해가 않가시면...
0 : 라인 첫 컬럼으로 이동 (^ 는 공백이 아닌 첫문자로 이동이죠?)
2f, : f, 를 두번 수행 (f 는 forward search)
D : cursor 위치로부터 라인끝까지 삭제
위에서 norm 은 ':' 즉 command line에서 normal 명령을 수행할 때 사용합니다. 현재 위치에서 'dd'는 현재 줄을 지우죠? ':normal dd' (norm은 normal의 약어)해도 똑같습니다. 지금 해보세요.
:g! 과 :v 도 있습니다.
:help multi-repeat
:help :g
4.9 script (command line)
현재 디렉토리에 있는 모든 C source file에서 OLD_string이라는 `단어'를 찾아서 NEW_string으로 바꾸고 싶습니다. 다음 내용을 vim.scr 이란 파일로 저장합니다.
:%s,\<OLD_string\>,NEW_string,g
:wq
borne shell prompt에서 다음과 같이 하시면 됩니다.
for i in *.c *.h; do vim -s vim.scr $i; done
C shell을 쓰시는 분은
foreach ... 어쩌고 저쩌고...
VIM 도움말 페이지를 열심히 뒤져 보면 'vim *.c *.h' 한 후에 vim 안에서 모든 버퍼에 대해 위의 동작을 수행할 수 있다는 내용도 들어있습니다. 궁금하신 분들은 지금부터 VIM 도움말 페이지를 열심히 surfing 하시기를...
5. 빔 팁
Preface
이 문서는 여러 곳에서 - 특히 VIM developer's mailing list - 얻은 VIM에 대한 여러 정보를 모아놓은 것입니다. 자세한 설명을 기대하지는 마시기 바랍니다. 여기 있는 내용을 이해하기 어려우신 분들은 VIM tutor directory에 가셔서 tutorial을 먼저 섭렵하시기 바랍니다. VIM help page는 방대한 양의 정보를 제공합니다. 시간나는 데로 help page를 보면 조금씩 내공이 쌓이는 걸 느끼게 될 겁니다.
Warning
저는 항상 VIM의 가장 최근 버젼을 사용하고 있으므로 이 문서는 저도 모르는 사이에 구버젼의 VIM에서는 동작하지 않는 기능을 포함할 수도 있습니다. 이 문서의 내용을 이해할 수 없는 분은 VI reference guide 및 VI FAQ를 먼저 보시길 바라며, VIM의 도움말도 한번쯤 읽어보시기 바랍니다.
추천할 만한 팁을 알고 계신다고요?
namsh@kldp.org로 멜 주세요.
간단한 팁들
1. 작업한 문서를 빔 안에서 바로 ftp로 remote host로 보내기
본인의 경우 localhost에서 문서 작업을 한 후 KLDP로 문서를 복사하는 데, 다음과 같이 하면 아주 편하다.
nmap _ftp :call SendFTP("kldp")<cr>
com! -nargs=1 FTP call SendFTP(<q-args>)
func! SendFTP(host)
if a:host == "kldp"
" host specific setting
let h = "kldp.org"
let p = "/home/namsh/some_where/documents/"
let u = "namsh"
let w = "my_password"
else
echo "Unknown host '".a:host."'"
return
endif
let t = input("하위 디렉토리? ")
let f = input("파일명? ")
" 다른 사람이 비밀번호 못보게 silent 기능 사용
if filereadable(f)
echo "\nncftpput ftp://".h.p.t." ".f
silent! exec "!ncftpput -u ".u." -p ".w." -z ".h." ".p.t." ".f
else
echo "Cannot read a '".f."'"
endif
endfunc
위의 기능은 빔 6.0의 silent 기능을 이용하고 있다. 집에서 혼자 작업하는 경우에는 silent 기능은 필요없으므로 5.x 사용자의 경우에는 "silent!"을 삭제하고 사용할 수 있다. 물론 위의 code를 포함하는 vimrc는 본인만 쓰고 읽을 수 있도록 퍼미션을 변경하는 것은 필수!
위에서 사용하고 있는 ncftpput은 ncftp 3.0에 들어있는 프로그램입니다.
"com! -nargs.." 에 대해 잘 모르시는 분은
:help command<cr>
해 보시기 바랍니다. 위 예제의 경우 다음과 같이 하면 normal mode에서 "_ftp" 입력한 것과 같게 됩니다. "<cr>"는 ENTER key를 의미합니다.
:FTP kldp<cr>
2. VIM으로 매뉴얼 페이지를 보자. man 명령은 너무 불편해!
다음을 vimpager.sh로 저장한다.
#!/bin/sh
if test $# = 0; then
col -b \
| tail -n +4 \
| gvim -n -c 'set ft=man' -c 'map q :q<cr>' -c 'set nomod' -
else
gvim -n -c 'map q :q<cr>' -R $*
fi
exit 0
환경변수 PAGER를 vimpager.sh로 설정한다. vimpager.sh가 /usr/local/bin에 있고, sh 혹은 bash를 사용한다면
$ export PAGER="/usr/local/bin/vimpager.sh"
이제 `man vim'을 입력해 보시기 바랍니다.
3. 현재 cursor 위치의 문자열을 현재 file안에서 찾아서 한눈에 보고싶다. 또, 원한다면 특정 문자열이 있는 위치로 바로 이동하고 싶다.
다음 mapping을 vimrc file에 추가하고, cursor를 문자열위에 놓은 후 <F4>를 입력. 자세한 사항을 원하면 ':help [I'
nmap <F4> [I:let nr = input("Which one: ")<BAR>
\exe "normal " . nr . "[\t"<CR>
4. C/C++ coding시 block을 설정하고, substitution을 하고 싶다.
'viB'는 '{'로 시작해서 '}'로 끝나는 block을 선택한다. 자세한 사항은 ':help text-object'.
viB:s/pattern/subst/
5. 현재의 gtk+ version의 GVIM은 window size가 변하는 관계로 enlightenment 등의 window manager에서 제공하는 auto placement 기능을 사용하는 경우 화면 밑에 gvim 창이 놓여서 mouse로 옮겨야 하는 불편함이 있는 데, 이를 해결할 수 있는 방법은?
본인은 다음과 같은 auto command를 $HOME/.gvimrc file에 넣어놓고 있습니다. gtk version이고, GUI 실행시 window position을 얻어와서 적절히 조절해 주는 거죠. x/y position은 각자의 스크린 크기 및 gvim 창의 크기에 맞추어 조절해 주셔야 합니다.
if has("gui_gtk")
augroup my_winpos_au
au!
au GUIEnter * let x=getwinposx()
au GUIEnter * let y=getwinposy()
au GUIEnter * if x > 560
au GUIEnter * let x=560
au GUIEnter * elseif x < 16
au GUIEnter * let x=16
au GUIEnter * endif
au GUIEnter * if y > 170
au GUIEnter * let y=170
au GUIEnter * elseif y < 16
au GUIEnter * let y=16
au GUIEnter * endif
au GUIEnter * exe "winpos " . x y
au GUIEnter * unlet x y
au GUIEnter * au! my_winpos_au
augroup END
endif
이것은 vim-5.4o 이후 버젼부터는 필요없습니다. resize 문제가 해결되어서 position이 제대로 놓이기 때문입니다. 단지 auto command에 대한 하나의 예제로서 여기에 존재합니다.
6. (ABC)처럼 괄호안에 대문자로만 있는 경우에 대해 괄호를 없애고 싶다.
:smagic/(\(\L*\))/\1/ge
7. 문서를 편집하는 도중 입력모드에서 현재 시간을 넣고 싶다.
inoremap <C-G> <C-R>=strftime("%Y/%m/%d %T")<CR>
8. VIM으로 작업도중 현재 시간을 간단히 알 수 있는 방법은?
nmap ,t :echo strftime("%T")<CR>
9. 문서 내에 빈 라인이 많이 있을 때, 여러 줄의 빈 라인을 한 줄로 바꾸고 싶다.
nmap _B GoZ<Esc>:g/^[ <Tab>]*$/,/[^ <Tab>]/-j<CR>Gdd
10. 특정한 문자로 구분된 field중 7번째와 8번째 사이의 모든 숫자를 0으로 바꾸고 싶다.
:%s/^\(\(.\{-}STR\)\{7}\).\{-}\(STR.*\)$/\10\3/
11. 각 field의 구분자를 "STR" 대신 사용하면 된다.
12. RCS 관련 기능을 GVIM의 메뉴를 통해 사용하고 싶다?
$HOME/.vimrc 등에 다음을 추가한다.
menu RCS.CheckIn :w <CR>:!ci -q -u -m\"\" %<CR>:e %<CR>
menu RCS.CheckOut :!co -q -l %<CR>:e %<CR>
menu RCS.Lock :!rcs -q -l %<CR>
menu RCS.UnLock :!rcs -q -u %<CR>
menu RCS.Diff :!rcsdiff -q -u %<CR>
menu RCS.Log :!rlog %<CR>
실제로 해 보시면 본인만의 메뉴를 만들어 넣으실 수도 있습니당!
13. 문자열을 찾는 도중 에러가 발생했는지의 여부를 확인하여 다른 일을 하고 싶다.
let errmsg = ""
/search_string
if errmsg == ""
echo "search_string found!"
else
echo "search fail!"
endif
X terminal에서 16color 사용
1. hanterm/xterm에서 VIM으로 16color를 사용하고 싶어요.
일단 hanterm (xf331 version) 혹은 xterm이 16color enable로 compile되어 있어야 합니다. 그리고, $HOME/.vimrc에 다음을 추가합니다.
if has("unix")
set t_Co=16
if has("terminfo")
set t_AF=^[[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm
set t_AB=^[[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm
else
set t_Sf=^[[3%dm
set t_Sb=^[[4%dm
endif
endif
2. Eterm (Enlightened Terminal)에서 VIM으로 16color를 사용하려면?
Eterm은 hanterm/xterm 등과는 다른 ANSI(?) sequence를 사용합니다. hanterm/xterm이 아닌 다른 terminal에서 위의 hanterm 관련 color setting이 동작하지 않을 경우에는 다음을 시도해 보시기 바랍니다.
set t_Co=16
set t_AF=^[[%?%p1%{8}%<%t3%p1%d%e%p1%{22}%+%d;1%;m
set t_AB=^[[%?%p1%{8}%<%t4%p1%d%e%p1%{32}%+%d;1%;m
3. color를 disable시키고 싶어요!
VIM을 실행시킨 후
:syn off
혹은 $HOME/.vimrc file에 위의 line을 추가시켜도 됩니다.
CVS 사용
1. status line에 CVS 정보를 추가하기
다음을 .vimrc에 추가한 후 CVS로 관리되는 파일을 VIM으로 열면 status line에 `[CVS-1.3]' 혹은 `[CVS-1.125-gtk-1-2]'와 같은 revision 및 tag 정보가 추가된다.
let g:mystsline = ""
let g:oldfilename = ""
let g:cvsftime = 0
let g:cvsrev = 0
set statusline=%<%f%h%m%r\ %{SetMyStsLineVar()}%=%l,%c\ %n,%L
" CVS revision/tag 정보를 [CVS-revision-tag] 형식으로 return
func! SetMyStsLineVar()
let p = expand("%:p:h")
" speed-up
if filereadable(p."/CVS/Entries")
let cvsftime = getftime(p."/CVS/Entries")
else
let cvsftime = 0
endif
let me = expand("%:t")
if me == g:oldfilename && cvsftime == g:cvsftime
return g:mystsline
endif
let g:mystsline = ""
let g:cvsftime = cvsftime
let g:oldfilename = me
let g:cvsrev=0
if filereadable(p."/CVS/Entries")
let rev=""
let tag=""
let line = system("grep '^/".me."/' ".p."/CVS/Entries")
if line != "\n"
let i=1
let j=strlen(line) - 1
let k=1
while i < j
let i=i+1
if line[i] == '/'
let k=k+1
if k == 2
let i=i+1
while i < j && line[i] != '/'
let rev = rev.line[i]
let i=i+1
endwhile
endif
if k == 4 && line[i+1] == 'T'
let i=i+2
while i < j
let tag = tag.line[i]
let i=i+1
endwhile
let g:y=tag
endif
endif
endwhile
if rev != ""
let g:cvsrev = rev
if tag != ""
let g:mystsline = "[CVS-".g:cvsrev."-".tag."]"
else
let g:mystsline = "[CVS-".g:cvsrev."]"
endif
endif
endif
endif
return g:mystsline
endfunc
위에서 cvs revision 및 tag 정보를 global variable로 저장해 두는 이유는 이 밑을 보시면 이해하실 수 있을 것입니다.
2. 현재 파일의 마지막 commit info를 알아내기
`cvs log' 명령을 위에서 저장한 revision과 연계하여 사용함으로서 쉽게 알아낼 수 있다.
" 현재 파일의 revision에 대한 commit info
func! CVS_ShowLog()
let f=expand("%")
let rev=g:cvsrev
new
exec "r!cvs log -N -r".rev." ".f
exec "norm 1G/^---------------\<cr>z\<cr>"
set nomod wrap
" q 를 입력하면 buffer 닫음
noremap <buffer> q :bd<cr>:echo ''<cr>
endfunc
nmap ,cl :call CVS_ShowLog()<cr>
여기에서는 vim 6.x에 새로 추가된 `map <buffer>' 기능을 사용합니다. 현재 버퍼에서만 `q'가 mapping대로 동작하도록 합니다. 5.x 사용자는 `noremap ...' line을 지우시고 그냥 `:bd'를 사용하시기 바랍니다. `<buffer>' 만 지우면 `q'를 사용할 수 있지만 5.x에서는 global mapping이 되므로 다른 버퍼에서도 `q'를 입력하게 되면 버퍼가 닫히게 됩니다.
3. 현재 파일과 이전 revision 사이의 diff 보기
역시 위의 status line 관련 기능과 연관되어 구현되었는 데, 다음과 같습니다.
" 위의 statusline 관련 루틴에 의해 설정된 CVS revision 번호에 대해 이전
" 번호와의 차이점을 display
func! CVS_ShowDiffFromPrev()
let pos = strlen(g:cvsrev)
while pos > 0
let pos = pos - 1
if g:cvsrev[pos] == "."
let h = strpart(g:cvsrev, 0, pos+1)
let t = strpart(g:cvsrev, pos+1, 10)
if t == "1"
" revision이 2.19.2.1과 같은 경우 'cvs diff -r 2.19.2.0'은 실패한다.
" 따라서, 이와 같은 경우 'cvs diff -r 2.19'를 실행한다.
while pos > 0
let pos = pos - 1
if g:cvsrev[pos] == "."
let h = strpart(g:cvsrev, 0, pos)
break
endif
endwhile
let t=""
else
let t = t - 1
endif
let f = expand("%")
new
exec "r!cvs diff -u -r " .h.t. " " .f
set nomod
noremap <buffer> q :bd<cr>:echo ''<cr>
return
endif
endwhile
endfunc
nmap ,cp :call CVS_ShowDiffFromPrev()<cr><cr>1G
4. GNU style ChangeLog file과 CVS
Unix 사용자를 위한 것입니다. 저의 경우 `,cu' 와 `,ci' 를 거의 사용합니다. 번역쪽에 있는 ChangeLog syntax resource file을 참고하시기 바랍니다. 다음 내용을 사용하시려면 email domain은 고쳐주어야 겠지요? 일단 ChangeLog file을 열어서 `,cu' 혹은 `,ci' 해보시라니깐요!
let $VITMP=".vi_tmp.~"
" "n에 이름 저장. "w에 user ID 저장.
nmap ,mW :sp<CR>:new<CR>:r!whoami<CR>"wye:bd!<CR>:e /etc/passwd<CR>/<C-R>w<CR>
\4f:l"nyt::bd<CR>
" 현재 날짜/시간 및 email 주소 입력
imap <C-G> <ESC>,mWa<C-R>=strftime("%Y-%m-%d")<CR> <C-R>
\n <<C-R>w@lgic.co.kr>
" <C-G> 후 cvs upd를 통해 바뀐 파일 얻어옴.
nmap ,cu 1GO<C-G><CR><ESC>:r!cvs -q upd<CR>o<ESC>kV{j:g/^[PU] /d<CR>
\:'<,'>s/^[MAR] / * /<CR>:'<,'>s/$/:/<CR>1G2jA
" 현재 입력한 내용을 commit info로 사용.
nmap ,ci 1G}jV/^[12]<CR>2k:w! $VITMP<CR>:!cat $VITMP<CR>
\:echohl Question<BAR>echo "press ENTER to commit"<BAR>
\echohl None<CR>:!cvs -q ci -m "`cat $VITMP`"
nmap ,cd :!cvs diff -u <cfile><CR>
nmap ,ca V:s/^? / * /<CR>0f*w:!cvs add <cfile><CR><CR>A new.<ESC>
음! 참고로 혼자 작업하시는 분들은 저처럼 골치아프게 user 이름, user ID를 얻어올 필요가 없겠지요? 저는 회사에서 일하는 관계로 많은 사람과 같이 작업하며 보통 vimrc file을 전부 공유해서 사용합니다. 같은 coding 환경을 만들기 위해서...
VIM resource file을 이용한 color 바꾸기
VIM의 기본 synload.vim을 보면 기본적으로 두가지(어두운 배경과 밝은 배경)를 지원합니다. 기본색상을 그대로 쓰고 싶다면 $HOME/.vimrc에 다음 2줄을 추가합니다.
" 밝은 background를 원할 경우에는 dark 대신 light 사용.
set background=dark
syntax on
만약 color를 마음대로 바꾸고 싶다면? 다음은 제 resource의 일부를 그대로 가져온 겁니다.
$HOME/.vimrc에 다음을 추가합니다.
if !has("unix")
let $HOME=c:/vim
endif
let mysyntaxfile="$HOME/.vim/mysyntax.vim"
syntax on
$HOME/.vim/mysyntax.vim에 다음을 추가합니다.
if has("syntax")
if !exists("did_my_syntax_inits")
let did_my_syntax_inits = 1
" 음하하! 여러 호스트마다 색깔을 바꿀수도 있죠...
if $HOSTNAME == "namsh"
hi Normal term=NONE cterm=NONE gui=NONE guifg=white guibg=#243318
hi Comment term=NONE cterm=NONE ctermfg=6 gui=NONE guifg=Cyan
else
hi Normal term=NONE cterm=NONE gui=NONE guifg=white guibg=#343328
hi Comment term=NONE cterm=NONE ctermfg=6 gui=NONE guifg=Cyan
endif
hi Visual term=reverse cterm=reverse gui=NONE guifg=black guibg=gray85
hi Constant term=NONE cterm=NONE ctermfg=3 gui=NONE guifg=Yellow
hi Identifier term=NONE cterm=NONE ctermfg=3 gui=NONE guifg=Yellow
hi Special term=NONE cterm=NONE ctermfg=11 gui=NONE guifg=OliveDrab1
hi Statement term=NONE cterm=NONE ctermfg=5 gui=NONE guifg=magenta
hi PreProc term=NONE cterm=NONE ctermfg=12 gui=NONE guifg=SandyBrown
hi Type term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
hi Error term=NONE cterm=NONE ctermfg=0 ctermbg=1 gui=NONE
\guifg=black guibg=Red
hi Todo term=NONE cterm=NONE ctermfg=0 ctermbg=5 gui=NONE
\guifg=black guibg=Orange
hi SpecialKey term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
hi Directory term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
hi MoreMsg term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
hi Question term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
hi WarningMsg term=NONE cterm=NONE ctermfg=1 gui=NONE guifg=Red
hi StatusLine term=reverse cterm=reverse ctermfg=12 ctermbg=black
\gui=reverse guifg=SandyBrown guibg=black
hi Cursor term=NONE cterm=NONE ctermfg=3 ctermbg=12 gui=NONE
\guifg=black guibg=salmon
endif
endif
다음은 제 $HOME/.vim/syntax2/c.vim 의 일부입니다.
if highlight_exists("cTodo")
syntax clear cTodo
endif
syntax keyword cTodo contained TODO FIXME CAUTION NOTE
다음은 GVIM과 console version 간의 색의 차이를 없애기 위해 $HOME/.Xdefaults에 다음을 추가하면 좋습니다.
*VT100*colorMode: on
*VT100*dynamicColors: on
*VT100*colorULMode: on
*VT100*underLine: off
*VT100*colorBDMode: on
*VT100*color0: gray18
*VT100*color1: red
*VT100*color2: green
*VT100*color3: yellow
*VT100*color4: skyblue
*VT100*color5: magenta
*VT100*color6: cyan
*VT100*color7: gray99
*VT100*color8: gray20
*VT100*color9: red3
*VT100*color10: green3
*VT100*color11: OliveDrab1
*VT100*color12: SandyBrown
*VT100*color13: Orange
*VT100*color14: cyan3
*VT100*color15: gray95
*VT100*colorUL: yellow
*VT100*colorBD: yellow
다음은 syntax와는 큰 연관은 없지만 한글 사용하려면 font를 설정해야 되겠죠?
" 심지어는 windows와 unix간에도 같은 VIM resource file을 사용할 수도
" 있지요..... 저는 windows는 거의 사용하지는 않지만 그래도 VIM은
" 필수 아니겠어요?
if has("unix")
set guifontset=어쩌리저쩌리_너무_길어서_헤헤헤
else
set guifont=굴림체:h10:w5
endif
if version >= 600
set charcode=korea
else
set fileencoding=korea
endif
set guioptions=iamgrtpT
set mousehide
거저 도움말 보는 게 이렇게 한 수 배우는 것 보다 100배 낫죠... VIM을 띄우신 후
:help syntax
'Computer_language > Vim' 카테고리의 다른 글
VIM 강좌 - 검색 및 정규표현식 [출처] VIM 강좌 - 검색 및 정규표현식|작성자 소룡매냨 (0) | 2009.01.12 |
---|---|
VIM 강좌 - 블록 설정, 다중창 및 단축키 지정 [출처] VIM 강좌 (0) | 2009.01.12 |
VIM 강좌 - vim 으로 폼나는 개발자가 되어보자 [출처] VIM 강좌 (0) | 2009.01.12 |
Vim - 정규표현식 [출처] Vim - 정규표현식|작성자 atlacpi (0) | 2009.01.12 |
가장 많이 사용되는 vim, vi 명령어 [출처] 가장 많이 사용되는 vim, vi 명령어|작성자 자바먹어 (0) | 2009.01.12 |