Configuration files
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))