diff --git a/config.el b/config.el index 22eddc6..8fa0f40 100644 --- a/config.el +++ b/config.el @@ -252,9 +252,6 @@ (use-package markdown-mode :mode "\\.qd$") -(use-package c++-mode - :mode "\\.ino$") - (use-package typescript-ts-mode :mode "\\.ts$") diff --git a/packages/dev-packages.el b/packages/dev-packages.el index d3deac6..b268a87 100644 --- a/packages/dev-packages.el +++ b/packages/dev-packages.el @@ -33,75 +33,79 @@ :config (mason-setup)) - -(defvar my/lsp-mode-hooks - ;List of major mode hooks to enable LSP. - '(c-ts-mode-hook - c++-ts-mode-hook - typescript-ts-mode-hook - js-ts-mode-hook - tsx-ts-mode-hook - arduino-mode-hook - toml-ts-mode-hook - json-ts-mode-hook - python-ts-mode-hook) - ) - -(dolist (hook my/lsp-mode-hooks) - (add-hook hook #'lsp-deferred)) - (use-package lsp-mode - :defer t - :commands lsp - :init - (setq lsp-keymap-prefix "C-l") - :config - (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) - (setq lsp-clients-clangd-executable "clangd" - lsp-clangd-binary-path "/usr/bin/clangd" - lsp-clients--clangd-default-executable "/usr/bin/clangd" - lsp-completion-provider :none - lsp-completion-enable-filtering nil - lsp-completion-sort-initial-results t - lsp-clients-clangd-args '("--header-insertion=iwyu" - "--fallback-style=LLVM" - "-query-driver=/usr/bin/c++" - "--header-insertion-decorators") + :defer t + :commands (lsp lsp-deferred) + :init + (setq lsp-keymap-prefix "C-l") + :hook + ((c-mode-hook + c++-mode-hook + c-ts-mode-hook + c++-ts-mode-hook + arduino-mode-hook + typescript-ts-mode-hook + js-ts-mode-hook + tsx-ts-mode-hook + toml-ts-mode-hook + json-ts-mode-hook + python-ts-mode-hook) . lsp-deferred) - lsp-enable-indentation t - lsp-enable-on-type-formatting nil - )) + :config + ;; --- General LSP Settings --- + (setq lsp-completion-provider :none + lsp-completion-enable-filtering nil + lsp-completion-sort-initial-results t + lsp-enable-indentation t + lsp-enable-on-type-formatting nil) -(with-eval-after-load 'lsp-mode - (define-key lsp-command-map (kbd "a") #'lsp-execute-code-action) - (define-key lsp-command-map (kbd "d") #'lsp-ui-doc-glance) - (define-key lsp-command-map (kbd "r") #'lsp-rename) + (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) - ;; Safe Capability Filter: Handles both association list (alist) and hash-table formats - (advice-add 'lsp--client-capabilities :filter-return - (lambda (caps) - (cond - ;; If it's a hash table - ((hash-table-p caps) - (when-let ((text-doc (gethash "textDocument" caps))) - (if (hash-table-p text-doc) - (remhash "inlineCompletion" text-doc) - (setcdr (assoc "inlineCompletion" text-doc) nil)))) - ;; If it's an association list (alist) - ((listp caps) - (when-let ((text-doc (cdr (assoc 'textDocument caps)))) - (setcdr (assoc 'textDocument caps) - (assq-delete-all 'inlineCompletion text-doc))))) - caps)) + ;; --- C / C++ Configuration (clangd) --- + (setq lsp-clients-clangd-executable "/usr/bin/clangd" + lsp-clients--clangd-default-executable "/usr/bin/clangd" + lsp-clients-clangd-args '("--header-insertion=iwyu" + "--fallback-style=LLVM" + "--query-driver=/usr/bin/c++,/usr/bin/g++,/home/*/.arduino15/packages/**/bin/*" + "--header-insertion-decorators")) - ;; Set up arduino-mode safely after lsp-mode is loaded - (add-to-list 'lsp-language-id-configuration '(arduino-mode . "cpp")) - (lsp-register-client - (make-lsp-client - :new-connection (lsp-stdio-connection '("clangd" "--header-insertion=never")) - :activation-fn (lsp-activate-on "arduino") - :server-id 'lsp-arduino-clangd - ))) + ;; Map major modes to LSP language IDs + (add-to-list 'lsp-language-id-configuration '(c-ts-mode . "c")) + (add-to-list 'lsp-language-id-configuration '(c++-ts-mode . "cpp")) + (add-to-list 'lsp-language-id-configuration '(arduino-mode . "arduino")) + + ;; --- Arduino Language Server Registration --- + (lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (list "arduino-language-server" + "-clangd" "/usr/bin/clangd" + "-cli" "/usr/bin/arduino-cli" + "-cli-config" (expand-file-name "~/.arduino15/arduino-cli.yaml") + )) + :activation-fn (lsp-activate-on "arduino") + :major-modes '(arduino-mode) + :server-id 'arduino-ls)) + + ;; --- Keybindings --- + (define-key lsp-command-map (kbd "a") #'lsp-execute-code-action) + (define-key lsp-command-map (kbd "d") #'lsp-ui-doc-glance) + (define-key lsp-command-map (kbd "r") #'lsp-rename) + + ;; Filter out unsupported inlineCompletion capability + (advice-add 'lsp--client-capabilities :filter-return + (lambda (caps) + (cond + ((hash-table-p caps) + (when-let ((text-doc (gethash "textDocument" caps))) + (if (hash-table-p text-doc) + (remhash "inlineCompletion" text-doc) + (setcdr (assoc "inlineCompletion" text-doc) nil)))) + ((listp caps) + (when-let ((text-doc (cdr (assoc 'textDocument caps)))) + (setcdr (assoc 'textDocument caps) + (assq-delete-all 'inlineCompletion text-doc))))) + caps))) (use-package lsp-ui :defer t