#+title: Setup Fschl Ide Configuration #+PROPERTY: header-args:emacs-lisp :tangle ./modules/fschl-ide.el :mkdirp yes :tangle-mode "ugo=r" * Basic configuration ** Additional Packages #+begin_src emacs-lisp ;;; fschl-ide.el -- Fschl Crafted Emacs user customization file -*- lexical-binding: t; -*- ;; This file is generated from the .org-file with the same name. If you want to edit the ;; configuration, DO NOT edit this .el-file, edit .org, instead. (add-to-list 'package-selected-packages 'cargo) (add-to-list 'package-selected-packages 'rustic) (add-to-list 'package-selected-packages 'ob-rust) (add-to-list 'package-selected-packages 'ob-rust) (package-install-selected-packages :noconfirm) #+end_src ** Setup Rustic :noexport: This is borrowed from https://robert.kra.hn/posts/rust-emacs-setup/ #+begin_src emacs-lisp :tangle no (use-package rustic :ensure :bind (:map rustic-mode-map ("M-j" . lsp-ui-imenu) ("M-ö" . lsp-find-references) ("C-c C-c l" . flycheck-list-errors) ("C-c C-c a" . lsp-execute-code-action) ("C-c C-c r" . lsp-rename) ("C-c C-c q" . lsp-workspace-restart) ("C-c C-c Q" . lsp-workspace-shutdown) ("C-c C-c s" . lsp-rust-analyzer-status)) :config ;; uncomment for less flashiness ;; (setq lsp-eldoc-hook nil) ;; (setq lsp-enable-symbol-highlighting nil) ;; (setq lsp-signature-auto-activate nil) ;; comment to disable rustfmt on save (setq rustic-format-on-save t) (add-hook 'rustic-mode-hook 'rk/rustic-mode-hook)) (defun rk/rustic-mode-hook () ;; so that run C-c C-c C-r works without having to confirm, but don't try to ;; save rust buffers that are not file visiting. Once ;; https://github.com/brotzeit/rustic/issues/253 has been resolved this should ;; no longer be necessary. (when buffer-file-name (setq-local buffer-save-without-query t)) (add-hook 'before-save-hook 'lsp-format-buffer nil t)) #+end_src ** Setup LSP-mode and LSP-ui :noexport: #+begin_src emacs-lisp :tangle no (use-package lsp-mode :ensure :commands lsp :custom ;; what to use when checking on-save. "check" is default, I prefer clippy (lsp-rust-analyzer-cargo-watch-command "clippy") (lsp-eldoc-render-all t) (lsp-idle-delay 0.6) ;; enable / disable the hints as you prefer: (lsp-inlay-hint-enable t) ;; These are optional configurations. See https://emacs-lsp.github.io/lsp-mode/page/lsp-rust-analyzer/#lsp-rust-analyzer-display-chaining-hints for a full list (lsp-rust-analyzer-display-lifetime-elision-hints-enable "skip_trivial") (lsp-rust-analyzer-display-chaining-hints t) (lsp-rust-analyzer-display-lifetime-elision-hints-use-parameter-names nil) (lsp-rust-analyzer-display-closure-return-type-hints t) (lsp-rust-analyzer-display-parameter-hints nil) (lsp-rust-analyzer-display-reborrow-hints nil) :config (add-hook 'lsp-mode-hook 'lsp-ui-mode)) (use-package lsp-ui :ensure :commands lsp-ui-mode :custom (lsp-ui-peek-always-show t) (lsp-ui-sideline-show-hover t) (lsp-ui-doc-enable nil)) #+end_src ** Rust-Mode with Eglot inspired by [[https://unwoundstack.com/blog/emacs-as-a-rust-ide.html][unwoundstack.com > Blog > Emacs as Rust IDE]] #+begin_src lisp :tangle ./modules/fschl-ide.el (use-package smartparens :ensure t :config (require 'smartparens-rust)) (defun sp1ff/rust/mode-hook () "My rust-mode hook" (column-number-mode) (display-line-numbers-mode) (hs-minor-mode) (smartparens-mode) (define-key rust-mode-map "\C-ca" 'eglot-code-actions) (define-key rust-mode-map (kbd "C-") 'sp-forward-slurp-sexp) (define-key rust-mode-map (kbd "C-") 'sp-forward-barf-sexp) (define-key rust-mode-map (kbd "C-M-") 'sp-backward-slurp-sexp) (define-key rust-mode-map (kbd "C-M-") 'sp-backward-barf-sexp) (define-key rust-mode-map "\C-c>" 'hs-show-all) (define-key rust-mode-map "\C-c<" 'hs-hide-all) (define-key rust-mode-map "\C-c-" 'hs-toggle-hiding) (define-key rust-mode-map "\C-c+" 'hs-hide-level) (setq indent-tabs-mode nil tab-width 4 c-basic-offset 4 fill-column 100)) (use-package rust-mode :ensure t :hook (rust-mode . sp1ff/rust/mode-hook) :config (let ((dot-cargo-bin (expand-file-name "~/.cargo/bin/"))) (setq rust-rustfmt-bin (concat dot-cargo-bin "rustfmt") rust-cargo-bin (concat dot-cargo-bin "cargo") rust-format-on-save t))) (use-package clippy-flymake :vc (:url "https://git.sr.ht/~mgmarlow/clippy-flymake" :branch main) :hook (rust-mode . clippy-flymake-setup-backend)) (defun clippy-flymake-manually-activate-flymake () "Shim for working around eglot's tendency to suppress flymake backends." (add-hook 'flymake-diagnostic-functions #'eglot-flymake-backend nil t) (flymake-mode 1)) ;; `eglot' by default will suppress all other flymake backends than its own ;; This workaround will ;; add `flymake-clippy' (use-package eglot :ensure t :hook ((rust-mode . eglot-ensure) (eglot-managed-mode . clippy-flymake-manually-activate-flymake)) :config (add-to-list 'eglot-stay-out-of 'flymake)) #+end_src ** Auto-completion lsp-mode integrates with company mode #+begin_src emacs-lisp :tangle ./modules/fschl-ide.el (use-package company :ensure :custom (company-idle-delay 0.5) ;; how long to wait until popup ;; (company-begin-commands nil) ;; uncomment to disable popup :bind (:map company-active-map ("C-n". company-select-next) ("C-p". company-select-previous) ("M-<". company-select-first) ("M->". company-select-last))) #+end_src ** Inline stuff hints and errors #+begin_src emacs-lisp (use-package flycheck :ensure) (setq lsp-inlay-hint-enable t) #+end_src