From 1f914763034b2a7ee4e570ac0e183dce9da42ab7 Mon Sep 17 00:00:00 2001 From: Jeff Kreeftmeijer Date: Tue, 23 Apr 2024 17:59:00 +0200 Subject: [PATCH] Automatically format on save in Eglot-enabled buffers --- default.el | 6 +++++- emacs-configuration.org | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/default.el b/default.el index 8dd79fd..28d9d7a 100644 --- a/default.el +++ b/default.el @@ -151,13 +151,17 @@ end tell")) :init (direnv-mode 1)) +(defun jk/maybe-format-buffer () + (when (eglot-managed-p) (eglot-format-buffer))) + (use-package eglot :config (add-to-list 'eglot-server-programs '((rust-ts-mode rust-mode) "rust-analyzer")) (add-to-list 'eglot-server-programs '((elixir-ts-mode elixir-mode) "elixir-ls")) :hook (rust-mode . eglot-ensure) - (rust-ts-mode . eglot-ensure)) + (rust-ts-mode . eglot-ensure) + (after-save . jk/maybe-format-buffer)) (use-package eat :ensure t diff --git a/emacs-configuration.org b/emacs-configuration.org index aa82cc3..ba8efcf 100644 --- a/emacs-configuration.org +++ b/emacs-configuration.org @@ -973,6 +973,44 @@ Start eglot automatically for Rust files: (rust-ts-mode . eglot-ensure) #+end_src +*** Automatically format files on save in Eglot-enabled buffers + +The ~eglot-format-buffer~ function doesn't check if Eglot is running in the current buffer. +This means hooking using it as a global ~after-save-hook~ produces errors in the echo area whenever a file is saved while Eglot isn't enabled: + +#+begin_src emacs-lisp + (jsonrpc-error + "No current JSON-RPC connection" + (jsonrpc-error-code . -32603) + (jsonrpc-error-message . "No current JSON-RPC connection")) +#+end_src + +To remedy this, add a function that formats only when Eglot is enabled. + +#+headers: :tangle default.el +#+begin_src emacs-lisp + (defun jk/maybe-format-buffer () + (when (eglot-managed-p) (eglot-format-buffer))) +#+end_src + +#+RESULTS: +: jk/maybe-format-buffer + +This function is then added as a global ~after-save-hook~. + +#+begin_src emacs-lisp + (add-hook 'after-save-hook 'jk/maybe-format-buffer) +#+end_src + +#+headers: :eval no +#+headers: :exports none +#+headers: :noweb-ref eglot-hook +#+begin_src emacs-lisp + (after-save . jk/maybe-format-buffer) +#+end_src + +Now, with the hook enabled, any Eglot-enabled buffer is formatted automatically on save. + #+headers: :exports none #+headers: :noweb yes #+headers: :tangle default.el