(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)