요즘 Neovim 관련 질문 올리는 뉴비들이 많아서 Neovim 관련 팁들을 좀 공유할까 함
팁이라기보단 내가 Neovim 처음 접했을 때 오해했던 것 / 어려워했던것들 위주가 될듯
잘못된 정보에 대한 지적은 언제나 환영임

오늘은 저 밑에 질문이 올라왔던 lsp, mason과 관련한 개념들, 각종 플러그인들의 정확한 용도에 대해 알아보자.


개념

LSP : Language Server Protocol
자동완성, 포맷팅, 문법오류(diagnostics), 코드 액션, 하이라이팅 (semantic highlighting) 등등
특정 언어, 혹은 프레임워크를 다루는 IDE가 필요로 하는 기능들을 Language Server라는 별도 프로그램이 처리하고, 그 프로그램과 통신하기 위한 프로토콜을 의미함
VSCode를 포함한 요즘 보이는 텍스트에디터들은 거의 웬만해선 지원하고 있다.

Language Server (type-language-server) > Linter (eslint) > Formatter (prettier)
이렇게 Language Server가 가장 큰 개념이라 보면 됨

Neovim은 v0.5부터 LSP를 공식적으로 지원하기 시작했음
이 말은 LSP 프로토콜에 존재하는 거의 웬만한 플러그인들이 Neovim 안에 내장되어있다는 얘기임
즉, 플러그인을 굳이 설치하지 않아도 자동완성 같은 기능들을 거의 전부 쓸 수 있단 얘기임

관련 플러그인들

그럼 왜 nvim-lspconfig나 mason.nvim 같은 플러그인을 설치해야하냐?
대체 기본적으로 지원한다면서 설치해야하는게 왜이렇게 많냐?
자동완성을 위해 설치해야하는 플러그인이 4~5개나 되던데, 이게 맞냐?

가 가장 궁금한 내용일거임
앞서 얘기했지만 진짜로 안쓰려 한다면 전부 없이 쓸 수 있다.
그게 일반 사용자 입장에서 좀 불편해서 그럼


coc.nvim
: Neovim이 LSP를 지원하지 않던 시절, LSP 기능을 구현해놓은 플러그인
정확힌 LSP를 구현한것도 아니고 vscode의 코어기능을 통째로 빼온거라고 알고 있는데, 쓴지 하도 오래되서 확실하진 않다.
이젠 Neovim이 LSP 기능을 내장하고 있으니까 당연히 없어도 됨
가끔 inlay-hint 같이 neovim보다 vim에 먼저 관련 api가 구현된 경우에 이걸 쓰긴 할텐데
요즘은 웬만한건 다 돼서 굳이 쓸 필요는 없다 봄

nvim-lspconfig
: language server를 연결하고, 설정하는 역할을 하는 플러그인
이거 없이 쓰고 싶으면 filetype Autocommand로 vim.lsp.start 같은 api 써서 Language Server 직접 실행하고 설정하는 스크립트 짜두면 되는데
LSP 디버깅하려는 케이스 외에 그러는 사람은 본적 없음

mason.nvim
: language server, linter, formatter 등을 쉽게 설치할 수 있는 플러그인
당연하지만 이거 없어도 각 툴마다 관련 문서 찾아서 다 따로 설치하면 된다
실제로 mason.nvim은 안쓰는 사람 꽤 많음

mason-lspconfig.nvim, mason-null-ls.nvim 등
: mason과 lspconfig, null-ls를 연결해주는 플러그인들
lspconfig와 mason이 전혀 다른 일을 하고 있고, 각각 지원하는 Language Server 리스트도 다름 (대표적으로 Lua language server를 lspconfig는 lua_ls라 부르고, Mason은 lua-language-server라고 부름)
이 차이를 메꿔주는 플러그인이 mason-lspconfig.nvim임
연결해준다는게 뭔소리냐면 “lspconfig로 셋팅된 language server들 전부 설치” 같은 작업이 가능해지는거
후술할 nvim-cmp와 달리, mason은 이런 하위 플러그인들 없이 lspconfig와 쓰는데 아무런 문제가 없음
개인적으론 LazyVim이나 LunarVim, NVChad처럼 plug-and-play를 지향하는 케이스들이나 필요하지, 보통은 필요가 없는게 정상이라 생각함.
난 처음엔 쓰다가 괜히 관리하기 더 어려워지는 것 같아서 지워버렸음

nvim-cmp
: 자동완성 UI를 더 예쁘게 만들고, LSP 외에도 다양한 자동완성 백엔드를 연결해주는 플러그인
놀랍게도 neovim에는 원래 자동완성 기능이 있다. vim 시절부터 있었음. command line 모드에서 tab 누르다가 한번쯤은 본적 있을거임
못믿겠으면 insert mode에서 CTRL-X_CTRL-O 눌러봐

아무튼 이거 없이 순정 LSP 자동완성 쓰고 싶으면
LspAttach autocmmand에서
vim.bo[buffer].omnifunc = vim.lsp.omnifunc
뭐 이런식으로 하면 될거임
자세한건
:h ‘omnifunc’
:h vim.lsp.omnifunc()
:h i_CTRL-X_CTRL-O
참조

cmp- 로 시작하는 각종 플러그인들
: nvim-cmp는 그냥 UI와 단축키 같은 자동완성의 코어 기능들만 구현해둔거고, 자동완성 소스들은 전부 다른 플러그인이라는 형태로 관리중임
원하는것만 골라쓰면 됨

luasnip, vsnip, ultisnips 등
: 전부 다른 snippet 엔진이다. LSP에서 나오는 snippet, 혹은 friendly-snippets같은 snippet들 쓰게 해주는 애들임
얘네는 snippet 제대로 쓸꺼면 아무거나 하나는 필요했던 것 같은데 최근에 `vim.snippet`이라고 neovim에도 snippet 엔진이 내장돼서 없이도 될꺼다
워낙 최근에 나온 기능이라 정확히 어떻게 할 수 있는진 몰?루

inlay-hints.nvim
: Neovim이 inlay-hint 기능을 지원 안할 때 쓰던건데, 0.9부터인가 지원하기 시작해서 줄 끝에 뜨는 UI를 원하는게 아니면 필요 없음

null-ls.nvim / none-ls.nvim
: LSP가 아닌 linter나 formatter를 가상 Language Server를 만들어서 연결해주는 플러그인
prettier나 eslint같은거 쓸꺼면 필요한데,
eslint_ls 처럼 linting 기능만 구현한 Language Server 래퍼도 있고
굳이 플러그인으로 해결하고 싶지 않다면 래퍼 역학을 하기 위한 Language Server인
diagnostic-languageserver나
efm-langserver 쓰면 됨
null-ls가 archive 처리되면서 나온 커뮤니티 fork가 none-ls인데, 요즘은 아예 conform.nvim이나 nvim-lint 처럼 formatter/linter 관련 플러그인을 따로 설치하는 방향으로도 많이 감.
null-ls 관련 얘기는 나중에 더 다뤄보겠음

type스크립트.nvim / type스크립트-tools.nvim / rustacean.nvim
: Neovim이 지원하지 않는 Language Server의 기능들을 지원해주는 플러그인들
일부 Language Server는 eslint_ls마냥 다른 프로그램을 LSP에 맞춰서 포장해둔거임.
대표적인 예가 type 스크립트-language-server인데, 얘는 tsserver의 래퍼고 tsserver는 엄밀하게 말해서 language server가 아니다. 프로토콜이 다름
그래서 type스크립트.nvim 같은거 readme 보면 lsp-config 통해서 tsserver 실행하지 말라 할꺼임. 그럼 LSP에 있는 기능들만 쓸 수 있거든
이렇게 LSP에 명시되어있지 않은 기능들이나 LSP에는 명시되어있지만 아직 Neovim에 구현되지 않은 기능들을 지원하는 애들임
VSCode는 tsserver를 내장하고 있고, 그래서 순정 Neovim에서는 없는 기능들도 지원함



원래는 개인 블로그 파서 거기 작성하고 싶었는데
Neorg -> html 변환 프로그램 제대로 완성될려면 한참 걸릴 것 같은데다
요즘 워낙 비슷한 질문이 많이 보이길래 써봤음
반응 좋으면 계속할 예정

내가 빠뜨린 내용이나 잘못된 내용, 혹은 궁금한거 있으면 댓글 ㄱㄱ


수정1 - null-ls / none-ls 관련내용 추가
수정2 - mason 기타 플러그인 내용 추가
수정3 - 디씨 필터링 관련 오타 수정

- dc official App