diff --git a/init.org b/init.org index 2b0f75f..d72dbe3 100644 --- a/init.org +++ b/init.org @@ -1603,8 +1603,27 @@ Auto-completion requires yasnippet for some competions, such as function argumen :straight t) #+end_src -** Eglot +** Format-On-Save +build formatting on save functionality: +#+begin_src emacs-lisp +(defvar-local nemo/lsp-format-on-save t) +(defvar nemo/lsp-format-on-save-function #'eglot-format) +(define-minor-mode nemo/lsp-format-on-save-mode + "Run lsp-format-buffer on save." + :lighter " fmt" + (if nemo/lsp-format-on-save-mode + (add-hook 'before-save-hook nemo/lsp-format-on-save-function nil t) + (remove-hook 'before-save-hook nemo/lsp-format-on-save-function nil t) + )) + +(defun nemo/do-lsp-format-on-save () + "Format on save using LSP server." + (if nemo/lsp-format-on-save + (nemo/lsp-format-on-save-function))) +#+end_src + +** Eglot Use =eglot= as an alternative to =lsp-mode=: #+begin_src emacs-lisp (use-package eglot @@ -1613,21 +1632,22 @@ Use =eglot= as an alternative to =lsp-mode=: :config (add-to-list 'eglot-server-programs - `(rust-mode - . ("rust-analyzer" :initializationOptions - (:cargo (:buildScripts (:enable t) - :allFeatures (:enable t) - :features "all" - :extraEnv (:RUSTFLAGS "-Clinker=clang -Clink-arg=-fuse-ld=mold"))) - (:check (:command "clippy")) - (:completion (:autoimport (:enable t))) - (:inlayHints ( - ;; :maxLength 20 - :bindingModeHints (:enable t) - :closureReturnTypeHints (:enable t))) - (:procMacro (:enable t))) - ) - ) + '(rust-mode + "rust-analyzer")) + (setq-default eglot-workspace-configuration + '(:rust-analyzer + (:cargo (:buildScripts (:enable t) + :allFeatures t + :features "all" + :extraEnv (:RUSTFLAGS "-Clinker=clang -Clink-arg=-fuse-ld=mold")) + :check (:command "clippy") + :completion (:autoimport (:enable t)) + :inlayHints ( + ;; :maxLength 20 + :bindingModeHints (:enable t) + :closureReturnTypeHints (:enable t)) + :procMacro (:enable t))) + ) (setq eglot-code-action-indications '(margin mode-line) eglot-extend-to-xref t completion-category-overrides '((eglot (styles orderless)) @@ -1681,23 +1701,8 @@ Use =eglot= as an alternative to =lsp-mode=: :straight t :hook (eglot-managed-mode . breadcrumb-mode) ) - -(defvar-local nemo/lsp-format-on-save t) -(defvar nemo/lsp-format-on-save-function #'eglot-format) - -(define-minor-mode nemo/lsp-format-on-save-mode - "Run lsp-format-buffer on save." - :lighter " fmt" - (if nemo/lsp-format-on-save-mode - (add-hook 'before-save-hook nemo/lsp-format-on-save-function nil t) - (remove-hook 'before-save-hook nemo/lsp-format-on-save-function nil t) - )) - -(defun nemo/do-lsp-format-on-save () - "Format on save using LSP server." - (if nemo/lsp-format-on-save - (nemo/lsp-format-on-save-function))) #+end_src + ** COMMENT LSP Use lsp-mode and lsp-ui for LSP functionality. Emacs has its own internal LSP client called eglot, but I've never used it and I'm relatively happy with lsp-mode. @@ -1922,33 +1927,39 @@ hlsl-mode: ) #+end_src -*** COMMENT slang-mode +*** =slang-mode=: +#+begin_src emacs-lisp +(with-eval-after-load 'lsp-mode + (progn + ;; LSP + (add-to-list 'lsp-language-id-configuration '(".*\\.slang$" . "slang")) + (lsp-register-client (make-lsp-client + :new-connection (lsp-stdio-connection "slangd") + :activation-fn (lsp-activate-on "slang") + :server-id 'slang)))) + +(with-eval-after-load 'eglot + (progn + (add-to-list 'eglot-server-programs '(slang-ts-mode . ("slangd"))) + )) +#+end_src + +**** slang-mode #+begin_src emacs-lisp (require 'slang-ts-mode) (add-hook 'slang-ts-mode-hook (lambda () (hs-minor-mode -1))) #+end_src #+begin_src emacs-lisp :tangle "local-lisp/slang-ts-mode.el" +;;; -*- lexical-binding: t -*- (require 'treesit) +(eval-when-compile (require 'rx)) +(require 'c-ts-common) + (add-to-list 'treesit-language-source-alist - '(slang "https://github.com/tree-sitter-grammars/tree-sitter-slang")) - -(with-eval-after-load 'lsp-mode - (progn - ;; tree-sitter - - ;; LSP - (add-to-list 'lsp-language-id-configuration '(".*\\.slang$" . "slang")) - (lsp-register-client (make-lsp-client - :new-connection (lsp-stdio-connection "/opt/shader-slang-bin/bin/slangd") - :activation-fn (lsp-activate-on "slang") - :server-id 'slang)) - )) - -(require 'c-ts-common) -(require 'c-ts-mode) + `(slang "https://github.com/tree-sitter-grammars/tree-sitter-slang")) (defgroup slang nil "Khronos Slang Major Mode." :group 'languages) @@ -1991,6 +2002,8 @@ hlsl-mode: (modify-syntax-entry ?* ". 23" table) (modify-syntax-entry ?\n "> b" table) (modify-syntax-entry ?\^m "> b" table) + ;; underscore is part of words + (modify-syntax-entry ?_ "w" table) table) "Syntax table for `slang-ts-mode'.") @@ -2182,7 +2195,7 @@ delimiters < and >'s." :defer t :after (inheritenv envrc) ;; :after (rust-mode) - ;; :hook(rustic-mode . nemo/lsp-format-on-save-mode) + :hook(rustic-mode . nemo/lsp-format-on-save-mode) :general-config (general-define-key :prefix-map 'nemo/rust-map