summary refs log tree commit diff stats
path: root/user/emacs/init.el
diff options
context:
space:
mode:
Diffstat (limited to 'user/emacs/init.el')
-rw-r--r--user/emacs/init.el144
1 files changed, 110 insertions, 34 deletions
diff --git a/user/emacs/init.el b/user/emacs/init.el
index bec96ede..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."
@@ -574,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"
@@ -641,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)
 
@@ -672,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))
@@ -713,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 ()
@@ -783,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
@@ -792,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
 
@@ -804,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)))
@@ -812,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)
 
@@ -888,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
 
@@ -947,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
@@ -967,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)
@@ -980,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
@@ -1007,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"))
@@ -1040,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
@@ -1054,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)
@@ -1061,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 ()
@@ -1096,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‽
                   )
@@ -1137,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
 
@@ -1172,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)))
@@ -1194,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
@@ -1228,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)