From 81e735f2c273da4758a273cd4ed3f40ade0aa72e Mon Sep 17 00:00:00 2001 From: ed9w2in6 <22890124+ed9w2in6@users.noreply.github.com> Date: Mon, 21 Apr 2025 23:02:27 +0800 Subject: [PATCH 1/2] feat: better json fontification with json-ts-mode replace js-mode with json-ts-mode (part of Emacs core) --- nix-drv-mode.el | 2 +- nix-flake.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nix-drv-mode.el b/nix-drv-mode.el index f7d1935..8c63f5e 100644 --- a/nix-drv-mode.el +++ b/nix-drv-mode.el @@ -18,7 +18,7 @@ (require 'nix) ;;;###autoload -(define-derived-mode nix-drv-mode js-mode "Nix-Derivation" +(define-derived-mode nix-drv-mode json-ts-mode "Nix-Derivation" "Pretty print Nix’s .drv files." (let ((inhibit-read-only t)) (erase-buffer) diff --git a/nix-flake.el b/nix-flake.el index 93be1fa..b188212 100644 --- a/nix-flake.el +++ b/nix-flake.el @@ -571,7 +571,7 @@ See `nix-flake-init-post-action' variable for details." (nix-flake-init-dispatch)))) ;;;###autoload -(add-to-list 'auto-mode-alist '("\\flake.lock\\'" . js-mode)) +(add-to-list 'auto-mode-alist '("\\flake.lock\\'" . json-ts-mode)) (provide 'nix-flake) ;;; nix-flake.el ends here From 891d9632e4b116760495d803bfa35b80803ce586 Mon Sep 17 00:00:00 2001 From: ed9w2in6 <22890124+ed9w2in6@users.noreply.github.com> Date: Mon, 21 Apr 2025 23:02:44 +0800 Subject: [PATCH 2/2] fix: handles stderr in nix-drv-mode nix-drv-mode behaves weirdly when there is stderr which is common when nix warns about feature deprecation replace shell-command-to-string with make-process which allows ignoring stderr --- nix-drv-mode.el | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/nix-drv-mode.el b/nix-drv-mode.el index 8c63f5e..179e2dd 100644 --- a/nix-drv-mode.el +++ b/nix-drv-mode.el @@ -20,15 +20,35 @@ ;;;###autoload (define-derived-mode nix-drv-mode json-ts-mode "Nix-Derivation" "Pretty print Nix’s .drv files." - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (shell-command-to-string - (format "%s show-derivation \"%s\"" - nix-executable - (buffer-file-name)))) - (set-buffer-modified-p nil) - (read-only-mode 1)) - + (setq inhibit-read-only t) + (erase-buffer) + (let ((err-buf (generate-new-buffer "*nix-drv-mode*"))) + (make-process + :name "nix-drv-mode" + :buffer (current-buffer) + :command (list nix-executable "derivation" "show" (buffer-file-name)) + :stderr err-buf + :sentinel (lambda (proc event) + (setq inhibit-read-only nil) + (when (string-match "finished" event) + (let ((buf (process-buffer proc))) + (when (and buf (buffer-live-p buf)) + (with-current-buffer buf + (set-buffer-modified-p nil) + (read-only-mode) + ))) + (when (and (buffer-live-p err-buf) (> (buffer-size err-buf) 0)) + (with-current-buffer err-buf + (read-only-mode)) + (display-buffer err-buf)) + )) + :filter (lambda (proc output) + ;; use process buffer for output + (let ((buf (process-buffer proc))) + (when (and buf (buffer-live-p buf)) + (with-current-buffer buf + (goto-char (point-max)) + (insert output))))))) (add-hook 'change-major-mode-hook #'nix-drv-mode-dejsonify-buffer nil t)) (defun nix-drv-mode-dejsonify-buffer ()