Configuration files
at dev 11 kB view raw
1;; init.el -*- lexical-binding: t; -*- 2;;;;;;;;;;; 3;; UTILS ;; 4;;;;;;;;;;; 5(defun conf-dir(&optional path) 6 (expand-file-name (or path "") user-emacs-directory)) 7(defun temp-dir(path) 8 (let ((temp-dir (expand-file-name path temporary-file-directory))) 9 (unless (file-exists-p temp-dir) 10 (make-directory temp-dir)) 11 temp-dir)) 12 13;;;;;;;;;;;;;;;;;;;; 14;; REROUTE CUSTOM ;; 15;;;;;;;;;;;;;;;;;;;; 16(setq custom-file (conf-dir "emacs.custom.el")) 17(when (file-exists-p custom-file) 18 (load-file custom-file)) 19 20;;;;;;;;;;;;;;;;;;;;;;;;;; 21;; PACKAGE REPOSITORIES ;; 22;;;;;;;;;;;;;;;;;;;;;;;;;; 23(require 'package) 24(add-to-list 'package-archives 25 '("melpa" . "https://melpa.org/packages/") t) 26 27;;;;;;;;;;;;;; 28;; LOAD ENV ;; 29;;;;;;;;;;;;;; 30(setq krg-env-file-name ".env.el") 31(when window-system 32 (let ((env-file (conf-dir krg-env-file-name))) 33 (when (file-exists-p env-file) 34 (load env-file)))) 35 36(defun update-env-file() 37 (interactive) 38 (let ((shell-path (getenv "PATH")) 39 (env-file (conf-dir krg-env-file-name))) 40 (with-temp-buffer 41 (make-local-variable 'make-backup-files) 42 (setq make-backup-files nil) 43 (insert 44 ";;; " krg-env-file-name " -*- lexical-binding: t; -*-\n" 45 ";;; " (current-time-string) " " (nth 1 (current-time-zone)) ".\n" 46 "(setenv \"PATH\" \"" shell-path "\")\n" 47 "(setq exec-path (split-string \"" shell-path "\" \":\"))") 48 (when (file-writable-p env-file) 49 (write-file env-file))))) 50 51;;;;;;;;;;;;;;;;;;;; 52;; BASIC SETTINGS ;; 53;;;;;;;;;;;;;;;;;;;; 54(when window-system 55 (tool-bar-mode -1) 56 (scroll-bar-mode -1)) 57(menu-bar-mode -1) 58(global-display-line-numbers-mode 1) 59(prefer-coding-system 'utf-8-unix) 60(setq inhibit-splash-screen t) 61(setq initial-scratch-message nil) 62(setq ring-bell-function 'ignore) 63(let ((temp-dir (temp-dir "emacs/"))) 64 (setq backup-directory-alist `((".*" . ,temp-dir))) 65 (setq auto-save-file-name-transforms `((".*" ,temp-dir t))) 66 (setq lock-file-name-transforms `((".*" ,temp-dir t))) 67 (setq desktop-path `(,temp-dir))) 68(setq-default indent-tabs-mode nil) 69(setq-default tab-width 4) 70(setq-default display-line-numbers-width 4) 71(setq desktop-restore-frames nil) 72(setq use-dialog-box nil) 73(setq use-short-answers t) 74(setq dabbrev-case-replace nil) 75(setq read-file-name-completion-ignore-case t) 76(setq switch-to-prev-buffer-skip-regexp "\\*[^\\*]+\\*") 77(setq c-basic-offset 4) 78(setq scroll-margin 10) 79(setq select-enable-clipboard nil) 80(setq evil-normal-state-cursor 'hbar) 81(setq evil-visual-state-cursor 'hbar) 82 83;;;;;;;;;;;;;;;; 84;; APPEARANCE ;; 85;;;;;;;;;;;;;;;; 86(set-frame-font "TX-02 13" nil t) 87(use-package autothemer 88 :ensure t) 89(use-package cl-lib 90 :ensure t) 91(load-file (conf-dir "kanagawa-theme.el")) 92(load-theme 'kanagawa) 93 94;;;;;;;;;;;;;;;;; 95;; EVIL CONFIG ;; 96;;;;;;;;;;;;;;;;; 97(use-package evil 98 :ensure t 99 :init 100 (setq evil-want-C-u-scroll t) 101 (setq evil-undo-system 'undo-redo) 102 (setq evil-want-integration t) 103 (setq evil-want-keybinding nil) 104 (defun kill-current-buffer() (interactive) (kill-buffer (current-buffer))) 105 (defun kill-other-buffers() 106 (interactive) 107 (dolist (elt (buffer-list)) 108 (when (not (eql elt (current-buffer))) 109 (message "Closing " (buffer-name elt)) 110 (kill-buffer elt)))) 111 (defun search-configs() (interactive) (consult-fd (conf-dir) "init.el")) 112 (defun grep-current-word() (interactive) (consult-ripgrep nil (current-word))) 113 (defun save-session() (interactive) (desktop-save (car desktop-path) t)) 114 (defun load-session() (interactive) (desktop-read (car desktop-path))) 115 :config 116 (evil-mode 1) 117 (evil-define-operator yank-to-plus-register (beg end &optional type register yank-handler) 118 "Yank characters to the + register" 119 :move-point nil 120 :repeat nil 121 (interactive "<R><x><y>") 122 (evil-yank beg end type ?+ yank-handler)) 123 (evil-set-leader '(normal visual replace operator) (kbd "SPC")) 124 (evil-define-key 'insert 'global 125 (kbd "C-v") 'clipboard-yank 126 (kbd "C-a") 'move-beginning-of-line 127 (kbd "C-e") 'move-end-of-line) 128 (evil-define-key 'normal 'global 129 (kbd "<leader>.") 'find-file 130 (kbd "<leader>bb") 'evil-switch-to-windows-last-buffer 131 (kbd "<leader>bB") 'switch-to-buffer 132 (kbd "<leader>bs") 'consult-buffer 133 (kbd "<leader>bB") 'project-switch-to-buffer 134 (kbd "<leader>bd") 'kill-current-buffer 135 (kbd "<leader>bD") 'kill-buffer 136 (kbd "<leader>bo") 'kill-other-buffers 137 (kbd "<leader>SPC") 'project-find-file 138 (kbd "<leader>he") 'eval-buffer 139 (kbd "<leader>hf") 'describe-function 140 (kbd "<leader>hv") 'describe-variable 141 (kbd "<leader>cc") 'compile 142 (kbd "<leader>cf") 'format-all-buffer 143 (kbd "<leader>cF") 'format-all-region 144 (kbd "<leader>sg") 'consult-ripgrep 145 (kbd "<leader>sw") 'grep-current-word 146 (kbd "<leader>sf") 'consult-fd 147 (kbd "<leader>sb") 'consult-line 148 (kbd "<leader>sB") 'consult-line-multi 149 (kbd "<leader>sc") 'search-configs 150 (kbd "<leader>p") "\"+p" 151 (kbd "<leader>P") "\"+P" 152 (kbd "<leader>y") 'yank-to-plus-register 153 (kbd "<leader>Y") "\"+yy" 154 (kbd "<leader>gs") 'git-gutter:popup-hunk 155 (kbd "<leader>gr") 'git-gutter:revert-hunk 156 (kbd "<leader>gu") 'git-gutter 157 (kbd "<leader>mu") 'toggle-frame-maximized 158 (kbd "<leader>qs") 'save-session 159 (kbd "<leader>ql") 'load-session 160 (kbd "[c") 'git-gutter:previous-hunk 161 (kbd "]c") 'git-gutter:next-hunk 162 (kbd "L") 'evil-next-buffer 163 (kbd "H") 'evil-prev-buffer 164 (kbd "gC") 'comment-box 165 (kbd "C-h") 'evil-window-left 166 (kbd "C-j") 'evil-window-down 167 (kbd "C-k") 'evil-window-up 168 (kbd "C-l") 'evil-window-right)) 169(use-package evil-collection 170 :after evil 171 :ensure t 172 :config 173 (evil-collection-init)) 174(use-package evil-surround 175 :after evil 176 :ensure t 177 :config 178 (global-evil-surround-mode 1)) 179(use-package evil-commentary 180 :after evil 181 :ensure t 182 :config 183 (evil-commentary-mode)) 184(use-package evil-goggles 185 :ensure t 186 :init 187 (setq evil-goggles-duration 0.05) 188 :config 189 (evil-goggles-mode)) 190 191;;;;;;;;;;;;;;;;;;;;;;; 192;; COMPLETION CONFIG ;; 193;;;;;;;;;;;;;;;;;;;;;;; 194(use-package vertico 195 :ensure t 196 :custom 197 (vertico-cycle t) 198 :config 199 (vertico-mode)) 200 201(use-package corfu 202 :ensure t 203 :init 204 (setq corfu-auto t) 205 (global-corfu-mode) 206 (define-key corfu-map (kbd "C-n") 'corfu-next) 207 (define-key corfu-map (kbd "C-p") 'corfu-previous) 208 (define-key corfu-map (kbd "C-l") 'corfu-insert) 209 (define-key corfu-map (kbd "C-e") 'corfu-reset)) 210(use-package corfu-terminal 211 :ensure t 212 :after corfu 213 :init 214 (unless (display-graphic-p) 215 (corfu-terminal-mode +1))) 216(use-package cape 217 :ensure t 218 :bind ("C-c p" . cape-prefix-map) 219 :init 220 (add-hook 'completion-at-point-functions #'cape-dabbrev) 221 (add-hook 'completion-at-point-functions #'cape-file) 222 (add-hook 'completion-at-point-functions #'cape-keyword)) 223 224;;;;;;;;;;;;;;;;;;;; 225;; LANGUAGE MODES ;; 226;;;;;;;;;;;;;;;;;;;; 227(use-package cmake-mode :ensure t :if (executable-find "cmake")) 228(use-package toml-mode :ensure t) 229(use-package zig-mode :ensure t :if (executable-find "zig")) 230(use-package rust-mode :ensure t :if (or (executable-find "cargo") (executable-find "rustc"))) 231(mapc 'load (file-expand-wildcards (conf-dir "local-modes/*.el"))) 232 233 234;;;;;;;;;;;;;;;;;;;; 235;; OTHER PACKAGES ;; 236;;;;;;;;;;;;;;;;;;;; 237(use-package which-key 238 :ensure t 239 :config 240 (which-key-mode)) 241 242(use-package consult 243 :ensure t 244 :hook (completion-list-mode . consult-preview-at-point-mode) 245 ) 246 247(use-package orderless 248 :ensure t 249 :custom 250 (completion-styles '(orderless basic)) 251 (completion-category-overrides '((file (styles basic partial-completion))))) 252 253(use-package hl-todo 254 :ensure t 255 :hook (prog-mode . hl-todo-mode) 256 :config 257 (setq hl-todo-highlight-punctuation ":" 258 hl-todo-keyword-faces 259 `(("TODO" warning bold) 260 ("FIXME" error bold) 261 ("HACK" font-lock-constant-face bold) 262 ("REVIEW" font-lock-keyword-face bold) 263 ("NOTE" success bold) 264 ("DEPRECATED" font-lock-doc-face bold)))) 265 266(use-package git-gutter 267 :ensure t 268 :init 269 (setq git-gutter:update-interval 2) 270 :config 271 (global-git-gutter-mode +1)) 272 273(use-package language-id 274 :ensure t 275 :vc (:url "https://github.com/lassik/emacs-language-id")) 276(use-package format-all 277 :ensure t 278 :after language-id 279 :config 280 (define-format-all-formatter gersemi 281 (:executable "gersemi") 282 (:install) 283 (:languages "CMake") 284 (:features) 285 (:format (format-all--buffer-easy executable "-"))) 286 (setq-default format-all-formatters 287 `(("C" (clang-format)) 288 ("C++" (clang-format)) 289 ("Rust" (rustfmt)) 290 ("TOML" (taplo-fmt)) 291 ("CMake" (gersemi)) 292 ("Shell" (shfmt "-i" ,(format "%d" tab-width)))))) 293 294 295(use-package emacs 296 :hook (kill-emacs . save-session) 297 :custom 298 (enable-recursive-minibuffers t) 299 (tab-always-indent 'complete) 300 (read-extended-command-predicate #'command-completion-default-include-p)) 301 302;;;;;;;;;;;;;;;;;;;; 303;; PERSIST VALUES ;; 304;;;;;;;;;;;;;;;;;;;; 305 306(defcustom krg-persist-file-name ".emacs.persist" 307 "Filename for persist-file." 308 :type 'string) 309(defun krg-persist-file () 310 "Returns expanded path to current persist-file. 311Filename for the file can be set using ‘krg-persist-file-name'." 312 (conf-dir krg-persist-file-name)) 313 314(defun krg-save-persist-file () 315 "Save persist-file on disk at location defined by \\[krg-persist-file]." 316 (let ((frame-left (frame-parameter (selected-frame) 'left)) 317 (frame-top (frame-parameter (selected-frame) 'top)) 318 (frame-width (frame-parameter (selected-frame) 'width)) 319 (frame-height (frame-parameter (selected-frame) 'height)) 320 (persist-file (krg-persist-file))) 321 (with-temp-buffer 322 (make-local-variable 'make-backup-files) 323 (setq make-backup-files nil) 324 (insert 325 ";;; " krg-persist-file-name " -*- lexical-binding: t; -*-\n" 326 ";;; " (current-time-string) " " (nth 1 (current-time-zone)) ".\n" 327 "(setq initial-frame-alist '(\n" 328 (format " (top . %d)\n" (max frame-top 0)) 329 (format " (left . %d)\n" (max frame-left 0)) 330 (format " (width . %d)\n" (max frame-width 0)) 331 (format " (height . %d)))\n" (max frame-height 0))) 332 (when (file-writable-p persist-file) 333 (write-file persist-file))))) 334 335(defun krg-load-persist-file () 336 "Load persisted settings from the file location defined by \\[krg-persist-file]." 337 (let ((persist-file (krg-persist-file))) 338 (when (file-readable-p persist-file) 339 (load-file persist-file)))) 340 341(when window-system 342 (add-hook 'after-init-hook 'krg-load-persist-file) 343 (add-hook 'kill-emacs-hook 'krg-save-persist-file)) 344 345(unless window-system 346 (xterm-mouse-mode +1))