;;; development/nix.el -*- lexical-binding: t; -*- (use-package! nix-mode :mode "\\.nix\\'" :hook (nix-mode . lsp-deferred) :config ;; Configure nil LSP server (after! lsp-mode (add-to-list 'lsp-language-id-configuration '(nix-mode . "nix")) (lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection "nil") :major-modes '(nix-mode) :server-id 'nil-ls :priority 0))) ;; Function to check if we're in a nixpkgs repository (defun in-nixpkgs-repo-p () (when-let ((root (or (locate-dominating-file default-directory ".git") (vc-root-dir)))) (or (string-match-p "/nixpkgs/?$" root) (file-exists-p (expand-file-name "pkgs/top-level/all-packages.nix" root)) (file-exists-p (expand-file-name ".nixpkgs-version.json" root))))) ;; Set up format-all-mode to use our custom formatter selection (set-formatter! 'nixfmt '("nixfmt") :modes '(nix-mode)) (set-formatter! 'alejandra '("alejandra" "--quiet") :modes '(nix-mode)) ;; Add hooks to handle all formatting scenarios (add-hook! 'nix-mode-hook ;; Disable LSP formatting (setq-local +format-with-lsp nil) ;; Set formatter for format-all-mode (+format/buffer) (setq-local +format-with (if (in-nixpkgs-repo-p) 'nixfmt 'alejandra)) ;; Handle format-on-save (when (bound-and-true-p format-all-mode) (format-all-mode -1)) (add-hook! 'before-save-hook :local (when (eq major-mode 'nix-mode) (if (in-nixpkgs-repo-p) (format-all-buffer 'nixfmt) (format-all-buffer 'alejandra)))) ;; Override lsp-format-buffer (advice-add 'lsp-format-buffer :around (lambda (orig-fun &rest args) (if (eq major-mode 'nix-mode) (let ((fmt (if (in-nixpkgs-repo-p) (executable-find "nixfmt") (executable-find "alejandra")))) (when fmt (format-all-buffer (intern (file-name-nondirectory fmt))))) (apply orig-fun args)))))) ;; Enable format-on-save globally if desired (setq +format-on-save-enabled-modes '(nix-mode)) (use-package! llvm-ts-mode :mode "\\.ll\\'" ; LLVM IR files :mode "\\.td\\'" ; TableGen files :hook (llvm-ts-mode . tree-sitter-mode)) (after! tree-sitter (add-to-list 'tree-sitter-major-mode-language-alist '(llvm-ts-mode . llvm)))