2021-03-12 23:39:42 +00:00
|
|
|
|
;;; init.el -*- lexical-binding: t; coding: utf-8-unix -*-
|
2021-02-26 17:31:50 +00:00
|
|
|
|
;; Author: Case Duckworth <acdw@acdw.net>
|
2021-03-01 05:58:57 +00:00
|
|
|
|
;; Created: Sometime during Covid-19, 2020
|
2021-02-26 17:31:50 +00:00
|
|
|
|
;; Keywords: configuration
|
2021-03-08 04:14:38 +00:00
|
|
|
|
;; URL: https://tildegit.org/acdw/emacs
|
2021-03-29 22:52:23 +00:00
|
|
|
|
;; Bankruptcy: 6
|
2021-03-16 16:16:21 +00:00
|
|
|
|
|
2021-03-01 05:58:57 +00:00
|
|
|
|
;; This file is NOT part of GNU Emacs.
|
2021-03-16 16:16:21 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;- License:
|
2021-03-01 05:58:57 +00:00
|
|
|
|
;; Everyone is permitted to do whatever with this software, without
|
|
|
|
|
;; limitation. This software comes without any warranty whatsoever,
|
|
|
|
|
;; but with two pieces of advice:
|
|
|
|
|
;; - Don't hurt yourself.
|
|
|
|
|
;; - Make good choices.
|
2021-03-16 16:16:21 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;- Code:
|
2021-02-26 17:31:50 +00:00
|
|
|
|
|
2021-03-29 22:52:23 +00:00
|
|
|
|
;;; `setup' -- configuration macro
|
|
|
|
|
(straight-use-package '(setup :host nil
|
2021-03-30 04:21:58 +00:00
|
|
|
|
:repo "https://git.sr.ht/~zge/setup"))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(require 'setup)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; shorthand for `customize-set-variable' (via setup)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(defmacro setc (&rest args)
|
|
|
|
|
"Customize user options using ARGS like `setq'."
|
|
|
|
|
(declare (debug setq))
|
|
|
|
|
`(setup (:option ,@args)))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Install packages with `straight-use-package'
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup-define :straight
|
|
|
|
|
(lambda (recipe)
|
|
|
|
|
`(straight-use-package ',recipe))
|
|
|
|
|
:documentation "Install RECIPE with `straight-use-package'."
|
|
|
|
|
:repeatable t
|
|
|
|
|
:shorthand (lambda (sexp)
|
|
|
|
|
(let ((recipe (cadr sexp)))
|
|
|
|
|
(if (consp recipe)
|
|
|
|
|
(car recipe)
|
|
|
|
|
recipe))))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Set options using `setq-default', instead of `customize-set-variable'
|
2021-03-30 17:31:26 +00:00
|
|
|
|
;; From what I can tell, `customize-set-variable' loads "all the dependencies
|
|
|
|
|
;; for each SYMBOL it sets (see `custom-load-symbol'). Since I don't want to do
|
|
|
|
|
;; that all the time, here's `:set'. DON'T USE THIS HARDLY EVER. Honestly, I
|
|
|
|
|
;; might want to do a `:option-after' instead (with `:after-loaded' set to t)...
|
|
|
|
|
(setup-define :setq-default
|
|
|
|
|
(lambda (variable value)
|
|
|
|
|
`(setq-default ,variable ,value))
|
|
|
|
|
:documentation "Set options with `setq-default'. USE SPARINGLY!"
|
|
|
|
|
:debug '(sexp form)
|
|
|
|
|
:repeatable t)
|
|
|
|
|
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Bind keys to `acdw/leader'
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup-define :acdw/leader
|
|
|
|
|
(lambda (key command)
|
2021-03-30 16:58:05 +00:00
|
|
|
|
`(progn
|
|
|
|
|
(autoload #',command (symbol-name setup-name))
|
|
|
|
|
(define-key acdw/leader
|
|
|
|
|
,(if (stringp key) (kbd key) key)
|
|
|
|
|
#',command)))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
:documentation "Bind KEY to COMMAND in `acdw/leader' map."
|
|
|
|
|
:debug '(form sexp)
|
|
|
|
|
:repeatable t)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Bind keys, and autoload the functions they're bound to.
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup-define :bind-autoload
|
|
|
|
|
(lambda (key command)
|
|
|
|
|
`(progn
|
|
|
|
|
(autoload #',command (symbol-name setup-name))
|
|
|
|
|
(define-key (symbol-value setup-map)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
,(if (stringp key) (kbd key) key)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
#',command)))
|
|
|
|
|
:documentation "Bind KEY to COMMAND, and autload COMMAND from FEATURE."
|
|
|
|
|
:debug '(form sexp)
|
|
|
|
|
:repeatable t)
|
|
|
|
|
|
2021-04-03 14:46:48 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;; Good defaults
|
|
|
|
|
|
|
|
|
|
;;;; About me
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc user-full-name "Case Duckworth"
|
|
|
|
|
user-mail-address "acdw@acdw.net"
|
|
|
|
|
calendar-location-name "Baton Rouge, LA"
|
|
|
|
|
calendar-latitude 30.4
|
|
|
|
|
calendar-longitude -91.1)
|
2021-03-09 04:40:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Lines
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc fill-column 80
|
|
|
|
|
word-wrap t
|
|
|
|
|
truncate-lines nil)
|
2021-03-08 22:58:18 +00:00
|
|
|
|
(add-hook 'text-mode-hook #'turn-on-auto-fill)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(global-display-fill-column-indicator-mode +1)
|
2021-03-08 22:58:18 +00:00
|
|
|
|
(global-so-long-mode +1)
|
2021-03-11 18:08:23 +00:00
|
|
|
|
|
2021-04-02 18:07:24 +00:00
|
|
|
|
;; Only fill comments in prog-mode.
|
2021-04-03 14:44:41 +00:00
|
|
|
|
(add-hook 'prog-mode-hook
|
|
|
|
|
(defun hook--auto-fill-prog-mode ()
|
|
|
|
|
(setq-local comment-auto-fill-only-comments t)
|
|
|
|
|
(turn-on-auto-fill)))
|
2021-04-02 18:07:24 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Whitespace
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc whitespace-style
|
|
|
|
|
'(empty indentation space-before-tab space-after-tab)
|
|
|
|
|
indent-tabs-mode nil
|
|
|
|
|
tab-width 4
|
|
|
|
|
smie-indent-basic tab-width)
|
2021-03-12 23:29:26 +00:00
|
|
|
|
(add-hook 'before-save-hook #'whitespace-cleanup)
|
2021-03-08 22:58:18 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Pairs
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc show-paren-delay 0
|
|
|
|
|
show-paren-style 'mixed
|
|
|
|
|
show-paren-when-point-inside-paren t
|
|
|
|
|
show-paren-when-point-in-periphery t)
|
|
|
|
|
(add-hook 'prog-mode-hook #'electric-pair-local-mode)
|
2021-03-08 22:58:18 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Killing and yanking
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc save-interprogram-paste-before-kill t
|
|
|
|
|
yank-pop-change-selection t
|
|
|
|
|
x-select-enable-clipboard t
|
|
|
|
|
x-select-enable-primary t
|
|
|
|
|
mouse-drag-copy-region t
|
|
|
|
|
kill-do-not-save-duplicates t)
|
2021-03-08 22:58:18 +00:00
|
|
|
|
(delete-selection-mode +1)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Encoding
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc local-coding-system 'utf-8-unix
|
|
|
|
|
coding-system-for-read 'utf-8-unix
|
|
|
|
|
coding-system-for-write 'utf-8-unix
|
|
|
|
|
buffer-file-coding-system 'utf-8-unix
|
|
|
|
|
org-export-coding-system 'utf-8-unix
|
|
|
|
|
org-html-coding-system 'utf-8-unix
|
|
|
|
|
default-process-coding-system '(utf-8-unix . utf-8-unix)
|
|
|
|
|
x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
|
2021-03-08 22:58:18 +00:00
|
|
|
|
(set-charset-priority 'unicode)
|
|
|
|
|
(set-language-environment "UTF-8")
|
|
|
|
|
(prefer-coding-system 'utf-8-unix)
|
|
|
|
|
(set-default-coding-systems 'utf-8-unix)
|
|
|
|
|
(set-terminal-coding-system 'utf-8-unix)
|
|
|
|
|
(set-keyboard-coding-system 'utf-8-unix)
|
|
|
|
|
(set-selection-coding-system 'utf-8-unix)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Uniquify
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:require uniquify)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option uniquify-buffer-name-style 'forward
|
|
|
|
|
uniquify-separator path-separator
|
|
|
|
|
uniquify-after-kill-buffer-p t
|
|
|
|
|
uniquify-ignore-buffers-re "^\\*"))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Files
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc backup-directory-alist `((".*" . ,(acdw/in-dir "backup/" t)))
|
|
|
|
|
tramp-backup-directory-alist backup-directory-alist
|
|
|
|
|
auto-save-file-name-transforms `((".*" ,(acdw/in-dir "auto-save/" t) t))
|
|
|
|
|
auto-save-list-file-prefix (acdw/in-dir "auto-save-list/.saves-" t)
|
|
|
|
|
backup-by-copying t
|
|
|
|
|
delete-old-versions t
|
|
|
|
|
version-control t
|
|
|
|
|
vc-make-backup-files t)
|
2021-03-11 14:24:54 +00:00
|
|
|
|
|
2021-04-02 18:28:30 +00:00
|
|
|
|
(add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Auto-save files
|
|
|
|
|
(auto-save-visited-mode +1)
|
|
|
|
|
;; And /actually/ save all buffers when unfocused
|
2021-03-11 14:24:54 +00:00
|
|
|
|
(add-function :after after-focus-change-function
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(defun hook--auto-save-when-unfocused ()
|
|
|
|
|
"Save all buffers when out of focus."
|
|
|
|
|
(acdw/when-unfocused #'save-some-buffers t)))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Autorevert files
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:require autorevert)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(global-auto-revert-mode +1))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Save place in files
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:require saveplace)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option save-place-file (acdw/in-dir "places.el")
|
|
|
|
|
save-place-forget-unreadable-files (eq acdw/system :home))
|
2021-03-09 04:40:23 +00:00
|
|
|
|
(save-place-mode +1))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Keep track of recent files
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:require recentf)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option recentf-save-file (acdw/in-dir "recentf.el")
|
|
|
|
|
recentf-max-menu-items 100
|
|
|
|
|
recentf-max-saved-items nil
|
|
|
|
|
recentf-auto-cleanup 60
|
|
|
|
|
(append recentf-exclude) acdw/dir)
|
2021-03-11 18:09:16 +00:00
|
|
|
|
(recentf-mode +1))
|
2021-03-09 04:40:23 +00:00
|
|
|
|
|
2021-04-02 19:42:15 +00:00
|
|
|
|
;;;; Windows
|
|
|
|
|
(winner-mode +1)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Minibuffer
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc minibuffer-prompt-properties
|
2021-03-30 04:21:58 +00:00
|
|
|
|
'(read-only t cursor-intangible t face minibuffer-prompt)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
enable-recursive-minibuffers t
|
|
|
|
|
file-name-shadow-properties '(invisible t intangible t)
|
|
|
|
|
read-answer-short t)
|
|
|
|
|
(minibuffer-depth-indicate-mode +1)
|
|
|
|
|
(file-name-shadow-mode +1)
|
|
|
|
|
(fset 'yes-or-no-p #'y-or-n-p)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Save minibuffer command history (and others)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:require savehist)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option (append savehist-additional-variables) 'kill-ring
|
|
|
|
|
(append savehist-additional-variables) 'search-ring
|
|
|
|
|
(append savehist-additional-variables) 'regexp-search-ring
|
|
|
|
|
history-length t
|
|
|
|
|
history-delete-duplicates t
|
|
|
|
|
savehist-autosave-interval 6
|
|
|
|
|
savehist-file (acdw/in-dir "savehist.el"))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(savehist-mode +1))
|
2021-03-08 22:58:18 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Completion framework
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:require icomplete)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option completion-ignore-case t
|
|
|
|
|
read-buffer-completion-ignore-case t
|
|
|
|
|
icomplete-delay-completions-threshold 0
|
|
|
|
|
icomplete-max-delay-chars 0
|
|
|
|
|
icomplete-compute-delay 0
|
|
|
|
|
icomplete-show-matches-on-no-input t
|
|
|
|
|
icomplete-with-buffer-completion-tables t
|
|
|
|
|
icomplete-in-buffer t
|
|
|
|
|
completion-styles '(partial-completion substring flex))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(fido-mode -1)
|
|
|
|
|
(icomplete-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; `imenu'
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup imenu
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option imenu-auto-rescan t))
|
2021-03-08 22:58:18 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Cursor
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc cursor-type 'bar
|
|
|
|
|
cursor-in-non-selected-windows 'hollow)
|
2021-03-08 22:58:18 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Scrolling
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc auto-window-vscroll nil
|
|
|
|
|
fast-but-imprecise-scrolling t
|
|
|
|
|
scroll-margin 0
|
|
|
|
|
scroll-conservatively 101
|
|
|
|
|
scroll-preserve-screen-position 1)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Fonts
|
2021-03-30 22:23:36 +00:00
|
|
|
|
;; Load them /after/ the first frame comes into focus
|
|
|
|
|
(add-function :after after-focus-change-function
|
|
|
|
|
(defun hook--setup-fonts ()
|
|
|
|
|
(dolist (face '(default fixed-pitch))
|
|
|
|
|
;; `default' and `fixed-pitch' should be the same.
|
|
|
|
|
(set-face-attribute face nil
|
|
|
|
|
:font (pcase acdw/system
|
|
|
|
|
(:home "DejaVu Sans Mono-10")
|
|
|
|
|
(:work "Consolas-10")
|
|
|
|
|
(:other "monospace-10"))))
|
|
|
|
|
;; `variable-pitch' is, of course, different.
|
|
|
|
|
(set-face-attribute 'variable-pitch nil
|
|
|
|
|
:font (pcase acdw/system
|
|
|
|
|
(:home "DejaVu Sans")
|
|
|
|
|
(:work "Calibri-11")
|
|
|
|
|
(:other "sans-serif")))
|
|
|
|
|
(remove-function after-focus-change-function
|
|
|
|
|
'hook--setup-fonts)))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Debugger
|
2021-03-31 22:59:49 +00:00
|
|
|
|
(setup debugger
|
|
|
|
|
(:hook visual-line-mode)
|
|
|
|
|
(:acdw/leader "d" toggle-debug-on-error))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Garbage collection
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(add-hook 'minibuffer-setup-hook #'acdw/gc-disable)
|
|
|
|
|
(add-hook 'minibuffer-exit-hook #'acdw/gc-enable)
|
|
|
|
|
(add-function :after after-focus-change-function
|
|
|
|
|
(defun hook--gc-when-unfocused ()
|
|
|
|
|
(acdw/when-unfocused #'garbage-collect)))
|
|
|
|
|
|
2021-04-01 21:35:26 +00:00
|
|
|
|
;;;; Spelling
|
|
|
|
|
(setup flyspell
|
|
|
|
|
(setenv "LANG" "en_US")
|
|
|
|
|
(:option ispell-program-name "hunspell"
|
|
|
|
|
ispell-dictionary "en_US"
|
|
|
|
|
ispell-personal-dictionary "~/.hunspell_personal")
|
|
|
|
|
(ispell-set-spellchecker-params)
|
|
|
|
|
(unless (file-exists-p ispell-personal-dictionary)
|
|
|
|
|
(write-region "" nil ispell-personal-dictionary nil 0))
|
|
|
|
|
|
2021-04-02 19:42:35 +00:00
|
|
|
|
(:needs ispell-program-name)
|
2021-04-01 21:35:26 +00:00
|
|
|
|
;; add hooks
|
2021-04-01 21:59:15 +00:00
|
|
|
|
(add-hook 'text-mode-hook #'flyspell-mode)
|
|
|
|
|
(add-hook 'prog-mode-hook #'flyspell-prog-mode))
|
2021-04-01 21:35:26 +00:00
|
|
|
|
|
2021-04-01 22:55:18 +00:00
|
|
|
|
;;;; MS Windows
|
|
|
|
|
(when (eq acdw/system :work)
|
|
|
|
|
(setc w32-allow-system-shell t
|
|
|
|
|
w32-pass-lwindow-to-system nil
|
|
|
|
|
w32-lwindow-modifier 'super
|
|
|
|
|
w32-pass-rwindow-to-system nil
|
|
|
|
|
w32-rwindow-modifier 'super
|
|
|
|
|
w32-pass-apps-to-system nil
|
2021-04-02 17:56:52 +00:00
|
|
|
|
w32-apps-modifier 'hyper))
|
2021-04-01 22:55:18 +00:00
|
|
|
|
|
2021-04-02 18:07:24 +00:00
|
|
|
|
;;;; Set up non-special modes
|
|
|
|
|
;; Great idea from brause.cc
|
|
|
|
|
(defun-with-hooks '(text-mode-hook prog-mode-hook diff-mode-hook)
|
|
|
|
|
(defun hook--setup-regular-modes ()
|
|
|
|
|
(setq indicate-empty-lines t
|
|
|
|
|
indicate-buffer-boundaries '((top . right) (bottom . right)))
|
|
|
|
|
(goto-address-mode +1)
|
|
|
|
|
(show-paren-mode +1)))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Etc. good defaults
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setc custom-file (acdw/in-dir "custom.el")
|
|
|
|
|
inhibit-startup-screen t
|
|
|
|
|
initial-buffer-choice t
|
|
|
|
|
initial-scratch-message (concat ";; Howdy, " (nth 0 (split-string
|
|
|
|
|
user-full-name))
|
|
|
|
|
"! Welcome to GNU Emacs.\n\n")
|
|
|
|
|
default-directory (expand-file-name "~/")
|
|
|
|
|
disabled-command-function nil
|
|
|
|
|
load-prefer-newer t
|
|
|
|
|
comp-async-report-warnings-errors nil
|
2021-04-01 04:08:22 +00:00
|
|
|
|
frame-title-format '("%b %+%* GNU Emacs"
|
|
|
|
|
(:eval (when (frame-parameter nil 'client)
|
|
|
|
|
" Client")))
|
|
|
|
|
tab-bar-show 1
|
2021-03-30 04:21:58 +00:00
|
|
|
|
use-dialog-box nil
|
2021-04-01 22:55:18 +00:00
|
|
|
|
use-file-dialog nil
|
|
|
|
|
echo-keystrokes 0.25
|
|
|
|
|
recenter-positions '(top middle bottom)
|
|
|
|
|
attempt-stack-overflow-recovery nil
|
2021-04-02 17:56:52 +00:00
|
|
|
|
attempt-orderly-shutdown-on-fatal-signal nil
|
2021-04-02 19:42:15 +00:00
|
|
|
|
window-resize-pixelwise t
|
2021-04-03 14:46:13 +00:00
|
|
|
|
find-function-C-source-directory
|
2021-04-02 17:56:52 +00:00
|
|
|
|
(pcase acdw/system
|
|
|
|
|
(:work (expand-file-name (concat "~/src/emacs-"
|
|
|
|
|
emacs-version
|
|
|
|
|
"/src")))
|
|
|
|
|
(:home (expand-file-name "~/src/pkg/emacs/src/emacs-git/src"))
|
|
|
|
|
(:other nil)))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-02 19:42:27 +00:00
|
|
|
|
;;;; Etc. modes
|
|
|
|
|
(tooltip-mode -1)
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Etc. bindings
|
2021-04-01 21:35:49 +00:00
|
|
|
|
(global-set-key [remap just-one-space] #'cycle-spacing)
|
|
|
|
|
(global-set-key (kbd "M-/") #'hippie-expand)
|
|
|
|
|
(global-set-key (kbd "M-=") #'count-words)
|
|
|
|
|
(global-set-key (kbd "C-x C-b") #'ibuffer)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-03 14:45:59 +00:00
|
|
|
|
|
|
|
|
|
;;; Applications
|
|
|
|
|
;; Some of these are built-in, some are packages; all are "extra" functionality
|
|
|
|
|
;; in Emacs (i.e., they're not /just/ editing text)
|
|
|
|
|
;;;; Org mode
|
|
|
|
|
(setup (:straight (org :host nil
|
|
|
|
|
:repo "https://code.orgmode.org/bzg/org-mode.git"))
|
|
|
|
|
(require 'acdw-org)
|
|
|
|
|
(:option org-directory "~/org"
|
|
|
|
|
org-hide-emphasis-markers t
|
|
|
|
|
org-fontify-whole-heading-line t
|
|
|
|
|
org-fontify-done-headline t
|
|
|
|
|
org-fontify-quote-and-verse-blocks t
|
|
|
|
|
org-src-fontify-natively t
|
|
|
|
|
org-pretty-entities t
|
|
|
|
|
org-tags-column (- 0 fill-column -3)
|
|
|
|
|
org-src-tab-acts-natively t
|
|
|
|
|
org-src-window-setup 'current-window
|
|
|
|
|
org-confirm-babel-evaluate nil
|
|
|
|
|
org-adapt-indentation nil
|
|
|
|
|
org-catch-invisible-edits 'smart
|
|
|
|
|
org-special-ctrl-a/e t
|
|
|
|
|
org-special-ctrl-k t
|
|
|
|
|
org-imenu-depth 3
|
|
|
|
|
org-export-headline-levels 8
|
|
|
|
|
org-export-with-smart-quotes t
|
|
|
|
|
org-export-with-sub-superscripts t)
|
|
|
|
|
(:bind "RET" unpackaged/org-return-dwim)
|
|
|
|
|
(add-hook 'before-save-hook #'acdw/hook--org-mode-fix-blank-lines))
|
|
|
|
|
|
|
|
|
|
;;;; Eshell
|
|
|
|
|
(setup eshell
|
|
|
|
|
(defun eshell-quit-or-delete-char (arg)
|
|
|
|
|
"Delete the character to the right, or quit eshell on an empty line."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(if (and (eolp) (looking-back eshell-prompt-regexp))
|
|
|
|
|
(eshell-life-is-too-much)
|
|
|
|
|
(delete-forward-char arg)))
|
|
|
|
|
(:option eshell-directory-name (acdw/in-dir "eshell/" t)
|
|
|
|
|
eshell-aliases-file (acdw/in-dir "eshell/aliases" t))
|
|
|
|
|
(add-hook 'eshell-mode-hook
|
|
|
|
|
(defun hook--eshell-setup ()
|
|
|
|
|
"Stuff to do after eshell is done setting up."
|
|
|
|
|
(define-key eshell-mode-map (kbd "C-d")
|
|
|
|
|
#'eshell-quit-or-delete-char)
|
|
|
|
|
(setq mode-line-format '(:eval simple-modeline--mode-line)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;;; Ediff
|
|
|
|
|
(setup ediff
|
|
|
|
|
(:option ediff-window-setup-function 'ediff-setup-windows-plain
|
|
|
|
|
ediff-split-window-function 'split-window-horizontally))
|
|
|
|
|
|
|
|
|
|
;;;; Reading mail
|
|
|
|
|
;; Let's try Gnus.
|
|
|
|
|
(setup gnus
|
|
|
|
|
(:option gnus-select-method '(nnnil nil)
|
|
|
|
|
gnus-secondary-select-methods
|
|
|
|
|
'((nnimap "imap.fastmail.com"
|
|
|
|
|
(nnimap-inbox "INBOX")
|
|
|
|
|
(nnimap-stream ssl)
|
|
|
|
|
(nnimap-expunge never)))))
|
|
|
|
|
|
|
|
|
|
;;;; Web browsing
|
|
|
|
|
(setup browse-url
|
|
|
|
|
(:setq-default browse-url-browser-function 'eww-browse-url
|
|
|
|
|
browse-url-secondary-browser-function
|
|
|
|
|
(if (executable-find "firefox")
|
|
|
|
|
'browse-url-firefox
|
|
|
|
|
'browse-url-default-browser)
|
|
|
|
|
browse-url-new-window-flag t
|
|
|
|
|
browse-url-firefox-new-window-is-tab t)
|
|
|
|
|
(when (eq acdw/system :work)
|
|
|
|
|
(add-to-list 'exec-path "C:/Program Files/Mozilla Firefox")))
|
|
|
|
|
|
|
|
|
|
(setup shr
|
|
|
|
|
(:option shr-width fill-column
|
|
|
|
|
shr-max-width fill-column
|
|
|
|
|
shr-max-image-proportion 0.6
|
|
|
|
|
shr-image-animate t
|
|
|
|
|
shr-discard-aria-hidden t))
|
|
|
|
|
|
|
|
|
|
(setup eww
|
|
|
|
|
(:hook acdw/reading-mode))
|
|
|
|
|
|
|
|
|
|
;;;; Gemini/gopher browsing
|
|
|
|
|
(setup (:straight (elpher :host nil
|
|
|
|
|
:repo "git://thelambdalab.xyz/elpher.git"))
|
|
|
|
|
(:option elpher-ipv4-always t
|
|
|
|
|
elpher-certificate-directory (acdw/in-dir "elpher/")
|
|
|
|
|
elpher-gemini-max-fill-width fill-column)
|
|
|
|
|
(:bind "n" elpher-next-link
|
|
|
|
|
"p" elpher-prev-link
|
|
|
|
|
"o" elpher-follow-current-link
|
|
|
|
|
"G" elpher-go-current)
|
|
|
|
|
(:hook acdw/reading-mode)
|
|
|
|
|
|
|
|
|
|
;; Make `eww' gemini/gopher aware. From Emacswiki.
|
|
|
|
|
(advice-add 'eww-browse-url :around
|
|
|
|
|
(defun elpher:eww-browse-url (original url &optional new-window)
|
|
|
|
|
"Handle gemini and gopher links."
|
|
|
|
|
(cond ((string-match-p "\\`\\(gemini\\|gopher\\)://" url)
|
|
|
|
|
(require 'elpher)
|
|
|
|
|
(elpher-go url))
|
|
|
|
|
(t (funcall original url new-window))))))
|
|
|
|
|
|
|
|
|
|
(setup (:straight (gemini-mode
|
|
|
|
|
:host nil
|
|
|
|
|
:repo "https://git.carcosa.net/jmcbray/gemini.el.git"))
|
|
|
|
|
(:option (append auto-mode-alist)
|
|
|
|
|
'("\\.\\(gemini\\|gmi\\)\\'" . gemini-mode)))
|
|
|
|
|
|
|
|
|
|
;;;; File browsing
|
|
|
|
|
(setup dired
|
|
|
|
|
(:setq-default dired-recursive-copies 'always
|
|
|
|
|
dired-recursive-deletes 'always
|
|
|
|
|
delete-by-moving-to-trash t
|
|
|
|
|
dired-listing-switches "-Al"
|
|
|
|
|
ls-lisp-dirs-first t
|
|
|
|
|
dired-ls-F-marks-symlinks t
|
|
|
|
|
dired-no-confirm '(byte-compile
|
|
|
|
|
chgrp chmod chown copy
|
|
|
|
|
hardlink load move
|
|
|
|
|
shell touch symlink)
|
|
|
|
|
dired-dwim-target t)
|
|
|
|
|
(:also-load dired-x)
|
|
|
|
|
(:hook dired-hide-details-mode
|
|
|
|
|
hl-line-mode)
|
|
|
|
|
(:global "C-x C-j" dired-jump)
|
|
|
|
|
(:bind "RET" dired-find-alternate-file)
|
|
|
|
|
(with-eval-after-load 'dired
|
|
|
|
|
(setup (:straight dired-subtree)
|
|
|
|
|
(define-key dired-mode-map "i" #'dired-subtree-toggle))
|
|
|
|
|
|
|
|
|
|
(setup (:straight dired-collapse)
|
|
|
|
|
(:hook-into dired-mode))
|
|
|
|
|
|
|
|
|
|
(setup (:straight trashed)
|
|
|
|
|
(:option trashed-action-confirmer 'y-or-n-p))))
|
|
|
|
|
|
|
|
|
|
;;;; Magit
|
|
|
|
|
(setup (:straight magit)
|
|
|
|
|
(:acdw/leader "g" magit-status)
|
|
|
|
|
(:option magit-display-buffer-function
|
|
|
|
|
(defun magit-display-buffer-same-window (buffer)
|
|
|
|
|
"Display BUFFER in the selected window like God intended."
|
|
|
|
|
(display-buffer buffer '(display-buffer-same-window)))
|
|
|
|
|
magit-popup-display-buffer-action '((display-buffer-same-window))))
|
|
|
|
|
|
|
|
|
|
;;;; Read e-books (nov.el)
|
|
|
|
|
(setup (:straight nov)
|
|
|
|
|
(:option nov-text-width fill-column
|
|
|
|
|
(append auto-mode-alist) '("\\.epub\\'" . nov-mode)))
|
|
|
|
|
|
|
|
|
|
;;;; PDF Tools
|
|
|
|
|
(when (eq acdw/system :home)
|
|
|
|
|
(setup (:straight pdf-tools)
|
|
|
|
|
(pdf-loader-install)))
|
|
|
|
|
|
|
|
|
|
;;;; VTerm
|
|
|
|
|
(when (eq acdw/system :home)
|
|
|
|
|
(setup (:straight vterm)))
|
|
|
|
|
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;; Packages
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Interactivity
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Begin-end
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight beginend)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(beginend-global-mode +1))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; MWIM
|
2021-03-31 17:46:14 +00:00
|
|
|
|
(setup (:straight mwim)
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global "C-a" mwim-beginning
|
2021-04-01 21:41:41 +00:00
|
|
|
|
"C-e" mwim-end))
|
2021-03-31 17:46:14 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Expand-region
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight expand-region)
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global "C-=" er/expand-region))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; CRUX
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight crux)
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global "M-o" crux-other-window-or-switch-buffer
|
2021-04-01 21:41:41 +00:00
|
|
|
|
"C-k" crux-kill-and-join-forward
|
|
|
|
|
"C-o" crux-smart-open-line-above
|
|
|
|
|
"C-S-o" crux-smart-open-line
|
|
|
|
|
"C-M-\\" crux-cleanup-buffer-or-region
|
|
|
|
|
"C-c i" crux-find-user-init-file)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(crux-reopen-as-root-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; AVY ... & friends
|
2021-03-31 17:46:14 +00:00
|
|
|
|
(setup (:straight avy)
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global "C-:" avy-goto-char
|
2021-04-01 21:41:41 +00:00
|
|
|
|
"C-'" avy-goto-char-timer
|
|
|
|
|
"M-g f" avy-goto-line
|
|
|
|
|
"M-g w" avy-goto-word-1
|
|
|
|
|
"C-c C-j" avy-resume)
|
2021-03-31 17:46:14 +00:00
|
|
|
|
(eval-after-load "isearch"
|
|
|
|
|
'(define-key isearch-mode-map (kbd "C-'") #'avy-isearch)))
|
|
|
|
|
|
|
|
|
|
;;;;; zzz-to-char
|
|
|
|
|
(setup (:straight zzz-to-char)
|
|
|
|
|
(defun acdw/zzz-up-to-char (prefix)
|
|
|
|
|
"Call `zzz-up-to-char', unless issued a PREFIX, in which case
|
|
|
|
|
call `zzz-to-char'."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(if prefix
|
|
|
|
|
(call-interactively #'zzz-to-char)
|
|
|
|
|
(call-interactively #'zzz-up-to-char)))
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global "M-z" acdw/zzz-up-to-char))
|
2021-03-31 17:46:14 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; anzu
|
2021-03-31 17:46:14 +00:00
|
|
|
|
(setup (:straight anzu)
|
|
|
|
|
(:option anzu-replace-to-string-separator " → "
|
|
|
|
|
anzu-cons-mode-line-p nil)
|
|
|
|
|
(add-to-list 'mode-line-misc-info '(:eval (anzu--update-mode-line)))
|
|
|
|
|
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global [remap query-replace] anzu-query-replace
|
2021-04-01 21:41:41 +00:00
|
|
|
|
[remap query-replace-regexp] anzu-query-replace-regexp)
|
2021-03-31 17:46:14 +00:00
|
|
|
|
(:with-map isearch-mode-map
|
|
|
|
|
(:bind [remap isearch-query-replace] anzu-isearch-query-replace
|
|
|
|
|
[remap isearch-query-replace-regexp]
|
|
|
|
|
anzu-isearch-query-replace-regexp))
|
|
|
|
|
|
|
|
|
|
(global-anzu-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; smart hungry delete
|
2021-03-31 17:56:38 +00:00
|
|
|
|
(setup (:straight smart-hungry-delete)
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global "<backspace>" smart-hungry-delete-backward-char
|
2021-04-01 21:41:41 +00:00
|
|
|
|
"C-d" smart-hungry-delete-forward-char)
|
2021-03-31 17:56:38 +00:00
|
|
|
|
(smart-hungry-delete-add-default-hooks))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Functionality
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Async
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(setup (:straight async)
|
|
|
|
|
(autoload 'dired-async-mode "dired-async.el" nil t)
|
|
|
|
|
(dired-async-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Undo-fu
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight undo-fu)
|
2021-04-01 21:41:41 +00:00
|
|
|
|
(:global "C-/" undo-fu-only-undo
|
|
|
|
|
"C-?" undo-fu-only-redo))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
|
|
|
|
(setup (:straight undo-fu-session)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option undo-fu-session-incompatible-files '("/COMMIT_EDITMSG\\'"
|
|
|
|
|
"/git-rebase-todo\\'")
|
2021-04-01 21:36:36 +00:00
|
|
|
|
undo-fu-session-directory (acdw/in-dir "undo/" t)
|
|
|
|
|
undo-fu-session-compression (eq acdw/system :home))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(global-undo-fu-session-mode +1))
|
2021-03-27 05:03:43 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Minibuffer
|
2021-03-11 14:24:54 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Icomplete-vertical
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight icomplete-vertical)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(let ((map icomplete-minibuffer-map))
|
|
|
|
|
(let ((command #'icomplete-forward-completions))
|
|
|
|
|
(define-key map (kbd "<down>") command)
|
|
|
|
|
(define-key map (kbd "C-n") command))
|
|
|
|
|
(let ((command #'icomplete-backward-completions))
|
|
|
|
|
(define-key map (kbd "<up>") command)
|
|
|
|
|
(define-key map (kbd "C-p") command))
|
|
|
|
|
(define-key map (kbd "RET") #'icomplete-force-complete-and-exit)
|
|
|
|
|
(define-key map (kbd "C-RET") #'minibuffer-complete-and-exit))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(icomplete-vertical-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Orderless
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight orderless)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option (prepend completion-styles) 'orderless))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Consult
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight consult)
|
2021-04-01 21:39:46 +00:00
|
|
|
|
|
|
|
|
|
;; "Sensible" functions
|
|
|
|
|
(defun consult-sensible-grep ()
|
|
|
|
|
"Perform `consult-git-grep' if in a git project, otherwise `consult-ripgrep'
|
|
|
|
|
if ripgrep is installed, otherwise `consult-grep'."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(cond ((= (vc-backend buffer-file-name) "Git")
|
|
|
|
|
(call-interactively #'consult-git-grep))
|
|
|
|
|
((exectuable-find "rg")
|
|
|
|
|
(call-interactively #'consult-ripgrep))
|
|
|
|
|
(t (call-interactively #'consult-grep))))
|
|
|
|
|
(defun consult-sensible-find ()
|
|
|
|
|
"Peform `consult-locate' if locate is installed, otehrwise `consult-find'."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(cond ((executable-find "locate") (call-interactively #'consult-locate))
|
|
|
|
|
(t (call-interactively #'consult-find))))
|
|
|
|
|
|
|
|
|
|
;; Bindings
|
2021-04-01 04:07:28 +00:00
|
|
|
|
(:global
|
2021-04-01 21:39:46 +00:00
|
|
|
|
;; C-c bindings (`mode-specific-map')
|
|
|
|
|
"C-c h" consult-history
|
|
|
|
|
"C-c m" consult-mode-command
|
|
|
|
|
"C-c b" consult-bookmark
|
|
|
|
|
"C-c k" consult-kmacro
|
|
|
|
|
;; C-x bindings (`ctl-x-map')
|
|
|
|
|
"C-x M-:" consult-complex-command
|
|
|
|
|
"C-x b" consult-buffer
|
|
|
|
|
"C-x 4 b" consult-buffer-other-window
|
|
|
|
|
"C-x 5 b" consult-buffer-other-frame
|
|
|
|
|
;; Custom M-# bindings for fast register access
|
|
|
|
|
"M-#" consult-register-load
|
|
|
|
|
"M-'" consult-register-store
|
|
|
|
|
"C-M-#" consult-register
|
|
|
|
|
;; M-g bindings (`goto-map')
|
|
|
|
|
"M-g e" consult-compile-error
|
|
|
|
|
"M-g g" consult-goto-line
|
|
|
|
|
"M-g M-g" consult-goto-line
|
|
|
|
|
"M-g o" consult-outline
|
|
|
|
|
"M-g m" consult-mark
|
|
|
|
|
"M-g k" consult-global-mark
|
|
|
|
|
"M-g i" consult-imenu
|
|
|
|
|
"M-g I" consult-project-imenu
|
|
|
|
|
;; M-s bindings (`search-map')
|
|
|
|
|
"M-s g" consult-sensible-grep
|
|
|
|
|
"M-s f" consult-sensible-find
|
|
|
|
|
"M-s l" consult-line
|
|
|
|
|
"M-s m" consult-multi-occur
|
|
|
|
|
"M-s k" consult-keep-lines
|
|
|
|
|
"M-s u" consult-focus-lines
|
|
|
|
|
;; Other bindings
|
|
|
|
|
"M-y" consult-yank-pop
|
|
|
|
|
"<help> a" consult-apropos
|
|
|
|
|
;; Isearch integration
|
|
|
|
|
"M-s e" consult-isearch)
|
|
|
|
|
(:with-map isearch-mode-map
|
|
|
|
|
(:bind "M-e" consult-isearch
|
|
|
|
|
"M-s e" consult-isearch
|
|
|
|
|
"M-s l" consult-line))
|
|
|
|
|
|
|
|
|
|
;; Registers
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(autoload 'consult-register-preview "consult")
|
|
|
|
|
(:option register-preview-delay 0
|
2021-04-01 21:39:46 +00:00
|
|
|
|
register-preview-function #'consult-register-format)
|
|
|
|
|
(:advise register-preview :override #'consult-register-window)
|
|
|
|
|
|
|
|
|
|
;; Xref
|
|
|
|
|
(:option xref-show-xrefs-function #'consult-xref
|
|
|
|
|
xref-show-definitions-function #'consult-xref)
|
|
|
|
|
|
|
|
|
|
;; Projects
|
2021-04-02 19:51:06 +00:00
|
|
|
|
(:option consult-project-root-function #'vc-root-dir))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Marginalia
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight marginalia)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option marginalia-annotators '(marginalia-annotators-heavy
|
|
|
|
|
marginalia-annotators-light))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(marginalia-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; UI
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Modus themes
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight (modus-themes
|
|
|
|
|
:host gitlab
|
|
|
|
|
:repo "protesilaos/modus-themes"))
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option modus-themes-slanted-constructs t
|
|
|
|
|
modus-themes-bold-constructs t
|
|
|
|
|
modus-themes-region 'bg-only
|
|
|
|
|
modus-themes-org-blocks 'grayscale
|
|
|
|
|
modus-themes-headings '((1 . section)
|
|
|
|
|
(t . no-color))
|
|
|
|
|
modus-themes-mode-line nil)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(acdw/sunrise-sunset #'modus-themes-load-operandi
|
|
|
|
|
#'modus-themes-load-vivendi))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Mode line
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight simple-modeline)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(setup (:straight minions))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(:option simple-modeline-segments
|
|
|
|
|
'((acdw-modeline/modified
|
|
|
|
|
acdw-modeline/buffer-name
|
|
|
|
|
acdw-modeline/vc-branch
|
|
|
|
|
simple-modeline-segment-position
|
|
|
|
|
simple-modeline-segment-word-count)
|
|
|
|
|
(simple-modeline-segment-misc-info
|
|
|
|
|
simple-modeline-segment-process
|
|
|
|
|
acdw-modeline/god-mode-indicator
|
|
|
|
|
acdw-modeline/minions
|
|
|
|
|
simple-modeline-segment-major-mode)))
|
|
|
|
|
(require 'acdw-modeline)
|
|
|
|
|
(simple-modeline-mode +1))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Olivetti
|
2021-03-31 17:45:42 +00:00
|
|
|
|
;; also useful for `acdw/reading-mode'
|
|
|
|
|
(setup (:straight olivetti)
|
|
|
|
|
(:option olivetti-body-width (+ fill-column 4)
|
|
|
|
|
olivetti-minimum-body-width fill-column))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Outshine
|
2021-03-31 23:00:22 +00:00
|
|
|
|
(setup (:straight outshine)
|
|
|
|
|
(:option outline-minor-mode-prefix "")
|
|
|
|
|
(:hook-into emacs-lisp-mode))
|
|
|
|
|
|
2021-04-03 14:46:48 +00:00
|
|
|
|
;;;;; Form-feed
|
|
|
|
|
(setup (:straight form-feed)
|
|
|
|
|
(global-form-feed-mode +1))
|
|
|
|
|
|
2021-04-01 21:37:09 +00:00
|
|
|
|
;;;;; Which-key
|
|
|
|
|
(setup (:straight which-key)
|
|
|
|
|
(:option which-key-show-early-on-C-h t
|
|
|
|
|
which-key-idle-delay 10000
|
|
|
|
|
which-key-idle-secondary-delay 0.05)
|
|
|
|
|
(which-key-setup-side-window-bottom)
|
|
|
|
|
(which-key-mode +1))
|
2021-04-01 21:34:25 +00:00
|
|
|
|
|
|
|
|
|
;;;;; Helpful
|
|
|
|
|
(setup (:straight helpful)
|
2021-04-02 17:57:54 +00:00
|
|
|
|
(:global "<help> f" helpful-callable
|
|
|
|
|
"<help> v" helpful-variable
|
|
|
|
|
"<help> k" helpful-key
|
|
|
|
|
"<help> o" helpful-symbol
|
|
|
|
|
"C-c C-d" helpful-at-point))
|
2021-04-01 21:34:25 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; Utilities
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; 0x0 -- upload files to a nullpointer
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight (0x0 :host nil
|
|
|
|
|
:repo "https://git.sr.ht/~zge/nullpointer-emacs"))
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option 0x0-default-host 'ttm))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-01 21:35:26 +00:00
|
|
|
|
;;;;; Flyspell-correct
|
|
|
|
|
(when (executable-find ispell-program-name)
|
|
|
|
|
(with-eval-after-load 'flyspell
|
|
|
|
|
(setup (:straight flyspell-correct)
|
|
|
|
|
(define-key flyspell-mode-map (kbd "C-;") #'flyspell-correct-wrapper))))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;; System tie-ins
|
|
|
|
|
;; Insctead of using `setup''s `:needs', I'm going to wrap these in
|
2021-03-31 23:00:22 +00:00
|
|
|
|
;; `exectuable-find' forms. I don't want to waste time with pulling packages
|
|
|
|
|
;; that won't work on a machine.
|
|
|
|
|
|
2021-04-02 18:05:12 +00:00
|
|
|
|
;;;;; PKGBUILDs
|
|
|
|
|
(when (eq acdw/system :home)
|
|
|
|
|
(setup (:straight pkgbuild-mode)))
|
|
|
|
|
|
2021-04-03 14:45:59 +00:00
|
|
|
|
|
2021-04-01 21:42:44 +00:00
|
|
|
|
;;; Programming languages
|
|
|
|
|
;; This section includes packages and other settings, because most languages'
|
|
|
|
|
;; packages aren't packaged with Emacs.
|
2021-03-11 18:16:20 +00:00
|
|
|
|
|
2021-04-03 14:45:59 +00:00
|
|
|
|
;;;; Formatting
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight (apheleia :host github
|
|
|
|
|
:repo "raxod502/apheleia"))
|
2021-04-01 21:53:49 +00:00
|
|
|
|
(apheleia-global-mode +1)
|
|
|
|
|
|
|
|
|
|
;; Use a dumb formatter on modes that `apheleia' doesn't work for.
|
2021-04-02 18:29:50 +00:00
|
|
|
|
(add-hook 'before-save-hook
|
|
|
|
|
(defun dumb-auto-format ()
|
|
|
|
|
"Run `indent-region' in buffers that don't have an `apheleia'
|
|
|
|
|
formatter set."
|
|
|
|
|
(unless (apheleia--get-formatter-command)
|
|
|
|
|
(indent-region (point-min) (point-max))))))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
2021-04-02 18:06:21 +00:00
|
|
|
|
;;;;; Eldoc
|
|
|
|
|
(setup eldoc
|
|
|
|
|
(:option eldoc-idle-delay 0.1
|
|
|
|
|
eldoc-echo-area-use-multiline-p nil))
|
2021-04-03 14:45:24 +00:00
|
|
|
|
|
2021-04-03 14:47:58 +00:00
|
|
|
|
;;;; Lisps
|
|
|
|
|
(setup (:straight paren-face)
|
|
|
|
|
(global-paren-face-mode +1))
|
|
|
|
|
|
2021-04-03 14:45:24 +00:00
|
|
|
|
;;;;; Paredit mode
|
|
|
|
|
(setup (:straight paredit)
|
|
|
|
|
(autoload 'enable-paredit-mode "paredit" nil t)
|
|
|
|
|
(dolist (hook '(emacs-lisp-mode-hook
|
|
|
|
|
eval-expression-minibuffer-setup-hook
|
|
|
|
|
ielm-mode-hook
|
|
|
|
|
lisp-mode-hook
|
|
|
|
|
lisp-interaction-mode-hook
|
|
|
|
|
scheme-mode-hook))
|
|
|
|
|
(add-hook hook #'enable-paredit-mode))
|
|
|
|
|
(:hook (defun hook--paredit-disable-electric-pair ()
|
|
|
|
|
(electric-pair-local-mode -1)))
|
|
|
|
|
(require 'eldoc)
|
|
|
|
|
(eldoc-add-command 'paredit-backward-delete 'paredit-close-round))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Emacs lisp
|
2021-04-02 18:06:33 +00:00
|
|
|
|
(setup elisp-mode
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(:option eval-expression-print-length nil
|
|
|
|
|
eval-expression-print-level nil
|
2021-04-02 18:06:33 +00:00
|
|
|
|
lisp-indent-function #'lisp-indent-function)
|
|
|
|
|
|
|
|
|
|
(defun acdw/eval-region-or-buffer ()
|
|
|
|
|
(interactive)
|
|
|
|
|
(if (region-active-p)
|
|
|
|
|
(eval-region (region-beginning) (region-end))
|
|
|
|
|
(eval-buffer)))
|
|
|
|
|
|
|
|
|
|
(:with-map emacs-lisp-mode-map
|
|
|
|
|
(:bind "C-c C-c" acdw/eval-region-or-buffer
|
|
|
|
|
"C-c C-z" ielm))
|
|
|
|
|
|
|
|
|
|
(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
|
|
|
|
|
(add-hook 'ielm-mode-hook 'turn-on-eldoc-mode))
|
2021-03-11 18:16:20 +00:00
|
|
|
|
|
2021-03-31 22:59:28 +00:00
|
|
|
|
(setup (:straight macrostep)
|
|
|
|
|
(define-key emacs-lisp-mode-map (kbd "C-c e") #'macrostep-expand))
|
|
|
|
|
|
2021-04-02 18:06:33 +00:00
|
|
|
|
(setup (:straight eros)
|
|
|
|
|
(:hook-into emacs-lisp-mode))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Shell scripts
|
2021-04-03 14:47:19 +00:00
|
|
|
|
;;;;; Fennel
|
|
|
|
|
(when (executable-find "fennel")
|
|
|
|
|
(setup (:straight fennel-mode)
|
|
|
|
|
(autoload 'fennel-mode "fennel-mode" nil t)
|
|
|
|
|
(:option (append auto-mode-alist) '("\\.fnl\\'" . fennel-mode))
|
|
|
|
|
(:bind "C-c C-c" )))
|
|
|
|
|
|
2021-04-03 14:47:35 +00:00
|
|
|
|
;;;;; Guile Scheme
|
|
|
|
|
(when (or (executable-find "guile")
|
|
|
|
|
(exectuable-find "csi")
|
|
|
|
|
(executable-find "racket"))
|
|
|
|
|
(setup (:straight geiser)))
|
2021-04-03 14:47:19 +00:00
|
|
|
|
|
|
|
|
|
;;;; Lua
|
|
|
|
|
(setup (:straight lua-mode)
|
|
|
|
|
(:option (append auto-mode-alist) '("\\.lua\\'" . lua-mode)))
|
2021-03-31 22:59:28 +00:00
|
|
|
|
(setup sh-mode
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option sh-basic-offset tab-width
|
|
|
|
|
sh-indent-after-case 0
|
|
|
|
|
sh-indent-for-case-alt '+
|
|
|
|
|
sh-indent-for-case-label 0)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(:local-set indent-tabs-mode t)
|
|
|
|
|
|
|
|
|
|
(when (executable-find "shfmt")
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(with-eval-after-load 'apheleia
|
|
|
|
|
(:option (append apheleia-formatters) '(shfmt . ("shfmt"))
|
|
|
|
|
(append apheleia-mode-alist) '(sh-mode . shfmt))))
|
2021-03-29 22:52:23 +00:00
|
|
|
|
|
|
|
|
|
(when (executable-find "shellcheck")
|
|
|
|
|
(straight-use-package 'flymake-shellcheck)
|
|
|
|
|
(:hook flymake-mode
|
|
|
|
|
flymake-shellcheck-load)))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;;; Web languages
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(setup (:straight web-mode)
|
2021-03-30 04:21:58 +00:00
|
|
|
|
(:option css-level-offset 2
|
|
|
|
|
js-indent-level 2
|
|
|
|
|
sgml-indent-offset 2)
|
2021-03-29 22:52:23 +00:00
|
|
|
|
(dolist (extension '("\\(p\\|dj\\)?html"
|
|
|
|
|
"html?"
|
|
|
|
|
"\\(tpl\\.\\)?php"
|
|
|
|
|
"[agj]sp"
|
|
|
|
|
"as[cp]x"
|
|
|
|
|
"erb"
|
|
|
|
|
"mustache"))
|
|
|
|
|
(add-to-list 'auto-mode-alist
|
|
|
|
|
`(,(concat "\\." extension "\\'") . web-mode))))
|
2021-03-11 18:16:50 +00:00
|
|
|
|
|
2021-04-01 04:08:50 +00:00
|
|
|
|
;;;;; FORTH
|
|
|
|
|
(when (locate-library "gforth")
|
|
|
|
|
(autoload 'forth-mode "gforth")
|
|
|
|
|
(add-to-list 'auto-mode-alist '("\\.fs\\'" . forth-mode))
|
|
|
|
|
(autoload 'forth-block-mode "gforth")
|
|
|
|
|
(add-to-list 'auto-mode-alist '("\\.fb\\'" . forth-block-mode)))
|
|
|
|
|
|
2021-04-01 00:10:09 +00:00
|
|
|
|
;;;- init.el ends here
|