vim의 삽입모드 단어완성
플러그인이 없어도 자동완성을 사용할 수 있습니다.
Vim 입력모드 자동완성 완벽 가이드
Vim에서도 다양한 언어에 대한 맥락에 따른 자동완성 기능을 제공하는 플러그인들이 있습니다. 특히 LSP 프로토콜을 사용하여 언어 서버만 설치하면 현재 코드의 맥락에 따라 적절한 자동완성 기능을 이용할 수도 있죠.
하지만 이러한 ‘최신 고급 기능(?)’을 사용하지 않더라도 Vim은 자체적으로 단순하지만 유용한 몇 가지의 자동완성 기능을 제공합니다. 주로 편집하고 있는 문서나 열려 있는 다른 버퍼의 데이터를 바탕으로 말이죠. 별도의 언어 서버가 없는 텍스트 파일을 편집할 때나, 자동완성 플러그인을 사용하더라도 로컬 파일의 경로를 입력할 때 자동완성 기능의 도움을 받을 수 있다면 상당히 편리할 것입니다.
기본 사용법
i나 a 키를 눌러 삽입 모드로 전환하여 버퍼를 편집하는 상태에서 어떤 키워드의 앞부분을 타이핑한 후 Ctrl+X를 누르면 삽입 중 자동완성 모드를 활성화할 수 있습니다. 이때 어떤 내용으로부터 자동완성 후보를 가져올 것인지에 따라서 그다음에 입력해야 하는 단축키가 달라집니다.
실전 예제: 파일명 자동완성
예를 들어 파일/경로명을 자동완성해야 하는 상황을 생각해봅시다. 1dc269b6-31a2-4196-a062-9f68a46848ed_Export-97515c10-f64d-4398-894f-a0cba7772e5d.zip이라는 긴 파일명을 입력하려 하고, 이 파일이 현재 작업 디렉터리에 있다면 다음과 같이 진행합니다:
i키를 눌러 삽입 모드로 전환1d를 순서대로 눌러 앞 2글자를 입력Ctrl+X누름Ctrl+F누름 (이 시점에 첫 번째 후보의 이름이 자동 입력됩니다)Ctrl+P/Ctrl+N을 눌러 나타난 파일명 중에서 일치하는 것을 선택- 스페이스 바 등을 눌러 자동완성을 확정하고 계속 타이핑
이렇게 하면 긴 파일명을 전부 타이핑할 필요 없이 몇 글자만으로 빠르게 입력할 수 있습니다.
자동완성 확장의 종류
다음은 삽입 모드에서 사용할 수 있는 단어 완성의 종류입니다. 맨 앞에는 단축키를 써놨습니다. 예를 들어 라인 완성을 사용하려면 입력 모드에서 Ctrl+X Ctrl+L을 순서대로 눌러야 합니다.
1. Ctrl+X Ctrl+L : 전체 라인 완성
현재 버퍼나 다른 버퍼에서 입력한 텍스트로 시작하는 전체 라인을 자동완성합니다. 반복적인 코드 패턴이나 주석을 입력할 때 유용합니다.
" 예: "def get_user"로 시작하는 라인이 있다면
" "def"만 입력 후 Ctrl+X Ctrl+L로 전체 라인 완성
2. Ctrl+X Ctrl+N : 현재 파일에서의 키워드
현재 파일에 이미 등장한 키워드를 기반으로 자동완성합니다. 가장 기본적이고 자주 사용되는 기능입니다.
3. Ctrl+X Ctrl+I : Include 파일 키워드
현재 파일과 #include로 포함시킨 파일에서 키워드를 완성합니다. C/C++ 언어 편집 시 특히 유용합니다.
4. Ctrl+X Ctrl+K : 사전 파일 키워드
dictionary 옵션으로 설정한 사전 파일로부터 키워드를 완성합니다. 일반 문서 작성 시 유용합니다.
" .vimrc 설정 예
set dictionary+=/usr/share/dict/words
5. Ctrl+X Ctrl+T : 유의어 사전
thesaurus 옵션으로 설정한 유의어 사전 파일로부터 키워드를 완성합니다. 해당 문자로 시작하는 단어 외에, 매치 가능한 단어의 유의어들도 목록으로 노출됩니다.
" .vimrc 설정 예
set thesaurus+=/path/to/thesaurus.txt
6. Ctrl+X Ctrl+F : 파일 이름/경로
파일 이름과 경로를 자동완성합니다. 상대 경로와 절대 경로 모두 지원합니다.
" 예: ./src/까지 입력 후 Ctrl+X Ctrl+F로 하위 파일 탐색
7. Ctrl+X Ctrl+V : Vim 명령어
Vim 명령어를 자동완성합니다. .vimrc 파일을 편집할 때 특히 유용합니다.
" 예: "setl"까지 입력 후 Ctrl+X Ctrl+V로 "setlocal" 완성
8. Ctrl+X Ctrl+O : Omni 완성
omnifunc로 설정된 함수가 있는 경우, 해당 함수의 반환 값을 기반으로 자동완성합니다. 프로그래밍 언어의 문맥 기반 완성에 사용됩니다.
" 파일 타입별로 자동 설정되는 경우가 많음
" 예: Python의 경우 pythoncomplete#Complete
추가 단축키
각각의 모드에서 매칭되는 후보가 2개 이상이라면 어떤 모드에서든 다음 단축키를 사용할 수 있습니다:
Ctrl+N: 다음 후보로 이동 (Next)Ctrl+P: 이전 후보로 이동 (Previous)Ctrl+E: 자동완성 취소하고 원래 텍스트로 되돌리기Ctrl+Y: 현재 선택된 항목 확정 (Yes)Ctrl+L: 현재 매치에서 한 글자 추가Ctrl+H또는Backspace: 한 글자 삭제
자동완성 모드에서는 Ctrl+E, Ctrl+Y를 사용해서 커서를 움직이지 않고 화면만 스크롤해 볼 수도 있습니다.
completeopt 옵션
completeopt 옵션은 삽입 모드의 자동완성이 작동하는 방식에 대한 설정입니다. 몇 가지 키워드를 쉼표로 구분하여 지정할 수 있습니다.
주요 옵션 설명
menu : 사용 가능한 자동완성 후보가 2개 이상 있는 경우 팝업 메뉴를 통해서 나열해줍니다.
menuone : 사용 가능한 자동완성 후보가 1개만 있는 경우에도 팝업 메뉴를 표시합니다. 단일 후보도 명시적으로 확인하고 싶을 때 유용합니다.
longest : 입력된 문자열이 짧더라도, 자동완성이 시작될 때 후보들의 공통된 앞부분을 자동으로 입력합니다. 여러 후보 중 공통 부분만 먼저 채워져서 더 정확한 선택이 가능합니다.
preview : 메뉴창에서 선택된 항목에 대한 부가 정보가 있다면 이를 미리보기 창에 표시합니다. menu 혹은 menuone 옵션과 같이 사용되었을 때에만 작동합니다.
popup : 현재 선택된 항목에 대한 부가 정보가 있을 때, 이를 팝업창에서 표시합니다. preview보다 우선하며, 마찬가지로 menu, menuone과 같이 사용되어야 합니다. Vim 8.1.1880 이상에서 사용 가능합니다.
popuphidden : popup과 비슷하지만, 초기 상태에서는 팝업이 표시되지 않습니다. 선택 항목을 변경할 때 팝업이 표시됩니다.
noinsert : 초기 자동완성을 적용하지 않습니다. 자동완성 목록에서 선택했을 때부터 후보가 삽입됩니다. 의도하지 않은 텍스트 삽입을 방지할 수 있습니다.
noselect : 자동완성이 호출될 때 초기 선택값이 없는 상태로 시작합니다. noinsert와 함께 사용하면 자동완성을 더 명시적으로 제어할 수 있습니다.
fuzzy : 자동완성 항목에 대해 fuzzy-matching을 적용합니다. 이는 보다 유연하고 직관적인 매칭을 가능하게 합니다. 예를 들어 adn이 admin을 포함한 항목에 매칭됩니다. Vim 9.0 이상에서 사용 가능합니다.
nosort : 자동완성 항목들을 정렬하지 않습니다. 후보들은 원래의 순서에 따라 나타납니다.
권장 설정
개인적으로는 다음과 같이 사용하는 것이 가장 좋은 것 같습니다:
" 기본적이고 무난한 설정
set completeopt=menu,menuone,longest
" 더 명시적인 제어를 원하는 경우
set completeopt=menu,menuone,noselect,noinsert
" 최신 Vim에서 fuzzy matching을 활용하는 경우
set completeopt=menu,menuone,fuzzy,noselect
" popup 기능을 활용하는 경우 (Vim 8.1.1880+)
set completeopt=menu,menuone,popup,noselect
각 옵션의 조합에 따라 자동완성의 동작이 달라지므로, 자신의 워크플로우에 맞게 설정하는 것이 중요합니다.
Vim이 기본적으로 제공하는 자동완성은 단순하지만, 그 단순함이 오히려 빠르고 안정적인 편집 경험을 제공합니다. 복잡한 설정 없이 순정 상태의 vim을 써야하는 경우에도 이 기본 자동 완성 기능을 활용할 수 있다면 보다 편하게 쓸 수 있겠죠.