vim의 삽입모드 단어완성

vim의 삽입모드 단어완성
Photo by Donald Giannatti / Unsplash

vim에서도 다양한 언어에 대한 맥락에 따른 자동 완성 기능을 제공하는 플러그인들이 있습니다. 특히 LSP 프로토콜을 사용하여 언어 서버만 설치하면 현재 코드의 맥락에 따라 적절한 자동완성 기능을 이용할 수도 있죠.

하지만 이러한 '최신 고급 기능(?)'을 사용하지 않더라도 vim은 자체적으로 단순한 몇 가지의 자동 완성 기능을 제공합니다. 주로 편집하고 있는 문서나 열려 있는 다른 버퍼의 데이터를 바탕으로 말이죠. 별도의 언어 서버가 없는 텍스트 파일을 편집할 때나, 자동 완성 플러그인을 사용하더라도 로컬 파일의 경로를 입력할 때 자동완성 기능의 도움을 받을 수 있다면 상당히 편리하겠죠.

i나 a키를 눌러 삽입모드로 전환하여 버퍼를 편집하는 상태에서 어떤 키워드의 앞부분을 타이핑한 후 ctrl+X를 누르면 삽입 중 자동완성 모드를 활성화할 수 있습니다. 이 때 어떤 내용으로부터 자동완성 후보를 가져올 것인지에 따라서 그 다음에 입력해야 하는 단축키가 달라집니다.

예를 들어 파일/경로명을 자동완성해야 하는 상황을 생각해봅시다. "1dc269b6-31a2-4196-a062-9f68a46848ed_Export-97515c10-f64d-4398-894f-a0cba7772e5d.zip"이라는 파일명을 입력하려 하고, 이 파일이 현재 작업 디렉토리에 있다면,

  1. i키를 눌러 삽입 모드로 전환
  2. "1d"를 순서대로 눌러 앞 2글자를 입력
  3. ctrl+x 누름
  4. ctrl+f 누름 (이 시점에 첫번째 후보의 이름이 자동 입력됩니다.)
  5. ctrl+p / ctrl+n을 눌러 나타난 파일명 중에서 일치하는 것을 선택
  6. 스페이스 바 등을 눌러 계속 타이핑

자동 완성 확장의 종류

다음은 삽입모드에서 사용할 수 있는 단어완성의 종류입니다. 맨 앞에는 단축키를 써놨습니다. 예를 들어 라인 완성을 사용하려면 입력모드에서 Ctrl-X ctrl-L을 순서대로 눌러야 합니다.

  1. ctrl+X ctrl+L : 전체라인
  2. ctrl+X ctrl+N : 현제 파일에서의 키워드
  3. ctrl+X ctrl+I : 현재 파일과 #include로 포함시킨 파일 (C언어)
  4. ctrl+X ctrl+K : dictionary 옵션으로 설정한 사전 파일로부터 키워드를 완성
  5. ctrl+X ctrl+T: thesaurus 옵션으로 설정한 유의어 사전 파일로부터 키워드를 완성. 해당 문자로 시작하는 단어 외에, 매치 가능한 단어의 유의어들도 목록으로 노출됨
  6. ctrl+X ctrl+F : 파일 이름, 경로
  7. ctrl+X ctrl+V : Vim 명령어를 자동완성합니다. vimrc 파일을 편집할 때 유용.
  8. ctrl+X ctrl+O : omnifunc 로 설정된 함수가 있는 경우, 해당 함수의 리턴 값
💡
그 외 자세한 내용은 vim에서 :h ins-completion 으로 도움말을 보면 전체 목록을 알 수 있습니다.

각각의 모드에서 매칭되는 후보가 2개 이상이라면 어떤 모드에서든 ctrl+N, ctrl+P를 사용해서 제시어를 선택할 수 있고, 이 모드에서는 ctrl+E, ctrl+Y를 사용해서 커서를 움직이지 않고 화면만 스크롤 해 볼 수도 있습니다.

옵션

completeopt 옵션은 삽입 모드의 자동완성이 작동하는 방식에 대한 설정입니다. 몇 가지 키워드를 컴마로 구분하여 지정할 수 있습니다.

  • menu : 사용가능한 자동완성 후보가 2개 이상 있는 경우 팝업 메뉴를 통해서 나열해줍니다.
  • menuone: 사용가능한 자동완성 후보가 1개만 있는 경우에도 팝업 메뉴를 표시합니다.
  • longest: 입력된 문자열이 짧더라도, 자동 완성이 시작될 때 후보들의 공통된 앞부분을 자동으로 입력합니다.
  • preview: 메뉴창에서 선택된 항목에 대한 부가 정보가 있다면 이를 표시합니다. menu 혹은 menuone 옵션과 같이 사용되었을 때에만 작동합니다.
  • popup: 현재 선택된 항목에 대한 부가 정보가 있을 때, 이를 팝업창에서 표시합니다. preview보다 우선하며, 마찬가지로 menu, menuone 과 같이 사용되어야 합니다.
  • popuphidden: popup과 비슷하지만, 초기 상태에서는 팝업이 표시되지 않습니다. 선택항목을 변경할 때 팝업이 표시됩니다.
  • noinsert: 초기 자동완성을 적용하지 않습니다. 자동완성 목록에서 선택했을 때부터 후보가 삽입됩니다.
  • noselect: 자동완성이 호출될 때 초기 선택값이 없는 상태로 시작합니다.
  • fuzzy: 자동완성 항목에 대해 fuzzy-matching을 적용합니다. 이는 보다 유연하고 직관적인 매칭을 가능하게 합니다. ('adn'이 'admin'을 포함한 항목에 매칭하게 합니다.)
  • nosort: 자동완성 항목들을 정렬하지 않습니다. 후보들은 원래의 순서에 따라 나타납니다.

개인적으로는 다음과 같이 사용하는 것이 가장 좋은 것 같습니다.

set completeopt=menuone,popup,noselect,fuzzy