- replace "add-pkg-in-pkg-dir" (recursive load-path scanning) with a central "creature/pkgs" registry that handles load path, autoloads, info dirs and dependencies - adapt all init-*.el files to the new activation function - add a top-level Makefile to byte-compile site-lisp packages - remove unused "emacs-kv" and "emacs-db" submodules
95 lines
3.3 KiB
EmacsLisp
95 lines
3.3 KiB
EmacsLisp
;; -*- coding: utf-8; lexical-binding: t; -*-
|
|
|
|
(require 'init-package)
|
|
|
|
(creature/pkg-active 'lazy-load)
|
|
|
|
(defun creature/eglot-load-markdown-for-doc ()
|
|
(when (and (fboundp 'eglot-managed-p)
|
|
(eglot-managed-p)
|
|
(not (featurep 'markdown-mode))
|
|
(locate-library "markdown-mode"))
|
|
(require 'markdown-mode)))
|
|
|
|
(defun creature/eglot-hover-eldoc-function (cb)
|
|
"Multiple line version of `eglot-hover-eldoc-function'."
|
|
(when (eglot-server-capable :hoverProvider)
|
|
(let ((buf (current-buffer)))
|
|
(jsonrpc-async-request
|
|
(eglot--current-server-or-lose)
|
|
:textDocument/hover (eglot--TextDocumentPositionParams)
|
|
:success-fn (eglot--lambda ((Hover) contents range)
|
|
(eglot--when-buffer-window buf
|
|
(let ((info (unless (seq-empty-p contents)
|
|
(eglot--hover-info contents range))))
|
|
(funcall cb info :buffer t))))
|
|
:deferred :textDocument/hover))
|
|
t))
|
|
|
|
(defun creature/eglot-format ()
|
|
(interactive)
|
|
(if creature/formatter
|
|
(funcall creature/formatter)
|
|
(eglot-format)))
|
|
|
|
(defun creature/disable-eglot-for-json ()
|
|
"JSON mode is derived from `js-mode', but json file don't need `eglot'."
|
|
(dolist (buffer (buffer-list))
|
|
(with-current-buffer buffer
|
|
(when (and (eglot-managed-p)
|
|
(derived-mode-p 'js-json-mode 'json-mode 'json-ts-mode))
|
|
(run-with-timer 0 nil
|
|
(lambda ()
|
|
(with-current-buffer buffer
|
|
(flymake-mode -1)
|
|
(eglot--managed-mode-off))))))))
|
|
|
|
(with-eval-after-load 'eglot
|
|
(setq eglot-events-buffer-size 0)
|
|
(setq eglot-confirm-server-initiated-edits nil)
|
|
(setq eglot-autoshutdown t)
|
|
(add-to-list 'eglot-ignored-server-capabilities :inlayHintProvider)
|
|
(add-to-list 'eglot-server-programs
|
|
`((lua-mode lua-ts-mode)
|
|
. ,(eglot-alternatives '("emmylua_ls" "lua-language-server" "lua-lsp"))))
|
|
(add-to-list 'eglot-server-programs
|
|
`((cmake-mode cmake-ts-mode)
|
|
. ,(eglot-alternatives '(("neocmakelsp" "stdio") "cmake-language-server"))))
|
|
|
|
(add-hook 'eglot-managed-mode-hook #'creature/eglot-load-markdown-for-doc)
|
|
(add-hook 'eglot-managed-mode-hook #'creature/disable-eglot-for-json)
|
|
|
|
;; variable `eglot-prefer-plaintext' invoked in eglot-1.14
|
|
;; and document only show one line by eldoc since eglot-1.14
|
|
(when (boundp 'eglot-prefer-plaintext)
|
|
(advice-add 'eglot-hover-eldoc-function :override #'creature/eglot-hover-eldoc-function))
|
|
|
|
(lazy-load-set-keys
|
|
'(("M-." . xref-find-definitions)
|
|
("M-?" . xref-find-references)
|
|
("C-c r" . eglot-rename)
|
|
("C-c o" . eglot-code-actions)
|
|
("C-M-\\" . creature/eglot-format))
|
|
eglot-mode-map))
|
|
|
|
|
|
(dolist (hook '(css-mode-hook
|
|
js-base-mode-hook
|
|
typescript-mode-hook
|
|
typescript-ts-base-mode-hook
|
|
sh-mode-hook
|
|
bash-ts-mode-hook
|
|
python-mode-hook
|
|
python-ts-mode-hook
|
|
cmake-mode-hook
|
|
cmake-ts-mode-hook
|
|
lua-mode-hook
|
|
lua-ts-mode-hook
|
|
c-mode-hook
|
|
c++-mode-hook
|
|
c-ts-base-mode-hook))
|
|
(add-hook hook #'eglot-ensure))
|
|
|
|
|
|
(provide 'init-eglot)
|