Neovim에서 사용가능한 연관문서 검색 기능


요약

해냈다

위 스크린샷과 같이 Language Server Protocol(LSP)을 이용한 문서 색인을 만들고, Neovim 등의 에디터에서 연관문서를 쿼리할 수 있는 인터페이스를 구현해 보았다.

배경

블로그든 뭐든 문서를 작성하기 시작하면 색인 구현이 번거롭다. 전문 검색이야 grep 등의 툴로 어찌어찌 해낸다고 하더라도, 문서 임베딩을 통한 연관문서 검색을 구현하겠다고 마음을 먹어도 임베딩 계산 및 저장을 관리하는 게 쉽지 않다.

그런데 Language Server를 이용하면 관리에 필요한 부담을 줄일 수 있다. 이미 널리 알려진 프로토콜이기 때문에 대부분의 편집기에서 지원하고 있어서, 내가 그냥 server 구현체만 하나 만들면 해당 프로토콜 인프라에 빌어붙어서 초기설정을 크게 줄일 수 있다. 이론적으론 그냥 vim 설정파일에 한두줄 추가하면 바로 설치 및 사용이 가능해지는 것이다.

대략의 디자인

따라서 서버가 문서 색인 및 쿼리 응답 기능을 구현하고 나면, 클라이언트는 그냥 해당 쿼리를 호출만 해도 연관문서 목록을 받아볼 수 있는 것을 목표로 했다.

처음 구상 단계에선 LSP의 textDocument/references 를 써서 가볍게 목록만 전달하면 될 것으로 생각했으나, 실제 구현하고 보니 클라이언트에서 등장 순서 기준으로 정렬을 해버리는 바람에 유사도 순으로 정렬된 결과를 보내주려는 원래 목적에 맞지 않게 되는 문제가 생겼다.

그 때문에 어쩔 수 없이 workspace/executeCommand를 이용한 커스텀 명령으로 검색 결과를 전달하도록 구현해야만 했고, 클라이언트에서도 해당 명령을 호출하고 결과를 처리하는 부분을 구현해야 했다.

후속 작업

첫 버전의 구현이 되었으니 이제 직접 쓰면서 기능을 보완해보려고 한다. 뒷전이 되어버린 성능도 끌어올려야 하고, 여러 문서 색인, 좀 더 복잡한 문서 파싱, 인덱싱 등등…