config

Personal configuration.
git clone git://code.dwrz.net/config
Log | Files | Refs

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)