'레지스터 활용'에 해당되는 글 1건

  1. 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을 종료한 뒤에 다시 실행해도 레지스터를 사용할 수 있다.

'Vim > Tutorial' 카테고리의 다른 글

반복적인 작업 녹화하기  (0) 2013.02.06
자동화  (0) 2013.02.05
공백 지우기  (0) 2013.02.05
파일 열기(고급)  (0) 2013.02.05
파일 관련 기능  (0) 2013.02.04
Posted by scii
: