init.el (32438B)
1 ;; (setq use-package-compute-statistics t ;; use-package-report 2 ;; garbage-collection-messages t) 3 4 (setq auto-save-interval 24 5 delete-by-moving-to-trash t 6 echo-keystrokes 0.1 7 enable-recursive-minibuffers t 8 frame-inhibit-implied-resize t 9 gc-cons-percentage (* gc-cons-percentage 2) 10 history-length t 11 next-screen-context-lines 5 12 load-prefer-newer t 13 read-process-output-max (* 1024 1024) 14 scroll-conservatively 10000 15 use-dialog-box nil 16 user-full-name "David Wen Riccardi-Zhu" 17 ring-bell-function 'ignore 18 x-stretch-cursor t) 19 20 ;; Default variables that may be overwritten in a buffer. 21 (setq-default fill-column 80 22 tab-width 8 23 truncate-lines nil) 24 25 ;; Startup 26 (setq blink-cursor-mode nil 27 inhibit-splash-screen t 28 inhibit-startup-message t 29 initial-major-mode 'org-mode 30 initial-scratch-message nil 31 user-mail-address "dwrz@dwrz.net") 32 33 (put 'downcase-region 'disabled nil) 34 (put 'upcase-region 'disabled nil) 35 36 ;; Custom 37 (setq custom-file "~/.cache/custom.el") 38 39 ;; Functions 40 (defun dwrz-copy-filepath () 41 "Copy the current buffer file path to the clipboard." 42 (interactive) 43 (let ((filename (if (equal major-mode 'dired-mode) 44 default-directory (buffer-file-name)))) 45 (when filename (kill-new filename) 46 (message "Copied buffer path '%s' to the clipboard." filename)))) 47 48 (defun dwrz-copy-filename () 49 "Get the filename of the current buffer without the directory." 50 (interactive) 51 (when buffer-file-name 52 (let ((filename (file-name-nondirectory buffer-file-name))) 53 (when filename (kill-new filename) 54 (message "Copied buffer name '%s' to the clipboard." filename))))) 55 56 (defun dwrz-highlight-keywords () 57 "Highlight keywords." 58 (font-lock-add-keywords 59 nil '(("\\<\\(FIX\\|TODO\\|NB\\)" 1 font-lock-warning-face t)))) 60 61 (defun dwrz-insert-date () 62 "Insert date at point." 63 (interactive) 64 (insert (format-time-string "%Y%m%d"))) 65 66 (defun dwrz-insert-timestamp () 67 "Insert timestamp at point." 68 (interactive) 69 (insert (format-time-string "%FT%T%z"))) 70 71 (defun dwrz-org-capture-at-point () 72 "Insert an org capture template at point." 73 (interactive) 74 (org-capture 0)) 75 76 (defun dwrz-shell-in-current-directory () 77 "Create or switch to a shell buffer for the current directory." 78 (interactive) 79 (let* ((default-directory (if (buffer-file-name) 80 (file-name-directory (buffer-file-name)) 81 default-directory)) 82 (dir-path (expand-file-name default-directory)) 83 (shell-buffer-name (concat "*shell:" dir-path "*")) 84 (existing-shell-buffer (get-buffer shell-buffer-name))) 85 (if existing-shell-buffer 86 (switch-to-buffer existing-shell-buffer) 87 (shell (generate-new-buffer-name shell-buffer-name))))) 88 89 (defun dwrz-vterm-in-current-directory () 90 "Create or switch to a vterm buffer for the current directory." 91 (interactive) 92 (let* ((default-directory (if (buffer-file-name) 93 (file-name-directory (buffer-file-name)) 94 default-directory)) 95 (dir-path (expand-file-name default-directory)) 96 (vterm-buffer-name (concat "*vterm:" dir-path "*")) 97 (existing-vterm-buffer (get-buffer vterm-buffer-name))) 98 (if existing-vterm-buffer 99 (switch-to-buffer existing-vterm-buffer) 100 (vterm (generate-new-buffer-name vterm-buffer-name))))) 101 102 (defun dwrz-split-window-two-thirds () 103 "Split the current window into two, with a 2/3 and 1/3 vertical split." 104 (interactive) 105 (select-window (split-window-vertically 106 (floor (* 0.666 (window-total-height)))))) 107 108 (defun dwrz-unfill-region-or-paragraph (&optional beg end) 109 "Unfill paragraph or active region. If region is active, join all lines delimited by BEG and END, while respecting empty lines as paragraph delimiters. If no region is active, operate on the paragraph." 110 (interactive "r") 111 (let ((fill-column most-positive-fixnum)) 112 (if (use-region-p) (fill-region beg end) (fill-paragraph)))) 113 114 ;; Packages 115 (require 'package) 116 (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) 117 118 (use-package abbrev :ensure nil :init (abbrev-mode t)) 119 120 (use-package autorevert 121 :config (setq auto-revert-verbose nil 122 global-auto-revert-non-file-buffers t) 123 :init (global-auto-revert-mode t) 124 :ensure nil) 125 126 (use-package avy 127 :config (setq avy-all-windows 'all-frames 128 avy-background t 129 avy-case-fold-search nil 130 avy-keys '(?a ?o ?e ?u ?h ?t ?n ?s) 131 avy-style 'at-full) 132 :defer t 133 :ensure t) 134 135 (use-package base16-theme 136 :ensure t 137 :init (setq base16-theme-256-color-source 'colors) 138 (load-theme 'base16-tomorrow t) 139 (set-face-attribute 'fringe nil :background "#ffffff")) 140 141 (use-package bookmark :config (setq bookmark-save-flag 1) :ensure nil) 142 143 (use-package calendar 144 :config (setq calendar-chinese-all-holidays-flag t 145 calendar-week-start-day 1 146 diary-file "~/org/diary.org") 147 (calendar-set-date-style 'iso) 148 :ensure nil) 149 150 (use-package cape 151 :init 152 (add-to-list 'completion-at-point-functions #'cape-abbrev) 153 (add-to-list 'completion-at-point-functions #'cape-dabbrev) 154 (add-to-list 'completion-at-point-functions #'cape-emoji) 155 (add-to-list 'completion-at-point-functions #'cape-dict) 156 (add-to-list 'completion-at-point-functions #'cape-file) 157 (add-to-list 'completion-at-point-functions #'cape-keyword) 158 (add-to-list 'completion-at-point-functions #'cape-history) 159 (add-to-list 'completion-at-point-functions #'cape-sgml) 160 (add-to-list 'completion-at-point-functions #'cape-rfc1345) 161 :ensure t) 162 163 (use-package cc-vars 164 :config (setq-default c-basic-offset 8) 165 :defer t 166 :ensure nil) 167 168 (use-package comp 169 :config (setq native-comp-async-report-warnings-errors nil) 170 :ensure nil) 171 172 (use-package compile 173 :config (setq compilation-message-face 'default) 174 :defer t 175 :ensure nil) 176 177 (use-package conf-mode :ensure nil) 178 179 (use-package consult 180 :bind (("C-h i" . consult-info) 181 ("C-r" . consult-ripgrep) 182 ("C-s" . consult-line) 183 ("C-x 4 b" . consult-buffer-other-window) 184 ("C-x 5 b" . consult-buffer-other-frame) 185 ("C-x b" . consult-buffer) 186 ("C-x p b" . consult-project-buffer) 187 ("C-x r b" . consult-bookmark) 188 ("C-y" . consult-yank-pop) 189 ([remap yank-pop] . consult-yank-pop) 190 ("M-g I" . consult-imenu-multi) 191 ("M-g M-g" . consult-goto-line) 192 ("M-g g" . consult-goto-line) 193 ("M-g i" . consult-imenu) 194 ("M-y" . yank) 195 :map minibuffer-local-map 196 ("M-s" . consult-history) 197 ("M-r" . consult-history)) 198 :hook (completion-list-mode . consult-preview-at-point-mode) 199 :config 200 (setq register-preview-delay 0 201 register-preview-function #'consult-register-format) 202 (advice-add #'register-preview :override #'consult-register-window) 203 (setq xref-show-xrefs-function #'consult-xref 204 xref-show-definitions-function #'consult-xref) 205 (consult-customize 206 consult-theme :preview-key '(:debounce 0.2 any) 207 consult-ripgrep consult-git-grep consult-grep 208 consult-bookmark consult-recent-file consult-xref 209 consult--source-bookmark consult--source-file-register 210 consult--source-recent-file consult--source-project-recent-file 211 :preview-key '(:debounce 0.4 any)) 212 (setq consult-narrow-key "<") 213 (define-key consult-narrow-map (vconcat consult-narrow-key "?") 214 #'consult-narrow-help) 215 :ensure t) 216 217 (use-package consult-lsp :defer t :ensure t) 218 219 (use-package consult-notmuch :defer t :ensure t) 220 221 (use-package corfu 222 :bind (:map corfu-map 223 ("<tab>" . corfu-complete) 224 ("RET" . nil) 225 ;; ("C-<tab>" . corfu-quit) 226 ;; ("<end>" . corfu-quit) 227 ;; ("<escape>" . corfu-quit) 228 ) 229 :custom 230 (corfu-auto t) 231 (corfu-auto-delay 0.1) 232 (corfu-auto-prefix 2) 233 (corfu-cycle t) 234 (corfu-history-mode 1) 235 (corfu-on-exact-match 'show) 236 (corfu-popupinfo-delay '(1.25 . 0.5)) 237 (corfu-quit-no-match t) 238 (corfu-scroll-margin 0) 239 :ensure t 240 :hook (corfu-mode . corfu-popupinfo-mode) 241 :init (global-corfu-mode) 242 (setq tab-always-indent 'complete)) 243 244 (use-package corfu-terminal 245 :init (unless (display-graphic-p) (corfu-terminal-mode +1)) 246 :ensure t) 247 248 (use-package csv-mode :mode "\\.csv\\'" :ensure t) 249 250 (use-package css-mode 251 :config (setq css-indent-offset 2) 252 :mode "\\.css\\'" 253 :ensure nil) 254 255 (use-package delsel :ensure nil :init (delete-selection-mode t)) 256 257 (use-package dired 258 :config (setq dired-listing-switches "-alh" 259 dired-recursive-copies 'always) 260 (put 'dired-find-alternate-file 'disabled nil) 261 :defer t 262 :ensure nil) 263 264 (use-package dired-hide-dotfiles 265 :after dired 266 :bind (:map dired-mode-map ("." . dired-hide-dotfiles-mode)) 267 :ensure t) 268 269 (use-package dired-x 270 :config (setq dired-omit-verbose nil 271 dired-omit-files (concat dired-omit-files "\\|^\\..+$") 272 dired-clean-up-buffers-too t) 273 :defer t 274 :ensure nil) 275 276 (use-package doc-view 277 :config (setq doc-view-resolution 300) 278 :defer t 279 :ensure nil) 280 281 (use-package dockerfile-mode 282 :defer t 283 :ensure t 284 :mode (("Dockerfile\\'" . dockerfile-mode) 285 ("Containerfile\\'" . dockerfile-mode))) 286 287 (use-package doom-modeline 288 :defer t 289 :hook (after-init . doom-modeline-mode) 290 :ensure t) 291 292 (use-package elisp-mode 293 :config (setq-local indent-tabs-mode nil) 294 :hook (emacs-lisp-mode . eldoc-mode) 295 :ensure nil) 296 297 (use-package embark 298 :bind 299 (("C-." . embark-act) 300 ("C-," . embark-dwim) 301 ("C-'" . embark-bindings) 302 :map minibuffer-local-map 303 ("C-<" . embark-collect) 304 ("C->" . embark-export)) 305 :config 306 (setq prefix-help-command #'embark-prefix-help-command) 307 :ensure t) 308 309 (use-package embark-consult 310 :ensure t 311 :hook 312 (embark-collect-mode . consult-preview-at-point-mode)) 313 314 (use-package faces 315 :config (set-face-attribute 316 'default t 317 :family "DejaVu Sans Mono" 318 :foundry "PfEd" 319 :slant 'normal 320 :weight 'normal 321 :height 190 322 :width 'normal) 323 (setq default-frame-alist '((font . "DejaVu Sans Mono-16"))) 324 :custom (face-font-family-alternatives 325 '(("hans" "adobe-source-han-sans-cn-font")))) 326 327 (use-package files 328 :config (setq auto-save-file-name-transforms 329 `((".*" ,temporary-file-directory t)) 330 auto-save-visited-mode t 331 backup-directory-alist `((".*" .,temporary-file-directory)) 332 confirm-kill-emacs 'y-or-n-p) 333 (setq-default require-final-newline t) 334 :ensure nil) 335 336 (use-package flycheck :defer t :ensure t) 337 338 (use-package flyspell 339 :bind (:map flyspell-mode-map ("C-;" . nil)) 340 :ensure nil) 341 342 (use-package frame :config (window-divider-mode -1) :ensure nil) 343 344 (use-package git-commit 345 :config (setq git-commit-summary-max-length 50) 346 :defer t 347 :ensure t) 348 349 (use-package gnutls :config (setq gnutls-verify-error t) :ensure nil) 350 351 (use-package go-mode 352 :bind (:map go-mode-map 353 ("C-c C-b" . pop-tag-mark) 354 ("C-c t" . go-tag-add) 355 ("C-c T" . go-tag-remove)) 356 :defer t 357 :ensure t 358 :hook ((go-mode . lsp) 359 (go-mode . (lambda () (set (make-local-variable 'before-save-hook) 360 '(lsp-organize-imports lsp-format-buffer)))))) 361 362 (use-package go-playground 363 :config (setq go-playground-ask-file-name nil 364 go-playground-basedir "~/.local/share/go/src/playground/" 365 go-playground-go-command "GO111MODULE=auto go" 366 go-playground-init-command "go mod init") 367 :defer t 368 :ensure t) 369 370 (use-package go-tag 371 :config (setq go-tag-args (list "-transform" "camelcase")) 372 :defer t 373 :ensure t) 374 375 (use-package hl-line 376 :config (global-hl-line-mode t) 377 :ensure nil) 378 379 (use-package ispell 380 :config (setq ispell-program-name "/usr/bin/aspell" 381 ispell-dictionary "en_US" 382 ispell-extra-args '("--sug-mode=ultra" "--lang=en_US") 383 ;; ispell-list-command "--list" 384 ispell-dictionary-alist 385 '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "['‘’]" 386 t ("-d" "en_US") nil utf-8))) 387 :defer t 388 :ensure t) 389 390 (use-package jka-cmpr-hook :init (auto-compression-mode t) :ensure nil) 391 392 (use-package js 393 :config (setq js-indent-level 2) 394 :defines js-indent-level 395 :hook ((js-mode . lsp) 396 (js-mode . (lambda () (setq indent-tabs-mode nil)))) 397 :ensure nil) 398 399 (use-package ledger-mode :defer t :ensure t) 400 401 (use-package lsp-mode :defer t :ensure t) 402 403 (use-package magit :bind ("C-x g" . magit-status) :ensure t) 404 405 (use-package marginalia 406 :custom (marginalia-align 'right) 407 :config (marginalia-mode t) 408 :defer t 409 :ensure t) 410 411 (use-package markdown-mode :defer t :ensure t) 412 413 (use-package menu-bar :config (menu-bar-mode -1) :ensure nil) 414 415 (use-package message 416 :config (setq message-directory "drafts" 417 message-kill-buffer-on-exit t 418 message-sendmail-envelope-from 'header 419 message-sendmail-f-is-evil nil) 420 :hook (message-mode . (lambda () (corfu-mode -1))) 421 :defer t 422 :ensure nil) 423 424 (use-package move-text 425 :bind 426 (("<M-up>" . move-text-up) 427 ("<M-down>" . move-text-down)) 428 :defer nil 429 :ensure t) 430 431 (use-package mule 432 :config 433 (prefer-coding-system 'utf-8) 434 (set-default-coding-systems 'utf-8) 435 (set-terminal-coding-system 'utf-8) 436 (set-keyboard-coding-system 'utf-8) 437 :ensure nil) 438 439 (use-package mule-cmds 440 :preface (provide 'mule-cmds) 441 :config 442 (set-language-environment 'UTF-8) 443 :ensure nil) 444 445 (use-package mwheel 446 :custom (mouse-wheel-scroll-amount '(1 ((shift) .1))) 447 :ensure nil) 448 449 (use-package nerd-icons :defer t :ensure t) 450 451 (use-package notmuch 452 :bind (("C-x m" . notmuch) 453 :map notmuch-search-mode-map 454 ("D" . (lambda () "mark message as deleted" (interactive) 455 (notmuch-search-tag (list "-new" "-unread" "-inbox" 456 "+deleted")) 457 (forward-line))) 458 ("S" . (lambda () "mark message as spam" (interactive) 459 (notmuch-search-tag (list "-new" "-unread" "-inbox" "+spam")) 460 (forward-line))) 461 ("N" . (lambda () "unmark message as new and unread" (interactive) 462 (notmuch-search-tag (list "-new" "-unread")) 463 (forward-line))) 464 ("r" . notmuch-search-reply-to-thread) 465 ("R" . notmuch-search-reply-to-thread-sender) 466 :map notmuch-show-mode-map 467 ("D" . (lambda () "mark message as deleted" (interactive) 468 (notmuch-show-tag 469 (list "-new" "-unread" "-inbox" "+deleted")))) 470 ("S" . (lambda () "mark message as spam" (interactive) 471 (notmuch-show-tag (list "-new" "-unread" "-inbox" "+spam")))) 472 ("N" . (lambda () "unmark message as new and unread" (interactive) 473 (notmuch-show-tag (list "-new" "-unread")))) 474 ("r" . notmuch-show-reply) 475 ("R" . notmuch-show-reply-sender)) 476 :config (customize-set-variable 'notmuch-search-oldest-first nil) 477 (setq notmuch-address-command 'internal 478 notmuch-address-internal-completion '(sent nil) 479 notmuch-address-save-filename "~/org/contacts/notmuch-contacts" 480 notmuch-crypto-process-mime t 481 notmuch-fcc-dirs "sent" 482 notmuch-hello-hide-tags '("spam") 483 notmuch-show-all-tags-list t) 484 (setq notmuch-saved-searches 485 '((:name "inbox" :query "tag:inbox" :key "i") 486 (:name "unread" :query "tag:unread" :key "u") 487 (:name "new" :query "tag:new" :key "n") 488 (:name "sent" :query "tag:sent" :key "e") 489 (:name "drafts" :query "tag:draft" :key "d") 490 (:name "all mail" :query "*" :key "a") 491 (:name "todo" :query "tag:todo" :key "t"))) 492 :defer t 493 :functions notmuch-search-tag notmuch-show-tag) 494 495 (use-package novice :disabled t :ensure nil) 496 497 (use-package ol 498 :config (setq org-link-frame-setup 499 '((vm . vm-visit-folder-other-frame) 500 (vm-imap . vm-visit-imap-folder-other-frame) 501 (gnus . org-gnus-no-new-news) 502 (file . find-file) 503 (wl . wl-other-frame))) 504 :defer t 505 :ensure nil) 506 507 (use-package ol-notmuch :defer t :ensure t) 508 509 (use-package orderless 510 :ensure t 511 :custom 512 (orderless-matching-styles 'orderless-regexp) 513 (completion-styles '(orderless basic)) 514 (completion-category-overrides '((file (styles basic partial-completion))))) 515 516 (use-package org 517 :bind (:map org-mode-map 518 ("<M-right>" . nil) 519 ("<M-left>" . nil)) 520 :config (setq org-adapt-indentation nil 521 org-export-backends '(ascii html icalendar latex md odt) 522 org-fold-catch-invisible-edits 'show 523 org-fontify-done-headline t 524 org-default-priority 1 525 org-enforce-todo-dependencies t 526 org-hide-emphasis-markers t 527 org-highest-priority 1 528 org-image-actual-width '(800) 529 org-list-demote-modify-bullet nil 530 org-log-into-drawer t 531 org-lowest-priority 3 532 org-src-fontify-natively t 533 org-startup-with-inline-images t 534 org-tags-column 0 535 org-todo-keywords '((sequence "|" "MAYBE(m)") 536 (sequence "|" "EVENT(v)") 537 (sequence "PROJECT(p)" 538 "|" 539 "COMPLETE(o)") 540 (sequence "NEXT(n)" 541 "IN-PROGRESS(i)" 542 "WAITING(w)" 543 "|" 544 "DELEGATED(e)" 545 "CANCELED(c)" 546 "DONE(d)"))) 547 (org-babel-do-load-languages 548 'org-babel-load-languages 549 '((awk .t ) (calc . t) (C . t) (emacs-lisp . t) (gnuplot . t) (js . t) 550 (makefile .t )(org . t) (python . t) (plantuml . t) 551 (shell . t) (sed .t) (sql . t) (sqlite . t))) 552 :defer t 553 :functions org-redisplay-inline-images 554 :hook ((org-mode . flyspell-mode) 555 (org-mode . (lambda () (electric-indent-local-mode -1))) 556 (org-babel-after-execute . (lambda () 557 (when org-inline-image-overlays 558 (org-redisplay-inline-images))))) 559 :ensure nil) 560 561 (use-package org-agenda 562 :config 563 (setq chimerical-agenda-files '("~/projects/chimerical/chimerical.org") 564 dwrz-agenda-files '("~/org/dwrz.org" 565 "~/projects/career/career.org" 566 "~/projects/chinese/chinese.org" 567 "~/projects/community/community.org" 568 "~/projects/finances/finances.org" 569 "~/projects/health/health.org" 570 "~/projects/home/home.org" 571 "~/projects/net/net.org" 572 "~/projects/rz/rz.org" 573 "~/projects/rz/delivery/delivery.org" 574 "~/projects/rz/elrz/elrz.org" 575 "~/projects/rz/mwb/mwb.org" 576 "~/projects/src/src.org") 577 eti-agenda-files '("~/projects/eti/eti.org")) 578 579 (defun dwrz-switch-org-ctx (ctx) 580 "Switch org agenda context." 581 (cond ((string= ctx "all") (setq org-agenda-files (append 582 chimerical-agenda-files 583 dwrz-agenda-files 584 eti-agenda-files))) 585 ((string= ctx "chimerical") (setq org-agenda-files 586 chimerical-agenda-files)) 587 ((string= ctx "dwrz") (setq org-agenda-files 588 dwrz-agenda-files)) 589 ((string= ctx "eti") (setq org-agenda-files eti-agenda-files)))) 590 591 ;; Set the default context. 592 (dwrz-switch-org-ctx "dwrz") 593 594 (setq org-agenda-follow-indirect nil 595 org-agenda-include-diary t 596 org-agenda-prefix-format '((agenda . " %i %?-12t% s") 597 (timeline . " % s") 598 (todo . " %i") 599 (tags . " %i") 600 (search . " %i")) 601 org-agenda-span 'month 602 org-agenda-tags-column 'auto 603 org-agenda-use-time-grid nil 604 org-agenda-window-setup 'current-window 605 org-archive-location "~/org/archive.org::" 606 org-agenda-show-all-dates nil 607 org-stuck-projects 608 '("+PROJECT" ("NEXT" "IN-PROGRESS" "WAITING") nil nil)) 609 :defer t 610 :defines chimerical-agenda-files dwrz-agenda-files eti-agenda-files 611 :functions dwrz-switch-org-ctx 612 :ensure nil) 613 614 (use-package org-capture 615 :config (setq org-capture-templates 616 '(("e" "log entry" plain 617 (file "") 618 (file "~/org/templates/log-entry.org") 619 :jump-to-captured t) 620 ("l" "log" entry 621 (file "") 622 (file "~/org/templates/log.org") 623 :prepend t 624 :jump-to-captured t 625 :empty-lines-after 1) 626 ("n" "note" entry 627 (file "") 628 (file "~/org/templates/note.org") 629 :prepend t 630 :jump-to-captured t 631 :empty-lines-before 1 632 :empty-lines-after 1))) 633 :defer t 634 :ensure nil) 635 636 (use-package org-faces 637 :config (setq org-priority-faces 638 '((?1 . (:foreground "#c82829")) 639 (?2 . (:foreground "#eab700")) 640 (?3 . (:foreground "#718c00")))) 641 (setq org-todo-keyword-faces 642 '(("NEXT" . (:foreground "#c82829" :weight bold)) 643 ("IN-PROGRESS" . (:foreground "#718c00" :weight bold)) 644 ("WAITING" . (:foreground "#eab700" :weight bold)) 645 ("DONE" . (:foreground "#4271ae" :weight bold)) 646 ("EVENT" . (:foreground "#3e999f" :weight bold)) 647 ("DELEGATED" . (:foreground "#969896" :weight bold)) 648 ("CANCELED" . (:foreground "#a3685a" :weight bold)) 649 ("MAYBE" . (:foreground "#8959a8" :weight bold)) 650 ("PROJECT" . (:background "#c82829" 651 :foreground "#ffffff" 652 :weight bold)) 653 ("COMPLETE" . (:background "#718c00" 654 :foreground "#ffffff" 655 :weight bold )))) 656 :defer t 657 :ensure nil) 658 659 (use-package org-src 660 :config (setq org-src-preserve-indentation t 661 org-src-tab-acts-natively t) 662 :defer t 663 :ensure nil) 664 665 (use-package osm :defer t :ensure t) 666 667 (use-package paragraphs 668 :config (setq sentence-end-double-space nil) 669 :ensure nil 670 :preface (provide 'paragraphs)) 671 672 (use-package paren :config (show-paren-mode t) :ensure nil) 673 674 (use-package password-store :defer t :ensure t) 675 676 (use-package pdf-tools :ensure t) 677 678 (use-package plantuml-mode 679 :config (setq org-plantuml-jar-path (expand-file-name 680 "/usr/share/java/plantuml/plantuml.jar")) 681 :defer t 682 :defines org-plantuml-jar-path 683 :ensure t) 684 685 (use-package prog-mode 686 :hook ((prog-mode . flycheck-mode) 687 (prog-mode . flyspell-prog-mode) 688 (prog-mode . visual-line-mode) 689 (prog-mode . (lambda () (dwrz-highlight-keywords)))) 690 :ensure nil) 691 692 (use-package project 693 :config (add-to-list 'project-switch-commands 694 '(project-shell "Shell" "s") t) 695 :ensure nil) 696 697 (use-package rainbow-mode 698 :defer t 699 :hook ((conf-mode . rainbow-mode) 700 (prog-mode . rainbow-mode) 701 (text-mode . rainbow-mode)) 702 :ensure t) 703 704 (use-package recentf 705 :config (recentf-mode t) 706 :init (setq recentf-max-menu-items 100 707 recentf-max-saved-items 100) 708 :ensure nil) 709 710 (use-package register 711 :config (set-register ?c '(file . "~/.config/")) 712 (set-register ?d '(file . "~/org/diary.org")) 713 (set-register ?e '(file . "~/projects/eti/")) 714 (set-register ?f '(file . "~/projects/finances/")) 715 (set-register ?g '(file . "~/org/gtd.org")) 716 (set-register ?h '(file . "~/projects/home/")) 717 (set-register ?i '(file . "~/.config/emacs/init.el")) 718 (set-register ?j '(file . "~/journal/2024/2024.org")) 719 (set-register ?n '(file . "~/projects/net/")) 720 (set-register ?o '(file . "~/org/")) 721 (set-register ?p '(file . "~/projects/"))) 722 723 (use-package repeat :config (repeat-mode) :ensure nil) 724 725 (use-package scroll-bar :config (scroll-bar-mode -1) :ensure nil) 726 727 (use-package select 728 :config (setq select-enable-primary t 729 select-enable-clipboard t) 730 :ensure nil) 731 732 (use-package savehist 733 :init (savehist-mode t) 734 :ensure nil) 735 736 (use-package sendmail 737 :after corfu 738 :config (setq mail-specify-envelope-from t 739 mail-envelope-from 'header 740 mail-specify-envelope-from t 741 send-mail-function 'sendmail-send-it) 742 (add-to-list 'savehist-additional-variables 'corfu-history) 743 :defer t 744 :ensure nil) 745 746 (use-package sh-script :config (setq sh-basic-offset 2) :defer t :ensure nil) 747 748 (use-package simple 749 :config (setq async-shell-command-buffer "new-buffer" 750 backward-delete-char-untabify-method nil 751 mail-user-agent 'message-user-agent 752 shift-select-mode nil) 753 (setq-default indent-tabs-mode t) 754 (column-number-mode t) 755 (size-indication-mode t) 756 :ensure nil) 757 758 (use-package sql 759 :config (setq sql-linter-program "pg_format") 760 :hook (sql-mode . sqlind-minor-mode) 761 :ensure nil) 762 763 (use-package sql-indent :config (setq sqlind-basic-offset 4) :defer t :ensure t) 764 765 (use-package subword :init (global-subword-mode t) :ensure nil) 766 767 (use-package subr 768 :hook (before-save . delete-trailing-whitespace) 769 :ensure nil) 770 771 (use-package subr-x :init (defalias 'yes-or-no-p 'y-or-n-p) :ensure nil) 772 773 (use-package text-mode 774 :hook ((text-mode . flyspell-mode) 775 (text-mode . visual-line-mode)) 776 :ensure nil) 777 778 (use-package textsize 779 :config (setq textsize-default-points 20) 780 :ensure t 781 :init (textsize-mode)) 782 783 (use-package time 784 :config 785 (setq world-clock-list '(("America/Los_Angeles" "Los Angeles") 786 ("America/New_York" "New York") 787 ("UTC" "UTC") 788 ("Europe/Rome" "Napoli") 789 ("Asia/Shanghai" "Shanghai") 790 ("Australia/Sydney" "Sydney")) 791 world-clock-time-format "%Y-%m-%d %u/7 %H:%M %Z") 792 :init (setq display-time-mode nil) 793 :ensure nil) 794 795 (use-package toc-org :defer t :ensure t) 796 797 (use-package tool-bar :config (tool-bar-mode -1) :ensure nil) 798 799 (use-package vertico 800 :config 801 (setq vertico-cycle t 802 vertico-resize t) 803 :init (vertico-mode) 804 :ensure t) 805 806 (use-package vundo 807 :config 808 (setq vundo-glyph-alist vundo-unicode-symbols 809 vundo-compact-display t) 810 :defer t 811 :ensure t) 812 813 (use-package visual-fill-column 814 :config (setq split-window-preferred-function 815 'visual-fill-column-split-window-sensibly) 816 :ensure t 817 :hook (visual-line-mode . visual-fill-column-mode)) 818 819 (use-package vterm 820 :bind (:map vterm-mode-map 821 ("C-q" . vterm-send-next-key) 822 ("C-y" . vterm-yank)) 823 :config 824 (setq vterm-max-scrollback 32767) 825 (defun project-vterm () 826 (interactive) 827 (defvar vterm-buffer-name) 828 (let* ((default-directory (project-root (project-current t))) 829 (vterm-buffer-name (project-prefixed-buffer-name "vterm")) 830 (vterm-buffer (get-buffer vterm-buffer-name))) 831 (if (and vterm-buffer (not current-prefix-arg)) 832 (pop-to-buffer vterm-buffer 833 (bound-and-true-p display-comint-buffer-action)) 834 (vterm)))) 835 (add-to-list 'project-switch-commands '(project-vterm "Terminal" "t") t) 836 :defer t 837 :ensure t) 838 839 (use-package web-mode 840 :config (setq web-mode-code-indent-offset 2 841 web-mode-css-indent-offset 2 842 web-mode-engines-alist 843 '(("go" . "\\.gohtml\\'")) 844 web-mode-indent-style 2 845 web-mode-markup-indent-offset 2) 846 :mode (("\\.html?\\'" . web-mode) 847 ("\\.gohtml\\'" . web-mode)) 848 :ensure t) 849 850 (use-package wgrep :defer t :ensure t) 851 852 (use-package which-key 853 :init (setq which-key-idle-delay 0.25) 854 :config (which-key-mode) 855 :ensure t) 856 857 (use-package window 858 :config (setq split-height-threshold nil 859 split-width-threshold 160) 860 :ensure nil) 861 862 (use-package xref :defer t :ensure nil) 863 864 (use-package yaml-mode :ensure t) 865 866 (use-package yasnippet :config (yas-global-mode 1) :ensure t) 867 868 (use-package yasnippet-capf 869 :after cape 870 :config 871 (add-to-list 'completion-at-point-functions #'yasnippet-capf) 872 :ensure t) 873 874 ;; Keymaps 875 (defvar-keymap dwrz-buffer-map 876 :doc "Prefix keymap for buffers." 877 :name "Buffer" 878 "R" #'revert-buffer 879 "b" #'consult-buffer 880 "i" #'ibuffer 881 "n" #'next-buffer 882 "p" #'previous-buffer 883 "r" #'rename-buffer) 884 885 (defvar-keymap dwrz-cape-map 886 :doc "Prefix keymap for cape." 887 :name "Cape" 888 "&" #'cape-sgml 889 ":" #'cape-emoji 890 "a" #'cape-abbrev 891 "d" #'cape-dabbrev 892 "e" #'cape-elisp-block 893 "f" #'cape-file 894 "h" #'cape-history 895 "k" #'cape-keyword 896 "l" #'cape-line 897 "r" #'cape-rfc1345 898 "s" #'cape-elisp-symbol 899 "w" #'cape-dict) 900 901 (defvar-keymap dwrz-file-map 902 :doc "Prefix keymaps for files." 903 :name "File" 904 "f" #'find-file 905 "F" #'find-file-other-window 906 "d" #'dired) 907 908 (defvar-keymap dwrz-highlight-map 909 :doc "Prefix keymap for highlight." 910 :name "Highlight" 911 "l" #'highlight-lines-matching-regexp 912 "p" #'highlight-phrase 913 "r" #'highlight-regexp 914 "s" #'highlight-symbol-at-point 915 "u" #'unhighlight-regexp) 916 917 (defvar-keymap dwrz-macro-map 918 :doc "Prefix keymap for macros." 919 :name "Macro" 920 "c" #'kmacro-set-counter 921 "s" #'kmacro-start-macro-or-insert-counter 922 "t" #'kmacro-end-or-call-macro) 923 924 (defvar-keymap dwrz-movement-map 925 :doc "Prefix keymap for movement." 926 :name "Move" 927 "a" #'avy-goto-char 928 "l" #'avy-goto-line 929 "<up>" #'windmove-swap-states-up 930 "<down>" #'windmove-swap-states-down 931 "<left>" #'windmove-swap-states-left 932 "<right>" #'windmove-swap-states-right) 933 934 (defvar-keymap dwrz-org-ctx-map 935 :doc "Prefix keymap for org-mode context." 936 :name "Org Context" 937 "a" (cons "all" 938 #'(lambda () (interactive) (dwrz-switch-org-ctx "all"))) 939 "c" (cons "chimerical" 940 #'(lambda () (interactive) (dwrz-switch-org-ctx "chimerical"))) 941 "d" (cons "dwrz" #'(lambda () (interactive) (dwrz-switch-org-ctx "dwrz"))) 942 "e" (cons "eti" #'(lambda () (interactive) (dwrz-switch-org-ctx "eti")))) 943 944 (defvar-keymap dwrz-org-map 945 :doc "Prefix keymap for org-mode." 946 :name "Org" 947 "L" #'org-insert-link 948 "a" #'org-agenda 949 "b" #'org-toggle-archive-tag 950 "B" #'org-archive-subtree-default 951 "c" #'dwrz-org-capture-at-point 952 "i" #'org-insert-structure-template 953 "l" #'org-store-link 954 "n" #'org-add-note 955 "o" #'org-open-at-point 956 "t" #'org-todo 957 "x" dwrz-org-ctx-map) 958 959 (defvar-keymap dwrz-password-map 960 :doc "Prefix keymap for password-store." 961 :name "Password" 962 "c" (cons "copy" #'password-store-copy) 963 "e" (cons "edit" #'password-store-edit) 964 "g" (cons "generate" #'password-store-generate) 965 "i" (cons "insert" #'password-store-insert) 966 "n" (cons "rename" #'password-store-rename) 967 "r" (cons "remove" #'password-store-remove)) 968 969 (defvar-keymap dwrz-insert-map 970 :doc "Prefix keymap for insertion and point." 971 :name "Insert" 972 "d" (cons "date" #'dwrz-insert-date) 973 "e" #'emoji-search 974 "h" #'hippie-expand 975 "l" #'emoji-list 976 "q" #'quoted-insert 977 "t" (cons "timestamp" #'dwrz-insert-timestamp)) 978 979 (defvar-keymap dwrz-region-map 980 :doc "Prefix keymap for region." 981 :name "Region" 982 "U" #'dwrz-unfill-region-or-paragraph 983 "c" #'rot13-region 984 "d" #'downcase-region 985 "f" #'fill-region 986 "o" #'comment-or-uncomment-region 987 "r" #'reverse-region 988 "s" #'sort-lines 989 "u" #'upcase-region) 990 991 (defvar-keymap dwrz-search-map 992 :doc "Prefix keymap for search." 993 :name "Search" 994 "a" (cons "address" 995 #'(lambda () (interactive) (consult-notmuch-address t nil))) 996 "c" #'consult-mark 997 "f" #'consult-find 998 "g" #'consult-grep 999 "i" #'consult-imenu-multi 1000 "k" #'consult-global-mark 1001 "m" #'consult-line-multi 1002 "n" #'consult-notmuch 1003 "o" #'consult-org-heading 1004 "r" #'consult-ripgrep 1005 "t" #'consult-outline 1006 "v" #'consult-git-grep) 1007 1008 (defvar-keymap dwrz-spell-map 1009 "b" #'ispell-buffer 1010 "r" #'ispell-region 1011 "w" #'ispell-word) 1012 1013 (defvar-keymap dwrz-terminal-map 1014 :doc "Prefix keymap for terminal." 1015 :name "Terminal" 1016 "c" #'vterm-copy-mode 1017 "s" #'dwrz-shell-in-current-directory 1018 "t" #'term 1019 "v" #'dwrz-vterm-in-current-directory) 1020 1021 (defvar-keymap dwrz-time-map 1022 :doc "Prefix keymap for date and time." 1023 :name "Time" 1024 "c" #'calendar 1025 "w" #'world-clock) 1026 1027 (defvar-keymap dwrz-transpose-map 1028 :doc "Prefix keymap for transposition." 1029 :name "Transpose" 1030 "c" #'transpose-chars 1031 "l" #'transpose-lines 1032 "p" #'transpose-paragraphs 1033 "s" #'transpose-sentences 1034 "w" #'transpose-words 1035 "x" #'transpose-sexps) 1036 1037 (defvar-keymap dwrz-windows-map 1038 :doc "Prefix keymap for windows." 1039 :name "Window" 1040 "0" #'delete-window 1041 "1" #'delete-other-windows 1042 "2" #'split-window-below 1043 "3" #'split-window-right 1044 "9" #'dwrz-split-window-two-thirds 1045 "<down>" #'windmove-swap-states-down 1046 "<left>" #'windmove-swap-states-left 1047 "<right>" #'windmove-swap-states-right 1048 "<up>" #'windmove-swap-states-up 1049 "B" #'balance-windows-area 1050 "E" #'enlarge-window-horizontally 1051 "S" #'shrink-window-horizontally 1052 "b" #'balance-windows 1053 "e" #'enlarge-window 1054 "o" #'other-window 1055 "s" #'shrink-window 1056 "t" #'tear-off-window) 1057 1058 (defvar-keymap dwrz-zoom-map 1059 :doc "Prefix keymap for text scale." 1060 :name "Zoom" 1061 :repeat t 1062 "+" #'text-scale-increase 1063 "-" #'text-scale-decrease 1064 "=" (cons "reset" #'(lambda () (interactive) (text-scale-increase 0)))) 1065 1066 (defvar-keymap dwrz-prefix-map 1067 :doc "Prefix keymap with multiple subkeymaps." 1068 :name "dwrz prefix" 1069 "<" #'undo 1070 ">" #'undo-redo 1071 "#" #'display-line-numbers-mode 1072 "-" #'negative-argument 1073 ";" (cons "terminal" dwrz-terminal-map) 1074 "<down>" #'windmove-down 1075 "<left>" #'windmove-left 1076 "<right>" #'windmove-right 1077 "<up>" #'windmove-up 1078 "?" (cons "help" help-map) 1079 "@" (cons "time" dwrz-time-map) 1080 "E" #'hippie-expand 1081 "H" (cons "highlight" dwrz-highlight-map) 1082 "P" (cons "project" project-prefix-map) 1083 "Q" #'save-buffers-kill-emacs 1084 "S" (cons "spell" dwrz-spell-map) 1085 "a" #'avy-goto-char 1086 "b" (cons "buffer" dwrz-buffer-map) 1087 "c" (cons "cape" dwrz-cape-map) 1088 "e" (cons "exec" #'execute-extended-command) 1089 "f" (cons "file" dwrz-file-map) 1090 "h" #'hippie-expand 1091 "i" (cons "insert" dwrz-insert-map) 1092 "j" (cons "jump" #'jump-to-register) 1093 "m" (cons "move" dwrz-movement-map) 1094 "M" (cons "macro" dwrz-macro-map) 1095 "n" (cons "narrow" narrow-map) 1096 "o" (cons "org" dwrz-org-map) 1097 "p" (cons "password" dwrz-password-map) 1098 "r" (cons "region" dwrz-region-map) 1099 "s" (cons "search" dwrz-search-map) 1100 "t" (cons "transpose" dwrz-transpose-map) 1101 "u" #'universal-argument 1102 "v" #'vundo 1103 "w" (cons "window" dwrz-windows-map) 1104 "z" (cons "zoom" dwrz-zoom-map)) 1105 1106 ;; KEYBINDINGS 1107 (global-set-key (kbd "C-z") dwrz-prefix-map) 1108 (global-set-key (kbd "C-;") dwrz-prefix-map)