(Vim) Ex 프롬프트에서의 편집 방법

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>