#좀더 발전된 사용법 ##정규 표현식의 사용 * `\<`: 단어의 시작 * `\>`: 단어의 끝 * `\{min,max\}`: min이상 max이하 반복됨 * `\|` or의 의미 `\<`, `\>` 사용예: \ 현식\> `\{min,max\}` 사용예: 영문자로 시작하고 3-4 r 자리 숫자로 끝나는 문자열 [A-z]\+[0-9]\{3,4\} `\|` 사용예: Korea 혹은 korea \(K\|k\)orea vim에서는 정규 표현식 내에 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:]을 제외한 문자. 예) !,@,#,$,%,^... * `[:space:]`: 화이트 스페이스 예) 공백, 탭, 캐리지 리턴, 개행 문자, 수직 탭, 폼 피드 * `[:xdigit:]`: 16진수 소문자로 이루어져 있는 문자열 [[:lower:]]\+ `int var;`를 찾고자 한다면 int\(\ \|\t|\n\)\+var; int[[:space:]]\+var; 위의 표현보다는 아래의 것이 더 간결하다. 아래는 `int myfunc (void) {` 와 같은 함수 선언과 매칭된다. int[[:space:]]\+myfunc[[:space:]]*(.*)[[:space:]]*{ vim은 확장 정규 표현식을 지원한다. 확장 정규 표현식으로 아래와 같다. * `\i`: 변수 지정에 사용되는 문자[_0-9A-Za-z] * `\I`: \i와 같지만 숫자는 제외 * `\k`: 키워드로 사용하는 문자[_\.\-0-9A-Za-z>] * `\K`: \k와 같지만 숫자는 제외 * `\f`: 파일명으로 사용하는 문자 * `\f`: \f와 같지만 숫자는 제외 * `\p`: 프린트 가능한 문자 * `\P`: \p와 같지만 숫자는 제외 * `\s`: 화이트 스페이스 문자(공백과 탭) * `\S`: 화이트 스페이스가 아닌 문자 * `\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`: 캐리지 리턴 * `\b`: 백스페이스 * `\n`: 개행 문자 사용예: 대문자로 이루어진 단어를 찾을 때 \<[[:upper:]]\+\> 또는 \<[A-Z]\+\> \<\u\+\> 위의 표현식보다는 아래의 표현식이 훨씬 간결하다. 다른예로 int[[:space:]]\+myfunc[[:space:]]*(.*)[[:space:]]*{ int\s\+myfunc\s*(.*)\s*{ 아래의 표현식으로 더 간결하게 표현하였다. ###정규 표현식을 사용한 탐색 /[정규표현식] ###정규 표현식을 사용한 치환 :%s/[정규표현식]/[바꾸려는 문자열]/g 예) :%s/[A-z]\+/alpha/g ###정규표현식의 매칭문자 사용 예 aaa=YES aaa=NO 위의 문자열을 가지고 아래와 같게 되도록 하고자 할 때 치환명령을 사용할 수 있다. ccc=YES, ddd=YES ccc=NO, ddd=NO 치환명령 :%s/aaa=\(YES\|NO\)/ccc=\1, ddd=\1/gc 위 치환명령은 정규식의 그룹기능을 사용하는 한 예이다. ##여러파일 편집하기 vim은 여러 파일을 편집하기 위해서 파일 버퍼의 개념을 사요한다. $ vi file1.c file2.c file3.c $ vi * $ vi *.c 혹은 vim을 실행 주 `:e [파일 명]` 명령으로 파일을 오픈 위 명령으로 여러 파일을 오픈하면 열려 있는 파일들이 파일 버퍼에 들어있다.파일 버퍼와 관련된 명령을 아래와 같다. * `:buffers`: 버퍼의 내용을 나열 * `:files` 또는 `:ls`: 버퍼의 내용을 나열 * `:b[N]`: N번 버퍼로 이동 * `:bd[N]`: N번 버퍼를 삭제(N이 없으면 현재의 버퍼를 완전 삭제) * `:bw[N]`: N번 버퍼를 완전 삭제(N이 없으면 현재의 버퍼를 완전 삭제) * `:bp[N]`: 이전 버퍼로 이동. N을 붙이면 N번 마큼 이전 버퍼로 이동 * `:bn[N]`: 이후 버퍼로 이동. N을 붙이면 N번 마큼 이후 버퍼로 이동 * `:sb[N]`: 창을 수평 분할해 N번 버퍼를 로드 * `:bf`: 첫 번째 버퍼로 이동 * `:bl`: 마지막 버퍼로 이동 아래 명령은 페도라에서 작동하지 않았음. * `:al`: 현재 열려있는 모든 버퍼를 수평 분할 창에 로드 .vimrc 설정 파일에 키 매핑 추가하기 "===========moving between file buffers map ,1 :b!1 map ,2 :b!2 map ,3 :b!3 map ,4 :b!4 map ,5 :b!5 map ,6 :b!6 map ,7 :b!7 map ,8 :b!8 map ,9 :b!9 map ,0 :b!10 map ,x :bn! "next buffer map ,z :bp! "previous buffer map ,w :bw "close current file buffer ##반복되는 문자열을 저장해서 다시 사용하기 vim은 잘라내기에서 지원하는 17개의 레지스터 외에 a 부터 z까지 26개의 레지스터를 더 지원한다. 이 추가 레지스터를 네임 레지스터라고 한다. 이 레지스터에 반복되는 여러 군데에서 반복적으로 쓰이는 문자열을 저장해 두고 사용을 하면 편리하다. "a3yy `"a`는 a 레지스터를 지정한다. `3yy`는 현재 커서 위치에서 3개의 행을 복사해서 저장한다. 이제 a 레지스터에는 지정한 문자열이 저장되어 있다. "ap `"a`는 a 레지스터를 지정하고 p는 붙여넣으라는 명령이다. "a5p 위와 같이 하면 5번을 붙여넣게 된다. ##매크로 사용하기 매크로를 기록하는 요령은 `q[네임 레지스터명]` 이다. 실습을 해 보자. 한줄을 주석 처리하고 아래 줄에 커서를 위치시키는 매크로이다. qb b 레지스터에 매크로를 기록한다. `qb`를 입력하면 "기록 중"이라고 화면 하단에 표시된다. ^i// q *참고:* 만일 위와 같이 매크로를 기록하는 중에 `` 키가 작동하지 않을 겨우에는 `j` 키로 대체한다. 마지막에 `q`를 입력하며 화면 하단의 "기록 중" 메시지가 사라진다. 이제 b 레지스터에 매크로가 기록되었다. 매크로를 사용하는 방법은 `@[네임 레지스터명]` 이다. 이전에 실습한 b 매크로를 사용하려면 `@b`를 누르면 된다. @b 매크로를 5회 실행하려면 아래와 같이 누른다. 5@b 결과적으로 다섯 줄을 주석 처리하였다. 주석을 제거하는 매크로를 c 레지스터에 기록해 보자 qc ^3x q @c ##다중 창 사용하기 ### 창생성 * `+ws`, `:sp[lit]`: 현재 파일을 수평 창으로 나눔 * `+wv`, `:[N]vs[plit]`: 현재 파일을 수직 창으로 나눔, N이 있이면 N칸의 크기로 분할 * `+wn`, `:new`: 수평 창으로 나누고 빈 문서를 보여줌 * `+w^`: 수평 창으로 나누고 이전 파일을 오픈 * `+wf`: 수평 창으로 나누어 커서 위치의 파일을 오픈함 * `+wi`: 커서 위치의 단어가 정의도니 파일을 오픈 ### 창삭제 * `+wq`, `:q[uit]`: 현재 커서의 창을 삭제 * `+wc`, `clo[se]`: 현재 커서의 창을 삭제 * `+wo`, `:on[ly]`: 현재 커서의 창만 남기고 모든 창 삭제 ### 창이동 * `+wh`: 왼쪽 창으로 커서를 이동 * `+wj`: 아래쪽 창으로 커서를 이동 * `+wk`: 위쪽 창으로 커서를 이동 * `+wl`: 오른쪽 창으로 커서를 이동 * `+ww`: 창 간에 커서를 순차적으로 이동 * `+wp`: 가장 최근에 이동한 방향으로 커서를 이동 * `+wt`: 최상위 창으로 커서를 이동 * `+wb`: 최하위 창으로 커서를 이동 ### 창위치 바꾸기 * `+wr`: 순차적으로 창의 위치를 순환 * `+wx`: 이전 창과 위치를 바꿈 ### 창크기 조절 * `+w=`: 창의 크기를 모두 균등하게 함 * `+w_`: 수평 분할에서 창의 크기를 최대화 * `+w|`: 수직 분할에서 창의 크기를 최대화 * `+w[N]+`, `res[ize]+N`: 창의 크기를 N행 만큼 증가(`+w+`는 1행 만큼 증가) * `+w[N]-`, `res[ize]-N`: 창의 크기를 N행 만큼 감소(`+w-`는 1행 만큼 감소) * `+w[N]>`: 창의 크기를 오른쪽으로 N칸 만큼 증가(수직 창에만 적용됨) * `+w[N]<`: 창의 크기를 왼쪽으로 N칸 만큼 증가(수직 창에만 적용됨) ##마킹 사용하기 m[임의의 알파벳]: 마킹 `[임의의 알파벳]: 마킹한 위치로 이동 마킹의 종류는 세 가지이다 * 전역 마킹: A-Z 대문자, 현재 파일을 포함한 다른 파일 간의 마킹이 가능하다. 즉 대문자로 마킹하면 파일이 다르더라도 마킹한 위치로 이동할 수 있다. * 지역 마킹: a-Z 소문자, 현재 파일 내에서만 마킹이 가능하다. 소문자로 마킹하면 현재 파일 내에서만 이동 할 수 있다. * 파일 마킹: vim이 자동으로 만든다. 마킹 정보는 ~/.viminfo 파일에 저장된다. 파일 마킹은 이전에 vim으로 편집한 파일의 경로와 파일 내에서의 위치를 vim이 알아서 마킹한다. vim에서 마킹된 정보는 `:marks` 명령으로 환인할 수 있다. :marks 마킹 관련 명령 요약 * ma: a로 마킹, mb는 b로 마킹 * `a: a로 마킹된 위치로 이동함 * 'a: a로 마킹된 행의 처음으로 돌아감 * '': 직전에 커서가 위치하던 행의 처음 * ``: 직전에 커서가 있던 위치로 이동 * '": 현재파일을 이전에 닫았을 때의 커서가 있던 행의 처음으로 이동 * `": 현재파일을 이전에 닫았을 때의 커서가 있던 위치로 이동 ##셸 명령 수행하기 :!ls :!bash # 새로운 셸을 실행 $ exit # 셸을 종료 셸 명령의 출력 결과를 vim에 붙여넣기 :r ![명령] :r !ls *참고:* 파일의 내용을 끼워 넣고자 할 때 :r [파일명] :r file2.c # 현재 커서의 위치에 file2.c의 내용을 끼워 넣는다