vim을 사용하다보면 입력모드 만큼이나 명령모드도 많이 쓰게 된다. 기본적으로 vim은 명령 입력 프롬프트에서도 탭 키만 누르면 다양한 자동완성을 이미 지원해주고 있다. 오늘은 Ex모드에서 알아두면 유용할 몇 가지 팁을 소개한다.
맵핑을 적용하기
cmap
을 사용하면 Ex모드에서 명령줄을 편집할 때 사용될 키맵을 작성할 수 있다. 입력모드와 마찬가지로 jk
를 눌러서 빠져나온다던지, 혹은 <expr>
키 맵을 사용해서 특정한 변수나 함수 실행 결과를 사용할 수도 있다.
:cnoremap jk <Esc>
하지만, Ex모드에서도 기본적인 커서이동, 삭제와 같은 편집 기능은 물론 자동완성도 제공해준다. 굳이 할 필요는 없을 듯… 또, 기본적으로 위/아래 화살표 키를 눌러서 이전 입력 히스토리를 탐색할 수 있다. (이전 입력 히스토리는 <C-F>
를 눌러서 전체를 보면서 찾을 수도 있다.)
Ex모드의 프롬프트 영역에서는 백스페이스 키외에도 다음과 같은 키를 사용해서 편집 명령을 실행할 수 있다. 매우 당연한 동작들도 있다.
<Left>
,<Right>
: 좌우 화살표키로 커서를 옮길 수 있다.<S-Left>
,<S-Right>
: Shift 를 누르면서 커서를 옮기면 선택된다.<Ins>
: 삽입/수정 모드를 전환한다.CTRL-B
,<Home>
: 명령줄의 처음으로 커서를 이동한다.CTRL-E
,<End>
: 명령줄의 끝으로 커서를 이동한다.CTRL-H
,<BS>
: 커서 왼쪽의 글자를 지운다.<Del>
: 커서 위치의 글자를 지운다.CTRL-W
: 커서 왼쪽의 단어를 지운다.CTRL-U
: 명령줄 전체를 지운다.
명령줄 자동완성
기본적으로 <Tab>
키를 눌러서 입력 중에 자동완성을 실행할 수 있다.
- 명령 이름은 자동완성으로 입력 가능하다.
:tag
명령 다음에는 태그 이름을 자동 완성할 수 있다.- 파일 이름을 인자로 받는 명령이나, 파일 경로의 설정의 경우 경로에 대한 자동완성을 지원한다.
:!cmd
나:r !cmd
등의 명령 다음에는 쉘 명령 자동완성이 가능하다.:set
명령 다음에는 옵션에 대한 자동완성이 지원된다.:if
,:call
다음에는 변수 및 함수에 대한 자동 완성이 지원된다.
<Tab>
키를 통해 자동완성 서브 모드가 발동되면 <C-N>
, <C-P>
를 통해서 다음/이전 항목을 선택할 수 있다. 또 <C-D>
를 눌러서 가능한 전체 후보를 확인할 수 있다. 만약 'wildmenu'
옵션이 설정되어 있다면, 명령줄 자동완성에 대한 후보들을 팝업 바 형태로 볼 수 있다.
<Tab>
/<C-i>
: 자동완성 호출<C-P>
,<C-N>
: 자동완성 항목의 이전/다음 항목 선택<C-D>
: 매치가능한 모든 항목을 표시<C-A>
: 매치되는 모든 항목을 삽입
재밌는 점은 /
키를 통해 검색을 수행할 때, 검색 패턴을 입력하는 영역 역시 커맨드 라인이라는 점이며, 이 경우에는 다음과 같은 키맵이 지원된다.
<C-G>
,<C-T>
: 현재까지 입력한 패턴에 대해서 이전/다음 위치로 커서를 이동시킨다.<C-L>
: 입력한 내용에 매치되는 부분을 찾고, 점점 더 긴 패턴으로 확장한다.
<C-L>
의 경우가 재미있는데, 본문에 match
란 단어가 있을 때, /ma
까지 입력한 후 Ctrl+L을 누르면 t, c, h로 입력된 내용이 점점 매칭되는 패턴으로 확장된다.
고급 편집 – 레지스터
입력모드와 비슷하게 Ex모드에서도 레지스터의 값을 입력할 수 있다. <C-R>
을 누르면 번호 또는 이름이 있는 레지스터의 값을 명령줄에 붙여넣을 수 있다.
"
: 이름 없는 레지스터. 방금 전 복사했거나 삭제한 내용%
: 현재 파일 이름#
: 대체 파일 이름*
: 클립보드 (+
도 가능)/
: 마지막 검색 패턴-
: 마지막 삭제 내용 (한줄 이내)=
: 표현식 패턴
표현식 패턴은 프롬프트가 =
으로 변경되는데, 여기에 vim 스크립트 표현식을 써서 해당 값을 명령줄로 내보낼 수 있다.
그외에 <C-R>
을 누른 후 다음 키를 눌러서 입력을 확장할 수 있다. 이게 나름 유용하다.
<C-R><C-F>
: 커서위치의 파일 이름
: 커서 위치의 파일 이름을 확장<C-R>
<C-P>
: 커서 위치의 단어,<C-R>
<C-W><C-A>
도 비슷함
: 커서 위치의 줄 전체<C-R>
<C-L>
<Insert> : 삽입모드와 덮어쓰기 모드를 전환
<C-M> / <C-J> : Enter키를 누른것과 동일하게 명령을 실행한다.
<C-k>xy : xy 조합으로 digraph 문자를 삽입
<C-r>x : 레지스터 x 의 내용을 삽입
<C-R><C-F> : 커서위치의 파일 이름을 삽입
<C-R><C-P> : 커서 위치의 파일 이름을 전체 경로로 확장하여 삽입
<C-R><C-W> : 커서 위치의 단어를 삽입 <C-R><C-A>는 확장된 단어를 삽입
<C-R><C-L> : 커서 위치의 라인 전체를 삽입
<C-R><C-R> : 커서 위치의 글자가 가리키는 레지스터 삽입
<C-\>e {식} : 해당 표현식의 결과로 전체 명령줄을 교체한다.
<C-D> : 입력된 내용으로 시작하는 명령어들을 표시해준다.
<C-I>, <Tab> : 자동완성
<C-N>, <C-P> : 자동완성 상태에서 전/후 선택
<C-A>
<C-L>