;; Tree-sitter & LSP tweaks (Core transformative changes) (use-package treesit-fold :defer t :commands (treesit-fold-close treesit-fold-close-all treesit-fold-open treesit-fold-toggle treesit-fold-open-all treesit-fold-mode global-treesit-fold-mode treesit-fold-open-recursively treesit-fold-line-comment-mode) :custom (treesit-fold-line-count-show t) (treesit-fold-line-count-format "--▼--") :config (set-face-attribute 'treesit-fold-replacement-face nil :foreground "#808080" :box nil :weight 'bold) ) ;; Tree-sitter hooks (dolist (hook '(c-ts-mode-hook c++-ts-mode-hook java-ts-mode-hook rust-ts-mode-hook go-ts-mode-hook ruby-ts-mode-hook js-ts-mode-hook typescript-ts-mode-hook tsx-ts-mode-hook css-ts-mode-hook html-ts-mode-hook bash-ts-mode-hook cmake-ts-mode-hook dockerfile-ts-mode-hook json-ts-mode-hook toml-ts-mode-hook yaml-ts-mode-hook)) (add-hook hook #'treesit-fold-mode)) (with-eval-after-load 'treesit (setq treesit-font-lock-level 4)) (use-package mason :defer t :config (mason-setup)) (use-package lsp-mode :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) :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) (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) ;; --- 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")) ;; 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 :after lsp-mode :commands lsp-ui-mode :init (setq lsp-ui-sideline-show-symbol t lsp-ui-side-show-code-actions t lsp-ui-sideline-show-hover t lsp-ui-doc-enable t lsp-ui-doc-delay 1 lsp-ui-doc-position 'at-point lsp-ui-sideline-show-hover t lsp-ui-sideline-show-diagnostics t lsp-ui-side-show-code-actions t lsp-ui-sideline-delay 0.25 ) ) (with-eval-after-load 'lsp-mode (add-to-list 'lsp-disabled-clients 'tailwindcss)) (provide 'dev-packages)