In Emacs, when you try to automate some actions during every save
action, you will surely get to the before-save-hook and the
after-save-hook. Simply adding something like gofmt-before-save to
before-save-hook will save you tons of time to do the go-fmt.
And then, I meet eglot, and gopls will also save me tons of time doing
googling and api documentation navigation.
But eglot-ensure is not very friendly to the good old ways of how
after-save-hooks were designed to work. It makes the
before/after-save-hook a buffer local variable and it does not inherit
the variable's global value.
So, to make before/after-save-hook work again, experts start to adding
hooks to major mode specific hooks like this: emacs.md - Go
(opensource.google)
"""
;; Optional: install eglot-format-buffer as a save hook.
;; The depth of -10 places this before eglot's willSave notification,
;; so that that notification reports the actual contents that will be saved.
(defun eglot-format-buffer-on-save ()
(add-hook 'before-save-hook #'eglot-format-buffer -10 t))
(add-hook 'go-mode-hook #'eglot-format-buffer-on-save)
"""
Then, how to integrate the thing with existing use-package managed
eglot configuration? I, use the lambda function:
"""
(use-package eglot
:ensure t
:hook (((go-mode go-ts-mode) .
(lambda ()
(add-hook 'before-save-hook #'eglot-format-buffer -10 t)))
((yaml-mode yaml-ts-mode go-ts-mode go-mode) . eglot-ensure))
:config
(add-to-list 'eglot-stay-out-of #'company)
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
`((yaml-mode yaml-ts-mode) . ("yaml-language-server" "--stdio"
:initializationOptions
(:http.proxy "http://my.proxy.com:8080"))))))
"""
action, you will surely get to the before-save-hook and the
after-save-hook. Simply adding something like gofmt-before-save to
before-save-hook will save you tons of time to do the go-fmt.
And then, I meet eglot, and gopls will also save me tons of time doing
googling and api documentation navigation.
But eglot-ensure is not very friendly to the good old ways of how
after-save-hooks were designed to work. It makes the
before/after-save-hook a buffer local variable and it does not inherit
the variable's global value.
So, to make before/after-save-hook work again, experts start to adding
hooks to major mode specific hooks like this: emacs.md - Go
(opensource.google)
"""
;; Optional: install eglot-format-buffer as a save hook.
;; The depth of -10 places this before eglot's willSave notification,
;; so that that notification reports the actual contents that will be saved.
(defun eglot-format-buffer-on-save ()
(add-hook 'before-save-hook #'eglot-format-buffer -10 t))
(add-hook 'go-mode-hook #'eglot-format-buffer-on-save)
"""
Then, how to integrate the thing with existing use-package managed
eglot configuration? I, use the lambda function:
"""
(use-package eglot
:ensure t
:hook (((go-mode go-ts-mode) .
(lambda ()
(add-hook 'before-save-hook #'eglot-format-buffer -10 t)))
((yaml-mode yaml-ts-mode go-ts-mode go-mode) . eglot-ensure))
:config
(add-to-list 'eglot-stay-out-of #'company)
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
`((yaml-mode yaml-ts-mode) . ("yaml-language-server" "--stdio"
:initializationOptions
(:http.proxy "http://my.proxy.com:8080"))))))
"""
评论
发表评论