vim regular expression
Vim/Tutorial 2016. 2. 28. 02:16 |'Vim > Tutorial' 카테고리의 다른 글
C++ code completion (0) | 2016.02.27 |
---|---|
vim Regular Expression (0) | 2013.05.12 |
프로그래밍할 때 유용한 기능 (0) | 2013.02.06 |
반복적인 작업 녹화하기 (0) | 2013.02.06 |
자동화 (0) | 2013.02.05 |
C++ code completion (0) | 2016.02.27 |
---|---|
vim Regular Expression (0) | 2013.05.12 |
프로그래밍할 때 유용한 기능 (0) | 2013.02.06 |
반복적인 작업 녹화하기 (0) | 2013.02.06 |
자동화 (0) | 2013.02.05 |
vim regular expression (0) | 2016.02.28 |
---|---|
vim Regular Expression (0) | 2013.05.12 |
프로그래밍할 때 유용한 기능 (0) | 2013.02.06 |
반복적인 작업 녹화하기 (0) | 2013.02.06 |
자동화 (0) | 2013.02.05 |
일반적인 정규 표현식(Regular Expression) 이랑 vim 에서 쓰이는 정규 표현식이랑 약간 다른 점이 있다.
그 중에 가장 크게 다른 점만을 설명하겠다.
일반적인 정규 표현식에서 탐욕적(greedy) 수량자와 게으른(lazy) 수량자가 있다.
문법은 이렇게 탐욕적 수량자 뒤에 '?' 를 붙이면 된다.
하지만 vim에서는 완전히 다른 문법이다.
Regular Expression |
vim Built-in Regular Expression |
||
* (0 or more) |
greedy matching |
* (0 or more) |
greedy matching |
+ (1 or more) |
greedy matching |
\+ (1 or more) |
greedy matching |
*? (0 or more) |
non-greedy matching |
\{-} (0 or more) |
non-greedy matching |
+? (1 or more) |
non-greedy matching |
\{-n,} (1 or more) |
non-greedy matching |
vim regular expression (0) | 2016.02.28 |
---|---|
C++ code completion (0) | 2016.02.27 |
프로그래밍할 때 유용한 기능 (0) | 2013.02.06 |
반복적인 작업 녹화하기 (0) | 2013.02.06 |
자동화 (0) | 2013.02.05 |
탭 대신 공백 사용하기
탭을 눌렀을 때 탭 대신 몇개의 공백 문자를 넣는 :set expandtab 옵션을 제공한다. (줄여서 et)
예를 들어, 설정 파일에 set et ts=4 로 설정되어 있다면 사용자가 탭을 누르는 순간 네 칸의 공백 문자가 입력된다.
Tip: 진짜 탭 문자를 입력하고 싶다면..
expandtab 옵션이 설정된 상태에서 진짜 탭 문자를 입력하려면, 특수 문자를 입력할 때 썼던 <CTRL-V> <CTRL-I> 로 입력하면 된다.
기존 탭 문자 <----> 공백 변환
et 옵션은 새로 입력하는 탭만 공백으로 바꿀 뿐 기존의 탭 문자들은 건드리지 않는다. 따라서 기존의 탭 문자들도 모두 공백으로 변환하거나 반대로 공백을 탭으로 변환하려면 :retab 명령을 사용해야 한다. (줄여서 ret)
retab 명령은 expandtab 옵션이 on 상태이면 탭을 공백으로 변환하고, off 상태면 공백을 탭으로 변환한다.
:[range]ret [new_ts]
여기서 new_ts 는 연속된 공백 문자의 길이이다. 만약 :ret 4 라고 명령했다면 변환 대상은 공백 문자 네칸이 된다. new_ts 옵션을 생략하면 tabstop 설정을 따른다.
예를 들어, expandtab 옵션을 on 상태로 만들고 retab을 실행하면 기존에 입력된 탭을 공백 네 칸으로 변환한다.
:set et
:ret 4
또한 expandtab 옵션을 off 상태로 만들고 retab 을 실행하면, 공백 여덞 칸을 탭 하나로 변환한다.
:set noet
:ret 8
단, ret 명령을 사용하여 공백을 탭으로 변환할 때, 공백 문자로만 구성된 부분은 사용자가 의도적으로 입력했다고 판단하여 변환하지 않는다.
그러나 이를 무시하고 모든 공백을 탭으로 변환하고 싶다면 강제 명령어인 느낌표(!) 를 붙여 다음처럼 명령해야 한다
:[range]ret! [new_ts]
C로 작성된 소스코드를 열면, 자동으로 탭을 공백으로 변환하는 방법
set et
au FileType c retab
단어 완성
프로그래밍을 하다보면 변수나 함수 혹은 메소드 이름에서 오타가 발생하기도 한다. 이를 위해, 단어 완성(keyword completion) 기능이 도입되었다.
단어 자동 완성
단어 자동 완성은 본문에 이미 등장한 단어나 예약된 단어의 앞 글자 몇 개만 입력한 후 <CTRL-N> 을 누르면 나머지를 완성시켜 주는 기능이다.
더하기 낱말 모드
aa까지만 입력한 뒤 <CTRL-N> 을 누르면, aaaaa까지만 완성되고 @nadf.vom 은 완성되지 않는다. 이는 @ 이 단어에 포함되지 않는 문자 부호라서 발생하는 문제이다.
이런 경우를 대비하여 더하기 낱말 모드가 존재한다. 일단 aaaaa까지 완성된 상태에서 <CTRL-X><CTRL-N> 을 누르면 aaaaa@sdf.vim 이 완성된다.
단어 완성 기능의 확장 모드(입력 모드에서 사용)
<CTRL-X> <CTRL-N> 더하기 낱말 모드로 작동하여 추가 검색을 함.
<CTRL-X> <CTRL-K> <CTRL-N> 사전 검색 모드로 작동한다.
HTML 변환하기
소스코드를 웹에 게재했을 때 들여쓰기나 줄바꿈 모양이 망가지는 경우가 있다. 웹에 프로그래밍 소스코드를 게시하려면 많은 부분을 수정해야 하는데, 간단한 코드라면 직접 수정해도 되겠지만 코드가 길어지면 이 작업도 만만치 않다. 그래서 vim에서는 현재 화면에 보이는 상태를 HTML로 변환하는 기능이 탑재되어 있다.
:TOhtml 을 명령하면 된다.
생성된 HTML에서 <head>나 <body> 등 html 문서에 필요한 모든 뼈대가 포함되어 있으므로, 코드만 다른 곳에 붙이고 싶다면 <body> 태그부터 </body> 태그 앞까지만 복사하면 된다.
C++ code completion (0) | 2016.02.27 |
---|---|
vim Regular Expression (0) | 2013.05.12 |
반복적인 작업 녹화하기 (0) | 2013.02.06 |
자동화 (0) | 2013.02.05 |
오퍼레이션 펭딩 모드 / 약어 매크로 / 레지스터 활용 (0) | 2013.02.05 |
반복적인 작업을 녹화해서 작업하는 동영상이다. 이것은 ID랑 똑같은 것을 찾아서 뒷 부분에 이메일 주소를 넣어주는 영상이다.
지금은 몇 줄 안되서 그러지만, 이것이 수십, 수백, 수천줄이면 정말 상당히 유용할 것이다.
녹화는 사용자의 작업을 기억해두었다가 다시 작동시키는 일종의 매크로 기능이다.
녹화 시작
qa를 누르면 상태바에 recording 이라는 메시지가 표시되면서 녹화가 시작된다.
q 는 녹화를 시작하거나 종료할 때 쓰는 명령이다.
a 는 녹화할 매크로의 이름이다. 매크로 이름으로는 영문 소문자를 사용해야 한다. 녹화된 내용은 녹화가 끝난 후 동일한 이름의 레지스터에서 확인할 수 있다.
ID 복사
고객을 식별하는 기준이 되는 고객 번호를 복사해야 하므로, ^ 눌러 커서의 행 맨 앞부분으로 이동시킨 후 yiw 명령을 실행하여 단어를 복사한다.
고객 번호로 검색
복사했던 번호를 /<CTRL-R>" 을 명령하여 찾는다. 그 후 2w를 눌러 이메일 앞까지 커서를 옮긴다. 그 다음 y$를 하여 복사한다.
※ CTRL-R" 이것은 ""p 와 같고, 위의 영상으로선 "ap 와 같다.
clientlist.txt에 주소 붙여넣고 녹화 끝내기
A를 눌러 행의 맨 뒤로 커서를 이동, 입력 모드로 전환하여 쉼표를 입력하고 ESC를 눌러 입력 모드를 종료한다. 그 다음 p를 눌러 메일 주소를 붙여 넣는다.
녹화된 내용 재생
@a 라고 명령한다.
@ 은 녹화를 재생하는 명령이다.
a 는 녹화했던 레지스터의 이름이다.
그리고 @@ 는 바로 이전에 실행했던 녹화 내용을 다시 실행하는 명령이다.
녹화와 재생 명령어
q<매크로 이름> 녹화를 시작한다. 매크로 이름은 {a-zA-Z} 중 선택해야 한다.
@<매크로 이름> 매크로를 실행한다. 매크로 이름은 {a-z} 중 선택해야 한다.
@@ 바로 이전에 실행된 매크로를 재실행한다.
대문자 이름은 바로 이 레지스터를 수정할 때 사용한다.
즉, qA 로 녹화를 시작하면, a 레지스터에 녹화된 내용에 새로 녹화하는 내용이 추가된다. 만약 a 레지스터에 녹화한 적이 없으면서 qA 로 녹화를 시작한다면 qa 명령과 동일한 기능을 수행한다.
녹화 내용 확인하기
:reg a 로 내용을 볼 수 있다.
^W 는 <CTRL-W> 이다.
^M 은 Enter 이다.
^[ 는 ESC 이다.
범위를 지정하여 매크로 수행하기
각 행마다 수동으로 @a를 누르는 과정은 여전히 비효율적이다. 만약 수정할 파일이 수천 행 정도로 길다면 보통 고역이 아닐 것이다. 그래서 문서 전체를 한 번에 처리할 수 있는 방법을 알아야한다.
:%normal! @a
% 는 문서 전체를 의미한다.
normal 은 바로 뒤에 나오는 문자열을 일반 모드의 명령어로 인식하라는 뜻이다. (norm 으로 축약 가능)
ex) %normal! ^^X 이것은 맨 왼쪽으로 가서 숫자를 1씩 감소시키라는 명령이 된다.
숫자를 5씩 증가 시키려면 %normal! ^^A
매크로 수정하기
이메일 주소에 ""로 감싸려고 한다면, 다시 녹화를 진행하는 것보단 수정하는 편이 더 효율적이다.
"ap 명령하면 레지스터 a의 내용이 입력된다. 이제 이것을 가지고 수정하면 된다.
"ay$ 를 명령하여 레지스터 a 의 내용을 업데이트 시킨다.
Tip:
여기서는 레지스터 전체를 불러오고 내용을 수정한 후, 수정된 내용 전체를 레지스터 a에 다시 입력했다.
하지만 레지스터의 맨 뒤에 내용을 추가하는 것과 같이 간단한 경우에는 대문자로 녹화를 하면 된다. 예를 들어 위와 같은 경우는 qA 로 녹화하면 추가 모드로 녹화가 진행된다.
※ q: 와 q/ 명령
q: 는 명령행 모드의 과거 기록을 보여준다.
q/ 는 과거 검색어 목록을 보는 기능이다.
이전에 실행했던 명령어나 검색어의 목록을 개별 창에서 보면서 선택할 수 있는 유용한 기능이다. q:나 q/ 로 보이는 이력 창은 일반 창과 동일하게 작동하므로 :q 로 닫으면 된다.
현재 디렉토리에 있는 모든 파일들의 <stdio.h> 문장을 찾아서 <aaaaa.h> 로 바꾸는 작업.
:n * 는 현재 디렉토리의 모든 파일을 버퍼로 가져온다.
999@b 는 b 레지스터를 999번 재생한다. (현재 디렉토리의 파일이 999개 미만이라고 가정)
그리고 여기서 가장 중요한 것은 %s/<stdio.h>/<aaaaa.h>/ge 이 부분이다.
특히, 이 부분에서 e 이것이다. e 는 에러 발생시 무시하는 명령이다. 이 명령이 없으면 찾는 문자열이 없을 경우 재생이 중단되어버린다.
vim Regular Expression (0) | 2013.05.12 |
---|---|
프로그래밍할 때 유용한 기능 (0) | 2013.02.06 |
자동화 (0) | 2013.02.05 |
오퍼레이션 펭딩 모드 / 약어 매크로 / 레지스터 활용 (0) | 2013.02.05 |
공백 지우기 (0) | 2013.02.05 |
vim 의 자동화 기능은 매우 간단하고 직관적이지만 강력하다. 자동화를 잘 사용하면 지루한 작업에서 해방될 수 있다.
키 매핑(단축키)
키 매핑은 특정 키가 눌릴 때, 미리 설정한 기능을 호출하도록 한다. 약어 매크로와 크게 다를 것은 없지만, 약어 매크로가 입력 모드, 명령행 모드에서만 사용가능한 반면,
키 매핑은 모든 모드에 대해 사용할 수 있다는 점이 다르다.
vim에는 일반 모드, 입력 모드, 명령행 모드, 비주얼 모드에 따라서 키 매핑을 설정하는 명령어가 다르다. 하지만 nmap 명령의 n은 일반(normal) 모드를, imap 명령의 i는 입력(insert) 모드를, vmap 명령의 v는 비주얼(visual) 모드를 의미하므로 따로 외울 필요없이 이해할 수 있다.
일반, 입력, 비주얼, 명령행 모드의 단축키 지정 방법
nmap key command 일반 모드에서 key를 누르면 command를 실행
imap key command 입력 모드에서 key를 누르면 command를 실행
vmap key command 비주얼 모드에서 key를 누르면 command를 실행
cmap key command 명령행 모드에서 key를 누르면 command를 실행
이 외에도 omap, xmap, smap, map!, lmap 등 다양한 단축키 매핑 명령이 있다. vim의 도움말 참조.
단축키를 해제하는 명령
map 대신 unmap을 사용하면 된다.
모드에 따라 각각 nunmap, iunmap, vunmap, cunmap 등으로 하면 된다.
자동 명령
자동 명령은 특정 파일을 열거나 저장하는 이벤트가 발생할 때 사용자가 지정한 vim 명령을 자동으로 수행시키는 기능이다.
이 기능을 이용하면, 파일 형식에 따라 자동으로 특정 옵션을 켜거나 특정 명령을 내리는 것이 가능해진다.
autocmd는 자동 명령을 의미하며 au로 많이 쓰인다.
BufRead 는 파일을 읽는 이벤트, BufNewFile은 파일을 새로 만드는 이벤트를 의미한다.
ex) autocmd BufRead,BufNewFile *.txt colo shine|set ts=2 sw=2
예를 들어 이 같이 설정이 되어있다면, 이것은 확장자가 txt인 파일을 새로만들거나 열 때, 컬러스키마를 shine으로 하고 들여쓰기 관련 옵션을 2칸으로 설정하라는 뜻이된다. 그리고 이렇게 여러 명령을 실행하는 경우는 수직 바(|)를 사용하여 구분한다.
파일 관련 이벤트에 따른 자동 명령
자동 명령에 사용되는 파일 관련 주요 이벤트
BufNewFile 파일을 새로 생성했을 때의 이벤트
BufRead 파일을 읽은 후의 이벤트
BufWrite 파일을 저장한 후의 이벤트
SwapExists 스왑 파일이 이미 존재하는 경우의 이벤트
파일을 열 때 스왑 파일이 존재하면 중복해서 여는 것으로 보고 에러가 발생한다. 그런데, 이벤트를 활용하면 자동으로 읽기 전용으로 열 수 있다.
au SwapExists let v:swapchoice='o'
:swapchoice 라는 변수에 영문 소문자 o를 넣으라는 vim 내장 스크립트 구문이다. 여기서 let은 변수를 지정하는 명령어이다. 따라서 스왑 파일이 존재하면(SwapExists) 자동으로 v:swapchoice 변수를 영문자 o로 설정한다.
v:swapchoice 변수는 차후 vim이 스왑 파일이 존재하는 경우 어떻게 작동할 지 경정하는데, o는 읽기 전용(read-only)으로 파일을 연다는 의미이다.
다른 예를 들자면, 파일을 중복해서 열었을 때 나중에 연 vim은 자동으로 종료하게끔 하려면 이렇게 하면 되겠다.
let v:swapchoice='q'
그리고 확장자가 c나 h인 파일을 이 같이 지정하려면 이렇게 하면 되겠다.
au SwapExists *.[ch] let v:swapchoice='q'
파일 타입에 따른 자동 명령
만약 C++파일을 열 때 색상 테마를 slate타입으로 바꾸는 자동 명령을 작성해 보면 이렇게 될 것이다.
au BufRead,BufNewFile *.cpp colo slate
그런데, 작동은 하겠지만 완벽하지는 않다. 왜냐하면 C++ 파일의 확장자는 cpp 외에도 cc, cxx, 대문자 C 등으로 다양하기 때문에, 이 확장자들을 모두 등록해야 한다.
여러 파일을 적을 때는 쉼표로 구분하여 다음과 같이 설정해야 한다.
au BufFead,BufNewFile *.cpp,*.cc,*.cxx,*.C colo slate
헌데 이 방법은 조금 지저분하고 비효율적으로 보인다. 그래서 파일 형식을 구분할 수 있는 새로운 이벤트가 있다.
au FileType cpp colo slate
FileType 은 filetype 옵션을 확인하여 자동 명령을 실행하는 이벤트이다. C++ 파일의 filetype은 cpp 이다.
※ vim에서 지원 가능한 파일 타입을 보려면 $VIMRUNTIME/ftplugin 에서 찾아 볼 수 있다.
자동 명령 그룹화와 해제
자주 사용하지는 않지만 autocmd를 해제하는 au! 명령과 자동 명령을 그룹으로 묶는 augroup 명령이 있다.
이 명령어는 상관 관계가 있는 명령어들을 묶어서 필요에 따라 실행하거나 제거하는 용도로 많이 사용한다.
augroup UserDefinedColorScheme
au!
au FileType sh,perl,python,ruby colo shine
au FileType c,cpp colo slate
au BufRead,BufNewFile *.txt setfiletype text
au FileType text colo evening
augroup End
이것은 UserDefinedColorScheme 란 그룹을 만들고 몇몇 기능을 설정한 예제이다. 이렇게 하면 해당 자동 명령 그룹의 기능이 중복 설정되는 것을 방지 할 수 있다.
※ autocmd는 사용자에게 다양하게 확장된 기능을 제공할 수 있다. 더 많은 이벤트 목록은 autocmd-events 도움말 항목에서 확인.
프로그래밍할 때 유용한 기능 (0) | 2013.02.06 |
---|---|
반복적인 작업 녹화하기 (0) | 2013.02.06 |
오퍼레이션 펭딩 모드 / 약어 매크로 / 레지스터 활용 (0) | 2013.02.05 |
공백 지우기 (0) | 2013.02.05 |
파일 열기(고급) (0) | 2013.02.05 |
오퍼레이션 펜딩 모드(operation pending mode) 는 새로운 모드라기 보다는 일반 모드의 기능 중 명령어가 지연되는 방식을 의미한다.
오퍼레이션 펜딩 모드
예를 들어, d 명령이 실행되기는 하지만 뒤따라오는 추가 명령어가 입력되기까지는 대기 상태(pending)에 머무른다. 이렇게 다른 명령어를 받기 위해 대기하는 상태를 오퍼레이션 펜딩 모드라고 한다.
만일 vim의 모움말 문서를 보는데 일반 모드의 명령어를 여러 개의 키 입력으로 실행해야 한다면 오퍼레이션 펜딩 모드를 사용하는 명령어일 가능성이 매우 높다.
범위 지정하기
vim의 모움말을 보면 오퍼레이션 펜딩 모드에 추가로 입력되는 키 중에 {motion}이라고 부르는 것들이 종종 등장하는데, 이는 단어 사이나 행, 특정 위치로 이동하는 키 입력을 기리키며, 이때 입력된 이동 범위가 명령어가 작동할 범위가 된다.
{motion}을 사용하는 명령어의 예
y{motion} {motion}만큼 복사
d{motion} {motion}만큼 삭제
c{motion} {motion}만큼 변경(삭제 후 입력 모드로 전환)
이렇게 오퍼레이션 펜딩 모드를 사용하는 이유는 나중에 단축키나 자동화를 배울 때 오퍼레이션 펜딩 모드에 따라 다양한 기능을 구현할 수 있기 때문이다.
Tip: 커서 위치의 단어를 선택하는 {motion}
dw 명령으로 단어 하나를 온전히 삭제하려면 커서의 위치가 단어의 시작 부분이어야 하는 단점이 있다. 이런 단점을 보완하여 커서 위치가 어디든 상관 없이 단어 전체를 삭제 범위로 지정할 수 있는 aw와 iw 명령이 존재한다.
이들은 오퍼레이션 펜딩 모드로 작동하는 다은 명령어와 결합하여 daw, diw 혹은 caw, ciw 처럼 사용된다.
차이점은, aw가 단어의 앞뒤 공백을 포함하는 반면, iw는 공백을 포함하지 않는다는 점이다. 단 aw의 공백은 문맥에 따라서 앞부분일 수도 있고 뒷부분일 수도 있다.
이 기능들은 뒤에서 다룰 녹화, 반복 작업, 단축키에서 유용하게 써먹을 수 있다.
약어 매크로
약어(abbreviation) 매크로는 입력 모드나 명령행 모드에서 길고 복잡한 문장을 짧은 단어로 대체하여 입력할 수 있는 기능이다.
예를 들어 mymail 이라고 하면 asldkfjl@nasl.com 이 입력되게 한다. 혹은, 입력 모드에서 'time0' 이라고 입력하면 현재 날짜와 시간이 입력되게 한다.
이런 기능을 구현하려면 .vimrc 파일에 코드 내용을 넣어두면 된다.
이제 mymail 이라고 입력한 후 space, tab 혹은 문장부호를 누르면, mymail단어가 즉시 메일주소로 바뀐다. 한편 mymailaddress라고 입력했을 때는 'mymail' 이 독립된 단어로 인식되지 않으므로 매크로가 작동하지 않는다.
이때 억지로 약어를 변환하고 싶다면 <CTRL-]> 를 사용하면 된다. 반대로 'mymail' 이라는 단어를 입력했지만 약어로 해석되기를 원하지 않는다면 <CTRL-V> 를 누르면 된다.
ia 는 입력 모드에서만 작동하는 약어이다. 그리고 입력 모드에서 <C-R> 은 레지스터 버퍼를 붙여 넣는 단축키이며 = 는 레지스터 이름이 된다.
= 레지스터는 특수 키나 함수 같은 기능을 호출할 때 주로 사용하는데 여기서는 현재 시간을 출력하는 vim 내장 스크립트 함수인 strftime을 호출하는 데 사용되었다.
약어 설정과 해제
ab나 ia와 관련된 주요 기능 (약어의 주요 기능) 도움말의 abbreviation 참고
:ab [lhs] 현재 설정된 모든 약어 목록을 출력한다. lhs에 약어를 지정하면 해당 약어의 정보만 출력한다.
:ab {lhs} {rhs} 약어 lhs를 rhs로 설정한다.
:unab {lhs} 약어 lhs를 해제한다.
:abclear 설정된 모든 약어를 해제한다.
:ia {lhs} {rhs} ab와 기능은 같지만 입력 모드에서만 작동한다.
:ca {lhs} {rhs} ab와 기능은 같지만 명령행 모드에서만 작동한다.
명령행 모드에서만 작동하는 ca는 여러모로 쓸모가 있다. 예를 들어 :w나 :wq 를 잘못 입력하여 :ㅈ, :ㅈㅂ 가 입력되었을 때 이를 자동으로 변환해 준다.
Tip: 한글이 포함된 약어 매크로가 작동하지 않을 경우
간혹 한글이 포함된 약어가 제대로 작동하지 않는 경우가 있다. 이는 .vimrc 파일과 편집하는 문서 파일의 인코딩 형식(fileencoding)이 일치하지 않기 때문이다. 예를 들어 유닉스 계열의 vim에서는 .vimrc 파일이 UTF-8 형식으로 저장되는데, 현재 편집하는 파일은 EUC-KR 형식이라면 이런 문제가 발생한다.
반대로 윈도우용 vim에서는 _vimrc 파일이 EUC-KR로 저장되므로, UTF-8로 저장된 파일을 편집하면 같은 문제가 발생한다.
이런 문제를 해결하려면 설정 파일과 편집할 파일의 fileencoding을 통일시켜야만 한다.
편집 관련 레지스터
레지스터는 크게 세 가지로 나눌 수 있다.
첫째는 편집 과정에서 복사나 삭제했던 데이터를 저장하는 레지스터.
둘째는 vim의 각종 기능에 사용된 인수를 기억해두는 레지스터.
셋째는 파일에 관련된 레지스터.
레지스터 목록(편집에 관련된 레지스터)
"" 가장 최근에 복사, 삭제된 데이터
"0 가장 최근에 복사(yank)된 데이터
"1~"9 가장 최근에 삭제된 데이터(시간순, 1번이 가장 최근 데이터)
p는 "" 레지스터의 내용을 붙여넣는 명령어이다. 만일 "3 레지스터를 붙여 넣고자 한다면 "3p 라고 명령하면 된다. 따라서 p 명령도 ""p와 같은 의미라고 볼 수 있다.
기능 관련 레지스터
기능에 관련된 레지스터의 이름에는 기호가 많다. 그런데 굳이 외울 필요는 없다.
왜냐하면, (-)는 가장 최근에 한 라인 이내로 삭제한 데이터, 슬래쉬(/)는 검색하는 키, 콜론(:)은 명령행 모드로 바꾸는 키, 마침표(.)는 최근 명령어를 반복하는 키이기 때문이다. 따라서 대부분 각 기능을 사용하는 키가 바로 기능 관련 레지스터의 이름이 된다.
파일 관련 레지스터
파일에 관련된 레지스터의 이름도 직관적이다.
%는 현재 파일명을 의미한다. 즉, 현재 파일명은 문서 전체를 의미한다는 말이다.
#은 이전에 열었던 파일명이다.
사용자 등록 레지스터
영문자는 사용자가 임의로 등록할 수 있는 레지스터이다. 그런데 레지스터 이름에 소문자를 쓰는 경우와 대문자를 쓰는 경우가 다르기 때문에 주의해야 한다.
"byiw 라고 명령하면, b 레지스터에 대해 yiw 명령을 실행한다. 여기서 iw는 공백을 포함하지 않는 단어 단위 선택이므로 공백을 제외하고 커서 아래의 단어만 b 레지스터에 복사된다.
:reg b 명령을 입력하면 볼 수 있다.
특정 레지스터의 이름을 지정해서 내용을 확인할 대는 앞의 겹 따옴표는 생략할 수 있다. 따라서 :reg b 혹은 :reg "b는 동일한 명령이다.
"Byy 는 B 레지스터에 대해 yy명령을 실행한다는 뜻이다. 하지만 명령 후 :reg 로 전체 레지스터 목록을 확인해보면 B레지스터가 존재하지 않는 것을 보게 된다. 대신 b 레지스터의 내용이 바뀌어 있는 것을 확인할 수 있다.
즉, 대문자 레지스터는 기존의 소문자 레지스터의 뒤에 내용을 추가하는 명령으로 작동한다.
※ ^J 는 개행 문자를 의미, ^I 는 탭을 의미
레지스터 복사, 삭제, 붙여넣기
레지스터로 확장된 복사, 삭제, 붙여넣기
"{reg}y{motion} {reg} 레지스터에 {motion}에 해당하는 부분을 복사한다.
"{reg}p {reg} 레지스터의 내용을 현재 커서 뒷부분에 넣는다.(개행 문자가 포함된 경우 커서의 아래 행에 넣는다)
"{reg}P {reg} 레지스터의 내용을 현재 커서의 앞부분에 넣는다.(개행 문자가 포함된 경우 커서의 윗 행에 넣는다)
"{reg}d{motion} {reg} 레지스터에 {motion} 에 해당하는 부분을 잘라 넣는다.
CTRL-R{reg} 입력 모드에서만 사용하는 명령으로 {reg} 레지스터에 붙여 넣습니다. "{reg}를 생략하면 ""레지스터를 가리킨다.
※ 레지스터의 내용은 .viminfo 파일에 저장되므로, vim을 종료한 뒤에 다시 실행해도 레지스터를 사용할 수 있다.
공백 라인 지우기
:g/^$/d
문서전체(g)에서 처음과 끝이 만나는(^$) 것을 지운다(d).
문장 끝 공백 지우기
:%s/ \+$//g
문장 맨끝에서 ($) 스페이스가 있는 것을 모두 지운다.
자동화 (0) | 2013.02.05 |
---|---|
오퍼레이션 펭딩 모드 / 약어 매크로 / 레지스터 활용 (0) | 2013.02.05 |
파일 열기(고급) (0) | 2013.02.05 |
파일 관련 기능 (0) | 2013.02.04 |
문자, 문자열 검색/치환 (0) | 2013.02.02 |