50 lines
1.6 KiB
EmacsLisp
50 lines
1.6 KiB
EmacsLisp
|
(require 'common-lsp)
|
||
|
(require 'util-tree-sitter)
|
||
|
|
||
|
(defun locate-compile-commands-file ()
|
||
|
"See if compile_commands.json exists."
|
||
|
;; This can be generated by prefixing the make command with `intercept-build15 --append`
|
||
|
(let ((compile-commands-file (locate-dominating-file (buffer-file-name) "compile_commands.json")))
|
||
|
compile-commands-file
|
||
|
)
|
||
|
)
|
||
|
|
||
|
(defun activate-c-eglot ()
|
||
|
"Activate eglot for the c family of languages."
|
||
|
(when (locate-compile-commands-file)
|
||
|
(eglot-ensure)
|
||
|
(defclass my/eglot-c (eglot-lsp-server) ()
|
||
|
:documentation
|
||
|
"Own eglot server class.")
|
||
|
|
||
|
(add-to-list 'eglot-server-programs
|
||
|
'(c-ts-mode . (my/eglot-c "/usr/local/bin/clangd15")))
|
||
|
(add-hook 'before-save-hook 'eglot-format-buffer nil 'local)
|
||
|
)
|
||
|
)
|
||
|
|
||
|
(use-package c-mode
|
||
|
:mode (
|
||
|
("\\.c\\'" . c-ts-mode)
|
||
|
("\\.h\\'" . c-or-c++-ts-mode)
|
||
|
)
|
||
|
:commands (c-mode c-ts-mode)
|
||
|
:pin manual
|
||
|
:ensure nil
|
||
|
:hook (
|
||
|
(c-ts-mode . (lambda ()
|
||
|
(activate-c-eglot)
|
||
|
))
|
||
|
)
|
||
|
:init
|
||
|
(add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))
|
||
|
(add-to-list 'major-mode-remap-alist '(c++-mode . c++-ts-mode))
|
||
|
(add-to-list 'major-mode-remap-alist '(c-or-c++-mode . c-or-c++-ts-mode))
|
||
|
(add-to-list 'treesit-language-source-alist '(c "https://github.com/tree-sitter/tree-sitter-c"))
|
||
|
(add-to-list 'treesit-language-source-alist '(cpp "https://github.com/tree-sitter/tree-sitter-cpp"))
|
||
|
(unless (treesit-ready-p 'c) (treesit-install-language-grammar 'c))
|
||
|
(unless (treesit-ready-p 'cpp) (treesit-install-language-grammar 'cpp))
|
||
|
)
|
||
|
|
||
|
(provide 'lang-c)
|