Fix vim with nix
Neovim in 2024
Requires…
- vim itself
- vim plugin manager
- vim plugin
- lua, rocks
- python, node / deno / bun, …
- CLI: ripgrep / fzf / vifm
- LSP servers, DAP servers, linters, and formatters
- AI assistant (copilot, ollama, ~)
- …
Neovim in 2024
업데이트 또는 새로운 기기/서버에 vim 을 설치할때마다
- API breaks (vim)
- tools break
- not available in package manager / arch
- require different versions of the same tool
- X removing a flag, breaking X.vim (e.g., fzf.vim)
- …
새로운 프로젝트가 다음을 필요로 한다면..
- Nightly builds
- Custom build of LSP
Dependency hell
Nix
is many things
- Universal package manager
- Functional programming language
- Operating system (nixOS)
- …
Nix 보단
- 어떻게 nix 가 vim 을 관리하는데 도움이 될 수 있는지
- 부분적 또는 점진적으로 적용할 수 있는 부분
Simple adoption strategy, nix run
일단은 nix 설치
- (official) nix install script(bash)
- nix-installer(rust)
Replace mason.nvim
Nix 는 기본적으로는 패키지 매니저
Instead of
brew install zls
:MasonInstall zls
설치하지 않고 실행 가능
require("lspconfig").zls.setup({
-- use zls from installed nixpkgs
cmd = { "nix", "run", "nixpkgs#zls", "--" },
-- install zls from specific nixpkgs
cmd = { "nix", "run", "github:NixOS/nixpkgs/24.11#zls", "--" },
-- install nightly / fork of zls
cmd = { "nix", "run", "github:zigtools/zls#zls", "--" },
cmd = { "nix", "run", "github:aca/zls#zls", "--" },
})
Plugin author
fzf.vim (https://github.com/junegunn/fzf.vim?tab=readme-ov-file#dependencies)
Dependencies fzf 0.54.0 or above, bat, delta, ag, rg, Perl, readtags..
copilot.vim
copilot: Node.js not found in PATH
How nix works
λ realpath (which node)
/nix/store/wfxq6w9bkp5dcfr8yb6789b0w7128gnb-nodejs-20.18.1/bin/node
λ ldd (realpath (which node))
libz.so.1 => /nix/store/bzk3q2l71qwhycsip23y6rl5n881la4n-zlib-1.3.1/lib/libz.so.1 (0x00007f7e2599f000)
libuv.so.1 => /nix/store/scb132gc1zzd904zibk2mz0q5q42z0ym-libuv-1.48.0/lib/libuv.so.1 (0x00007f7e2596a000)
libcrypto.so.3 => /nix/store/k1dsk0zyq43pvi7f76is2rx6l4aphm5z-openssl-3.3.2/lib/libcrypto.so.3 (0x00007f7e25200000)
libssl.so.3 => /nix/store/k1dsk0zyq43pvi7f76is2rx6l4aphm5z-openssl-3.3.2/lib/libssl.so.3 (0x00007f7e2585e000)
Nix as a bridge
- Vim <-> CLI
- Vim <-> LSP server
- LSP server <-> runtime dependencies
- “Bridge” between entirely unrelated dependencies
nix 로 끊어진 연결고리를 이어주는 역할 수행
Per project dependancy
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/master";
oci.url = "github:aca/oracle-instantclient-basic.nix/main";
};
outputs = { ... }: {
devShells = forAllSystems ({ system, pkgs, }: {
default = pkgs.mkShell {
shellHook = ''
export LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath [oci.packages.${system}.basiclite]};
'';
packages = with pkgs; [ go_1_23 gopls sqlc gosimports oci.packages.${system}.basiclite ];
};
});
};
With flake + direnv
cd $projectdir; # setup all dependencies
next, nixOS
시스템을 Nix 로 구성하는 OS.
Storage, Network, Services, Users, Secrets, … and vim.
- 모든 시스템 구성을 하나의 통일된 형태로 관리할 수 있음
- 안전한 업데이트, 롤백
- elitak/nixos-infect: 클라우드 서버를 nixOS 로 변환
- mac:
- nix-darwin
- NixOS on VMWare Fusion(추천), UTM (버그는 있지만 충분히 사용가능)
- Nixvim: nix 로 vim 을 구성하는 nix module
- 많은 부분의 재작성 요구
- 매 수정마다 Rebuild 필요
dotfiles to Nix
- dotfiles 를 시스템을 구성하는 input 중 하나로
- 메인 PC 에선 기존 그대로 dotfiles 레포에서 작업
- 다른 PC 에선 dotfiles input 을 업데이트
{ inputs, ... }: let
dotfiles = builtins.fetchGit {
url = "https://codeberg.org/aca/dotfiles";
ref = "main";
submodules = true;
};
in {
home.file."${config.xdg.configHome}/nvim".source = "${dotfiles.outPath}/.config/nvim";
}