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.el129
1 files changed, 115 insertions, 14 deletions
diff --git a/user/emacs/init.el b/user/emacs/init.el
index 69c71d00..af60817a 100644
--- a/user/emacs/init.el
+++ b/user/emacs/init.el
@@ -31,6 +31,8 @@
   (interactive)
   (load-file user-init-file))
 
+(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
+
 (setq use-package-enable-imenu-support t)
 (require 'use-package)
 (setq use-package-always-demand (daemonp)
@@ -73,15 +75,14 @@
 
 (when (or (daemonp)
           window-system)
+  (use-package doom-themes
+    :config (progn
+              (load-theme 'doom-one-light :noconfirm)
+              (doom-themes-org-config)))
   (use-package stimmung-themes
+    :disabled t
     :config (progn
-              (require 'stimmung-themes-light-theme)
-              (let ((light-mode-theme 'stimmung-themes-light)
-                    (dark-mode-theme 'stimmung-themes-dark)
-                    (original-stimmung-themes-string stimmung-themes-string))
-                (load-theme light-mode-theme :noconfirm :noenable)
-                (load-theme dark-mode-theme :noconfirm :noenable)
-                (enable-theme light-mode-theme)
+              (let ((original-stimmung-themes-string stimmung-themes-string))
                 (defun toggle-stimmung-string-highlighting ()
                   (interactive)
                   (let ((current-theme (car custom-enabled-themes)))
@@ -90,6 +91,23 @@
                                                    original-stimmung-themes-string))
                     (load-theme current-theme :noconfirm)))))))
 
+(let ((light-mode-theme 'doom-one-light)
+      (dark-mode-theme 'doom-one))
+  (load-theme light-mode-theme :noconfirm :noenable)
+  (load-theme dark-mode-theme :noconfirm :noenable)
+  (enable-theme light-mode-theme)
+  (defun my/switch-theme-variant (mode)
+    (interactive (list
+                  (intern (completing-read "Make it: " '("light" "dark") nil t))))
+    (cond
+     ((eq mode 'dark)
+      (disable-theme light-mode-theme)
+      (enable-theme dark-mode-theme))
+     ((eq mode 'light)
+      (disable-theme dark-mode-theme)
+      (enable-theme light-mode-theme)))
+    (modify-all-frames-parameters '((ns-appearance mode)))))
+
 (global-set-key (kbd "<pinch>") 'ignore)
 (global-set-key (kbd "<C-wheel-up>") 'ignore)
 (global-set-key (kbd "<C-wheel-down>") 'ignore)
@@ -137,6 +155,15 @@
 (setq-default display-line-numbers 'relative
               display-line-numbers-widen t
               display-line-numbers-width 4)
+
+(defun turn-off-display-line-numbers-mode ()
+  (interactive)
+  (display-line-numbers-mode -1))
+
+(defun turn-on-display-line-numbers-mode ()
+  (interactive)
+  (display-line-numbers-mode (default-value 'display-line-numbers)))
+
 (setq frame-resize-pixelwise t
       window-resize-pixelwise t
       display-buffer-alist `(("\\*\\(?:shell\\|compilation\\)\\*" display-buffer-in-side-window
@@ -156,6 +183,13 @@
 (add-hook 'evil-insert-state-entry-hook #'noct-absolute)
 (add-hook 'evil-insert-state-exit-hook #'noct-relative)
 
+(use-package ultra-scroll
+  :defer 1
+  :config (progn
+            (setq scroll-margin 0
+                  scroll-conservatively 101)
+            (ultra-scroll-mode +1)))
+
 ;;; Encoding
 
 (setq-default bidi-paragraph-direction 'left-to-right
@@ -189,6 +223,32 @@ With two prefix arguments, write out the day and month name."
 
 ;;; Keybindings
 
+(defun prot/keyboard-quit-dwim ()
+  "Do-What-I-Mean behaviour for a general `keyboard-quit'.
+
+The generic `keyboard-quit' does not do the expected thing when
+the minibuffer is open.  Whereas we want it to close the
+minibuffer, even without explicitly focusing it.
+
+The DWIM behaviour of this command is as follows:
+
+- When the region is active, disable it.
+- When a minibuffer is open, but not focused, close the minibuffer.
+- When the Completions buffer is selected, close it.
+- In every other case use the regular `keyboard-quit'."
+  (interactive)
+  (cond
+   ((region-active-p)
+    (keyboard-quit))
+   ((derived-mode-p 'completion-list-mode)
+    (delete-completion-window))
+   ((> (minibuffer-depth) 0)
+    (abort-recursive-edit))
+   (t
+    (keyboard-quit))))
+
+(define-key global-map (kbd "C-g") #'prot/keyboard-quit-dwim)
+
 (when (eq system-type 'darwin)
   (setq mac-option-modifier 'meta
         mac-right-option-modifier 'none
@@ -196,7 +256,8 @@ With two prefix arguments, write out the day and month name."
         mac-right-control-modifier 'left
         mac-command-modifier 'super
         mac-right-command-modifier 'left
-        mac-function-modifier 'hyper))
+        mac-function-modifier 'hyper)
+  (define-key global-map (kbd "s-w") #'kill-this-buffer))
 
 (use-package avy
   :defer 2
@@ -411,8 +472,9 @@ _C-k_: prev  _u_pper              _=_: upper/lower       _s_mart resolve
            "C-;" #'evil-avy-goto-line)
   (:states 'normal
            ";" #'evil-ex)
-  (:states '(normal motion)
-           "g s" #'evil-avy-goto-symbol-1))
+  (:states '(normal)
+           "g s" #'consult-imenu
+           "g S" #'my/ls-consult-symbol))
 
 (add-hook 'c-mode-common-hook ; make b/w/e include underscore as *part* of a word
           (lambda () (modify-syntax-entry ?_ "w")))
@@ -424,6 +486,10 @@ _C-k_: prev  _u_pper              _=_: upper/lower       _s_mart resolve
 
 (use-package evil-collection
   :demand t
+  :general ( :keymaps 'evil-collection-unimpaired-mode-map
+             :states 'normal
+             "[ d" #'evil-collection-unimpaired-previous-error
+             "] d" #'evil-collection-unimpaired-next-error)
   :config (progn
             (setq evil-collection-magit-use-y-for-yank nil
                   evil-collection-corfu-key-themes '(default magic-return))
@@ -582,6 +648,27 @@ _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-core
+  :config (progn
+            (with-demoted-errors "TabNine error: %s"
+              (global-tabnine-mode))
+
+            (define-key tabnine-completion-map (kbd "TAB") #'tabnine-accept-completion)
+            (define-key tabnine-completion-map (kbd "<tab>") #'tabnine-accept-completion)
+
+            (define-key tabnine-completion-map (kbd "M-f") #'tabnine-accept-completion-by-word)
+            (define-key tabnine-completion-map (kbd "M-<return>") #'tabnine-accept-completion-by-line)
+            (define-key tabnine-completion-map (kbd "C-e") #'tabnine-accept-completion-by-line)
+            (define-key tabnine-completion-map (kbd "<right>") #'tabnine-accept-completion-by-line)
+
+            (define-key tabnine-completion-map (kbd "C-g") #'tabnine-clear-overlay)
+            (define-key tabnine-completion-map (kbd "M-[") #'tabnine-next-completion)
+            (define-key tabnine-completion-map (kbd "M-]") #'tabnine-previous-completion))
+  :init (progn
+          (advice-add 'tabnine-start-process :around #'quiet)
+
+          (add-hook 'kill-emacs-hook #'tabnine-kill-process)))
+
 (use-package tempel
   :general ("M-+" #'tempel-complete ;; Alternative tempel-expand
             "M-*" #'tempel-insert
@@ -687,6 +774,7 @@ _C-k_: prev  _u_pper              _=_: upper/lower       _s_mart resolve
   :defer 5
   :commands (eshell)
   :functions (eshell/pwd)
+  :gfhook #'turn-off-display-line-numbers-mode
   :general (:keymaps 'eshell-command-map
                      "C-r" #'eshell-history-backwards
                      "C-s" #'eshell-history-forwards)
@@ -741,6 +829,12 @@ _C-k_: prev  _u_pper              _=_: upper/lower       _s_mart resolve
   :general (:keymaps 'comint-mode-map
                      "C-c C-l" #'counsel-shell-history))
 
+(use-package chatgpt-shell
+  :defer 5
+  :config (progn
+            (chatgpt-shell-ollama-load-models :override t)
+            (setq chatgpt-shell-model-version "llama3.3")))
+
 ;;; Editing
 
 (setq-default tab-always-indent 'complete
@@ -793,12 +887,19 @@ _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))
+(add-to-list 'auto-mode-alist '("\\.lock" . json-ts-mode))
 
 ;;;; typescript
 
 (use-package astro-ts-mode
   :mode (("\\.astro\\'" . astro-ts-mode)))
 
+(define-derived-mode dnscontrol-mode typescript-ts-mode "DNSControl"
+  "Major mode for editing configuration of DNSControl."
+  (if (featurep 'apheleia)
+      (setq-local apheleia-formatter 'dnscontrol)))
+(add-to-list 'auto-mode-alist '("dnsconfig.js\\'" . dnscontrol-mode))
+
 (autoload 'ansi-color-apply-on-region "ansi-color")
 (defun colourise-compilation-buffer ()
   (ansi-color-apply-on-region compilation-filter-start (point-max)))
@@ -1058,10 +1159,8 @@ paths for the same project."
 (setq ispell-extra-args '("--sug-mode=ultra" "--camel-case"))
 
 (use-package jinx-mode
-  :defer 1
-  :ghook ('(text-mode-hook
-            prog-mode-hook
-            conf-mode-hook))
+  :defer 10
+  :ghook 'text-mode-hook
   :general ([remap ispell-word] #'jinx-correct-word
             [remap evil-prev-flyspell-error] #'jinx-previous
             [remap evil-next-flyspell-error] #'jinx-next)
@@ -1107,6 +1206,7 @@ paths for the same project."
             js-base-mode-hook
             css-base-mode-hook
             lua-mode-hook
+            markdown-mode-hook
             nim-mode-hook
             html-mode-hook
             nix-mode-hook
@@ -1231,6 +1331,7 @@ paths for the same project."
                   '("shfmt"))
             (setq apheleia-formatters
                   (append apheleia-formatters '((nixpkgs-fmt "nixpkgs-fmt")
+                                                (dnscontrol "dnscontrol" "fmt")
                                                 (golines "golines")
                                                 (taplo "taplo" "format" "-")
                                                 (prettier-gotmpl