diff options
Diffstat (limited to 'user/emacs')
-rw-r--r-- | user/emacs/early-init.el | 7 | ||||
-rw-r--r-- | user/emacs/init.el | 150 |
2 files changed, 123 insertions, 34 deletions
diff --git a/user/emacs/early-init.el b/user/emacs/early-init.el index 29dadb92..d24c661d 100644 --- a/user/emacs/early-init.el +++ b/user/emacs/early-init.el @@ -4,9 +4,16 @@ frame-inhibit-implied-resize t byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local cl-functions)) +(require 'xdg) +(startup-redirect-eln-cache + (expand-file-name "emacs/native-compile" + (xdg-cache-home))) + ;; Disable all the bars, unless on macOS, in which case, keep the menu bar. (unless (eq window-system 'ns) (menu-bar-mode -1)) (scroll-bar-mode -1) (tool-bar-mode -1) (set-fringe-mode '(4 . 4)) + +(setenv "LSP_USE_PLISTS" "true") ; must match with lsp-mode override diff --git a/user/emacs/init.el b/user/emacs/init.el index dddd0ec0..b666e033 100644 --- a/user/emacs/init.el +++ b/user/emacs/init.el @@ -90,6 +90,10 @@ original-stimmung-themes-string)) (load-theme current-theme :noconfirm))))))) +(global-set-key (kbd "<pinch>") 'ignore) +(global-set-key (kbd "<C-wheel-up>") 'ignore) +(global-set-key (kbd "<C-wheel-down>") 'ignore) + (setq font-lock-maximum-decoration '((t . 1)) jit-lock-stealth-time 1.25 jit-lock-stealth-nice 0.5 @@ -133,7 +137,11 @@ (setq-default display-line-numbers 'relative display-line-numbers-widen t display-line-numbers-width 4) -(setq frame-resize-pixelwise t) +(setq frame-resize-pixelwise t + window-resize-pixelwise t + display-buffer-alist `(("\\*\\(?:shell\\|compilation\\)\\*" display-buffer-in-side-window + (side . bottom) (slot . 0) (preserve-size . (nil . t)) + (no-other-window . t) (no-delete-other-windows . t)))) (defun noct-relative () "Show relative line numbers." @@ -478,6 +486,12 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve :defer 2 :config (evil-commentary-mode +1)) +(use-package evil-lion + :after evil + :defer 10 + :config (progn + (evil-lion-mode +1))) + (use-package evil-matchit :after evil :defer 2 @@ -568,7 +582,7 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (setq kind-icon-default-face 'corfu-default) (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))) -(use-package tabnine +(use-package tabnine-core :config (progn (setq tabnine-binaries-folder "~/.local/tabnine") (with-demoted-errors "TabNine error: %s" @@ -635,11 +649,10 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve ;;;; Auto-reloading (use-package autorevert - :defer 1 :config (progn (setq auto-revert-verbose nil auto-revert-use-notify t) - (global-auto-revert-mode t))) + (global-auto-revert-mode 1))) (setq delete-by-moving-to-trash t) @@ -666,11 +679,18 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (add-to-list 'tramp-default-proxies-alist `(,(regexp-quote (system-name)) nil nil)))) +(use-package ssh-deploy + :config (progn + (ssh-deploy-line-mode +1) + (ssh-deploy-add-find-file-hook) + (ssh-deploy-add-after-save-hook))) + ;;; Directories (setq dired-dwim-target t dired-recursive-copies 'top dired-listing-switches "-alh --group-directories-first" + dired-kill-when-opening-new-dired-buffer t dired-recursive-deletes (if delete-by-moving-to-trash 'always 'top)) @@ -707,7 +727,9 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (use-package eshell-toggle :commands (eshell-toggle) - :general ("C-`" #'eshell-toggle)) + :general ("C-`" #'eshell-toggle) + :config (progn + (setq eshell-toggle-find-project-root-package 'project))) (declare-function eshell-push-command "esh-buf-stack" (CMD)) (defun my-bind-esh-push () @@ -777,6 +799,13 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (with-eval-after-load 'project (add-to-list 'project-vc-extra-root-markers "go.mod")) +(setq-default go-ts-mode-indent-offset 2) +(use-package templ-ts-mode + :gfhook #'eglot-format-before-save-mode + :defer t + :config (progn + (setq-default go-ts-mode-indent-offset 2))) + ;;;; nim (use-package nim-mode :defer t @@ -786,6 +815,7 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve ;;;; js (setq js-enabled-frameworks '(javascript)) +(add-to-list 'auto-mode-alist '("\\.[cm]js\\'" . js-ts-mode)) ;;;; typescript @@ -798,7 +828,7 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (add-hook 'compilation-filter-hook #'colourise-compilation-buffer) ;;;; shell -(general-add-hook 'sh-mode-hook +(general-add-hook '(sh-mode-hook bash-ts-mode-hook fish-mode-hook) (lambda () (general-add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p :append :local))) @@ -806,8 +836,6 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (add-to-list 'auto-mode-alist '("\\.env\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.zsh\\'" . shell-script-mode)) (add-to-list 'auto-mode-alist '("zshenv\\'" . shell-script-mode)) -(add-to-list 'auto-mode-alist '("zshrc\\'" . shell-script-mode)) -(setq sh-shell-file "/usr/bin/env zsh") (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on) @@ -882,14 +910,16 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (use-package web-mode :mode (("\\.html?.erb\\'" . web-mode) + ("\\.gotmpl\\'" . web-mode) ("\\.tmpl\\'" . web-mode)) :config (setq web-mode-enable-auto-pairing nil web-mode-style-padding 2 web-mode-script-padding 2 - web-mode-engines-alist '(("go" . "\\.tmpl\\'")))) + web-mode-engines-alist '(("go" . "\\.tmpl\\'") + ("go" . "\\.gotmpl\\'")))) (use-package emmet-mode - :ghook '(web-mode-hook sgml-mode-hook)) + :ghook '(web-mode-hook sgml-mode-hook templ-ts-mode-hook)) ;;; IDE features @@ -941,6 +971,32 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (evil-ex-define-cmd "pb" #'project-switch-to-buffer) (evil-ex-define-cmd "psw[itch]" #'project-switch-project)))) +(use-package treemacs + :general (:keymaps 'treemacs-mode-map + [mouse-1] #'treemacs-single-click-expand-action) + :config (progn + (treemacs-project-follow-mode t) + (setq treemacs-is-never-other-window t + treemacs-select-when-already-in-treemacs 'move-back + treemacs-eldoc-display nil + treemacs-indentation '(8 px) + treemacs-show-hidden-files nil + treemacs-recenter-after-project-jump 'on-distance + treemacs-missing-project-action 'remove))) + +(use-package treemacs-evil + :after treemacs) + +(use-package treemacs-magit + :after treemacs) + +(use-package treemacs-nerd-icons + :after treemacs + :init (progn + (setq treemacs-nerd-icons-tab " ")) + :config (progn + (treemacs-load-theme "simple"))) + (use-package consult-ghq :defer 5 :general (:keymaps 'project-prefix-map @@ -961,12 +1017,15 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve :general ([remap project-vc-dir] #'magit-project-status) (:keymaps 'project-prefix-map "m" #'magit-project-status) :init (progn - (with-eval-after-load 'project - (add-to-list 'project-switch-commands '(magit-project-status "Magit") t))) + (defvar magit-auto-revert-mode nil) + (setq magit-auto-revert-mode nil) + (require 'project) + (add-to-list 'project-switch-commands '(magit-project-status "Magit") t)) :config (progn (setq magit-section-visibility-indicator nil magit-diff-refine-hunk t - magit-auto-revert-immediately t + magit-auto-revert-mode nil + magit-auto-revert-immediately nil ; unnecessary when global-auto-revert-mode is enabled magit-display-buffer-function #'magit-display-buffer-fullcolumn-most-v1) (remove-hook 'magit-status-sections-hook 'magit-insert-tags-header) (remove-hook 'magit-section-highlight-hook 'magit-section-highlight) @@ -974,6 +1033,11 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (remove-hook 'magit-section-highlight-hook 'magit-diff-highlight) (require 'magit-extras))) +(use-package magit-todos + :after magit + :config (progn + (magit-todos-mode +1))) + (use-package git-gutter-fringe :defer 5 :config (progn @@ -1001,7 +1065,9 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve :defer 2 :config (progn (editorconfig-mode +1) - (setq editorconfig-lisp-use-default-indent t))) + (setq editorconfig-lisp-use-default-indent t) + (setf (alist-get 'templ-ts-mode editorconfig-indentation-alist) + 'go-ts-mode-indent-offset))) (setq-default ispell-dictionary "en_GB-ise-w_accents") (setq ispell-extra-args '("--sug-mode=ultra" "--camel-case")) @@ -1034,11 +1100,22 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (defvaralias 'nix-ts-mode-hook 'nix-mode-hook) +(use-package consult-lsp + :commands (consult-lsp-symbols + consult-lsp-diagnostics)) + +(define-minor-mode eglot-format-before-save-mode + "Whether to ask the LSP to format the buffer before saving" + :init-val nil + (if eglot-format-before-save-mode + (add-hook 'before-save-hook #'eglot-format-buffer nil 'local) + (remove-hook 'before-save-hook #'eglot-format-buffer 'local))) + (use-package eglot :defer 3 :general (:states 'normal :keymaps 'eglot-mode-map "gr" #'xref-find-references - "C-t" #'xref-pop-marker-stack) + "C-t" #'xref-go-back) :ghook ('(typescript-mode-hook dockerfile-mode-hook yaml-mode-hook @@ -1048,6 +1125,7 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve nim-mode-hook html-mode-hook nix-mode-hook + templ-ts-mode-hook toml-ts-mode-hook haskell-mode-hook) #'eglot-ensure) @@ -1055,14 +1133,14 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (when (assoc 'nix-mode eglot-server-programs) (setf (car (assoc 'nix-mode eglot-server-programs)) '(nix-mode nix-ts-mode))) (nconc eglot-server-programs '((toml-ts-mode "taplo" "lsp" "stdio"))) - (advice-add 'eglot--message :before-while (lambda (formatstring &rest rest) + (advice-add 'eglot--message :before-until (lambda (formatstring &rest rest) (s-starts-with-p "Connected!" formatstring))) (defun my/setup-eglot-eldoc () (push 'flymake-eldoc-function eldoc-documentation-functions)) (add-hook 'eglot-managed-mode-hook 'my/setup-eglot-eldoc) (setq-default eglot-workspace-configuration '( :yaml (:keyOrdering nil) - :nix (:autoArchive t) + :nil (:nix (:flake (:autoArchive t))) :gopls ( :staticcheck t :usePlaceholders t))) (defun my/eglot-capf () @@ -1090,12 +1168,13 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve ('lsp-completion-mode-hook #'my/lsp-mode-setup-completion) :general (:states 'normal :keymaps 'lsp-mode-map "gr" #'xref-find-references - "C-t" #'xref-pop-marker-stack) + "C-t" #'xref-go-back) :config (progn (setq lsp-auto-guess-root t lsp-auto-execute-action nil lsp-headerline-breadcrumb-enable nil lsp-enable-suggest-server-download nil + lsp-modeline-diagnostics-enable nil lsp-completion-provider :none ; value `:capf' is actually for company :( lsp-diagnostics-provider t ; this means prefer flymake over flycheck, why‽ ) @@ -1131,16 +1210,18 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (call-interactively #'lsp-rename) (call-interactively #'eglot-rename))) -;; Inside a javascript project, it's common to install tools locally to -;; the project. This will allows emacs to find their executables. +(defun my/ls-consult-symbol () + (interactive) + (if lsp-mode + (call-interactively #'consult-lsp-symbols) + (call-interactively #'consult-eglot-symbols))) -(use-package add-node-modules-path - :config (setq add-node-modules-max-depth 6) - :ghook ('(feature-mode-hook - js-base-mode-hook - json-ts-mode-hook - typescript-ts-mode-hook) - #'add-node-modules-path)) +(defun my/ls-code-actions () + (interactive) + (call-interactively + (if lsp-mode + #'lsp-execute-code-action + #'eglot-code-actions))) ;;;; Reformat on save @@ -1166,15 +1247,13 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve (setq apheleia-formatters (append apheleia-formatters '((nixpkgs-fmt "nixpkgs-fmt") (golines "golines") + (taplo "taplo" "format" "-") (prettier-gotmpl "prettier" "--stdin-filepath" filepath "--parser=go-template" (apheleia-formatters-indent "--use-tabs" "--tab-width"))))) - (setf (alist-get 'go-ts-mode apheleia-mode-alist) - '(golines) - (alist-get 'web-mode apheleia-mode-alist) - '(prettier-gotmpl)) (setq apheleia-mode-alist (append apheleia-mode-alist '((nix-ts-mode . nixpkgs-fmt) - (nix-mode . nixpkgs-fmt)))) + (nix-mode . nixpkgs-fmt) + (toml-ts-mode . taplo)))) (add-hook 'apheleia-mode-hook #'turn-off-format-all-mode)) :init (progn (apheleia-global-mode +1))) @@ -1188,14 +1267,16 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve "w" '(:keymap evil-window-map :package evil) "x" '(:keymap ctl-x-map) "c" (general-simulate-key "C-c") - "j" #'consult-eglot-symbols + "j" #'my/ls-consult-symbol "r" #'my/ls-rename "q" #'evil-delete-buffer "p" '(:keymap project-prefix-map :package project) "v" #'split-window-right "o" #'other-window + "s" #'treemacs-select-window "u" #'universal-argument ";" #'execute-extended-command + "a" #'my/ls-code-actions "bb" #'consult-buffer "bx" #'kill-this-buffer "br" #'revert-buffer @@ -1222,7 +1303,8 @@ _C-k_: prev _u_pper _=_: upper/lower _s_mart resolve "iu" #'insert-char "xe" #'eval-last-sexp "xx" #'eval-defun - "xi" #'consult-imenu) + "xi" #'consult-imenu + "z" '(:keymap ssh-deploy-prefix-map :package ssh-deploy)) (let ((mail-config (expand-file-name "mail.el" user-emacs-directory))) (if (file-readable-p mail-config) |