vim은 사실 기본적으로 현재 버퍼에 입력된 키워드를 기반으로 자동완성을 제공한다. 다만 그게 <Tab>
키가 아닐 뿐이다. 어떤 내용이든 입력하는 사이에, 입력모드에서 <C-n>
을 입력해보자. (Ctrl + N) 그러면 커서 왼쪽의 단어의 일부로 시작하는 현재 버퍼 내의 키워드들로 자동완성이 시작된다. (후보가 2개 이상이면 팝업으로 표시된다.)
이렇게 자동완성 모드가 시작되면 <C-n>
은 다음 후보로 진행하며, 이전 후보로 진행하는 것은 <C-p>
이다.
이 자동완성 후보 목록은 'complete'
옵션에서 정할 수 있는데, 이 옵션은 콤마로 연결되는 문자들의 목록이고 다음과 같은 의미를 갖는다. 생각보다 엄청많고 별도의 설명이 또 필요할 것 같지만.. 여기서는 생략한다. 기본적으로 이 값은 . u b t i
로 정해진다.
.
: 현재 버퍼의 키워드w
: 다른 창에 표시되는 버퍼들의 키워드b
: 버퍼 리스트에 있는 다른 로딩된 버퍼들의 키워드u
: 버퍼 리스트에 있는 언로드된 버퍼들의 키워드t
: 태그 자동 완성i
: 현재 파일과 include 된 파일들 (이상 디폴트 설정)U
: 버퍼 리스트에 없는 버퍼의 키워드k
: 자동완성 사전의 키워드. 이 사전은'dictionary'
옵션으로 설정할 수 있다.kspell
: 활성화된 문법 체크 데이터k{dict}
: 별도 지정한 사전 파일s
: 동의어 사전의 파일. 동의어 사전은thesaurus
옵션으로 설정한다.s{tsr}
: 지정한 동의어 사전 파일d
: 현재 파일과, include 파일에서 정의된 이름과 매크로]
:t
와 같다.
입력모드에서 <C-n>
, <C-p>
완성은 일종의 키워드 확장과 비슷하다 볼 수 있다. 사실 vim의 자동완성은 이것으로 끝이 아니다. 입력 중에 <C-x>
를 눌러보자. 명령줄에 다음과 같은 내용이 표시될 것이다.
-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)
이 표시는 입력 중에 다시 Ctrl-X 서브 모드로 진입했다는 것이다. 이 모드는 여러 타입의 자동완성을 비롯해서 여러 가지 편집에 대한 편의 기능을 제공한다. 일종의 입력 모드에서 발동할 수 있는 빠른 추가 기능이라 할 수 있다. 사실 위에서 괄호안에 있는 ^D
와 같은 표현이 모두 Ctrl+D 처럼 키를 누르면 된다는 의미이다. (참고로 여기서 표기는 대문자로 했지만, 모두 <C-d>
와 같이 소문자를 그대로 누르면 된다.
^E
,^Y
: 입력중에 아래/위로 스크롤 할 수 있다. 다른 키를 누르면 다시 입력모드로 복귀한다. 만약 다른 서브모드에서 팝업을 띄운 상태라면, 이 키들을 눌렀을 때 자동완성을 중단하고 다시 입력모드로 복귀하게 된다.^L
: 현재 입력중인 라인과 앞부분이 같은 이전의 전체 라인을 열려있는 버퍼들로부터 가져와 바로 완성한다. 참고로^L
을 계속 누르면 다음 후보로 넘어갈 수 있으며,^N
,^P
를 사용해서 다음/이전 선택을 할 수도 있다. 이는 다른 자동완성 모드에서도 동일하게 적용된다.^N
: 현재 파일에서의 키워드에서 자동완성^I
: 현재파일 + include 파일에서 자동완성^K
,^T
: 사전, 동의어 사전에서 자동완성^]
: 태그에서 자동완성^F
: 현재 디렉토리의 파일 이름에서 자동완성^D
: 이름 정의 및 매크로에서 자동완성 (C)^V
: Vim 명령으로부터 자동완성^U
: 사용자 정의 함수로부터 자동완성. 사용자 정의 함수는completefunc
옵션에서 지정한 함수이다.^O
: omni 함수로부터 자동완성. 이 함수도 자동완성에 사용되는 사용자 설정함수인데, 주로 파일 타이별 자동완성에 사용된다. 대부분의 자동완성 플러그인들이 이 omnifunc 값을 만들어준다고 보면 된다.s
: Ctrl 키 없이 그냥s
만 누른다. 철자체크 데이터로부터 자동완성한다.
물론 기본 상태에서는 omni
함수나 completefunc
함수도 없고 사전이나 철자 데이터가 없기 때문에 제한적이라 느낄 수 있으나, 사실 라인완성이나 파일이름 완성, 명령어 완성등은 엄청나게 편리하게 사용될 수 있다. 이중에 몇 가지는 기억해두면 좋겠다.
커스텀 자동 완성
^X^U
나 ^X^O
를 눌러서 활성화하는 자동 완성은 사용자 정의 함수에 의한 자동 완성을 지원한다. 전자의 경우, 'completefunc'
옵션에 지정된 함수를 사용하여 자동 완성 후보를 만들고, 후자는 'omnifunc'
옵션을 사용해서 자동 완성 후보를 만든다. 기본 설치 상태의 vim에서는 omnifunc
옵션은 기본 파일 타입 지원 스크립트를 통해서 해당 타입의 기본적인 키워드들을 자동 완성할 수 있도록 도와준다. (일례로 $VIM/autoload/python3complete.vim
과 같은 옴니 자동완성 지원 파일들이 기본적으로 함께 설치돼 있음.
직접 자동 완성 함수를 작성하여 특정 상황에 써먹을 수 있는 자동 완성 기능을 만들고 싶다면 아래 글을 참고하자.