emacs/init.el

447 lines
13 KiB
EmacsLisp
Raw Normal View History

;;; init.el -*- lexical-binding: t; coding: utf-8-unix -*-
2021-03-01 05:58:57 +00:00
;;
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-11 14:24:22 +00:00
;; Bankruptcy: 5c
2021-03-01 05:58:57 +00:00
;;
;; This file is NOT part of GNU Emacs.
;;
;;; License:
;;
;; 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.
;;
;;; Code:
2021-02-26 17:31:50 +00:00
2021-03-09 04:40:23 +00:00
;;; Add `acdw.el'
2021-03-11 18:04:45 +00:00
(push (expand-file-name "lisp/" user-emacs-directory)
2021-03-08 22:58:18 +00:00
load-path)
2021-03-08 04:14:38 +00:00
(require 'acdw)
2021-03-04 15:09:29 +00:00
2021-03-09 04:40:23 +00:00
;;; About me
(acdw/set
'((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)
(calendar-date-style iso)))
2021-03-08 22:58:18 +00:00
;;; Good defaults
;; Lines
(acdw/set '((fill-column 80)))
(global-display-fill-column-indicator-mode +1)
(add-hook 'text-mode-hook #'turn-on-auto-fill)
(add-hook 'prog-mode-hook #'turn-on-auto-fill)
(global-so-long-mode +1)
2021-03-11 18:08:23 +00:00
;; I don't want `visual-line-mode', because I really only want to wrap and
;; truncate lines. Believe me, I know what I'm doing.
2021-03-12 18:47:54 +00:00
(acdw/set '((word-wrap t)
(truncate-lines t)))
2021-03-11 18:08:23 +00:00
2021-03-08 22:58:18 +00:00
;; Whitespace
2021-03-11 18:08:23 +00:00
(acdw/set '((whitespace-style
2021-03-08 22:58:18 +00:00
(empty indentation space-before-tab space-after-tab))
(indent-tabs-mode t)
(tab-width 8)))
(add-hook 'before-save-hook #'whitespace-cleanup)
2021-03-08 22:58:18 +00:00
;; Pairs
(add-hook 'prog-mode-hook #'electric-pair-local-mode)
(acdw/set '((show-paren-delay 0)
(show-paren-style mixed)
(show-paren-when-point-inside-paren t)
(show-paren-when-point-in-periphery t)))
(show-paren-mode +1)
;; Killing & Yanking
(delete-selection-mode +1)
2021-03-11 18:08:51 +00:00
(acdw/set '((save-interprogram-paste-before-kill t)
2021-03-08 22:58:18 +00:00
(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)))
;; Encoding
(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)
(acdw/set '((locale-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-11 14:24:39 +00:00
;; Unique buffer names
(when (require 'uniquify)
(acdw/set '((uniquify-buffer-name-style forward)
(uniquify-separator "/")
(uniquify-after-kill-buffer-p t)
(uniquify-ignore-buffers-re "^\\*"))))
2021-03-08 22:58:18 +00:00
;; Backups
(acdw/set `((backup-by-copying t)
(delete-old-versions -1)
(version-control t)
(vc-make-backup-files t)
(backup-directory-alist ((".*" . ,(acdw/in-dir "backup/" t))))))
;; Autosaves
(acdw/set `((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))))
(auto-save-visited-mode +1)
2021-03-11 14:24:54 +00:00
(defun hook--auto-save-when-unfocused ()
"Save all buffers when out of focus."
(acdw/when-unfocused #'save-some-buffers t))
(add-function :after after-focus-change-function
#'hook--auto-save-when-unfocused)
2021-03-09 04:40:23 +00:00
;; Auto-revert
(when (require 'autorevert)
(global-auto-revert-mode +1))
;; Save place
(when (require 'saveplace)
(acdw/set
2021-03-11 14:24:54 +00:00
`((save-place-file ,(acdw/in-dir "places.el"))
2021-03-09 04:40:23 +00:00
(save-place-forget-unreadable-files ,(eq acdw/system :home))))
(save-place-mode +1))
;; Recent files
(when (require 'recentf)
(acdw/set
2021-03-11 14:24:54 +00:00
`((recentf-save-file ,(acdw/in-dir "recentf.el"))
2021-03-09 04:40:23 +00:00
(recentf-max-menu-items 100)
(recentf-max-saved-items nil)
(recentf-auto-cleanup 60 "Cleanup the recentf list when idle for 60s.")))
(add-to-list 'recentf-exclude acdw/dir)
(recentf-mode +1))
2021-03-09 04:40:23 +00:00
;; Move the custom file
(acdw/set `((custom-file ,(acdw/in-dir "custom.el"))))
2021-03-08 22:58:18 +00:00
;; Cursor
(acdw/set '((cursor-type bar)
2021-03-11 14:24:54 +00:00
(cursor-in-non-selected-windows hollow)))
2021-03-08 22:58:18 +00:00
(defun hook--overwrite-mode-change-cursor ()
2021-03-12 23:32:48 +00:00
(setq cursor-type (if overwrite-mode 'hbar 'bar)))
2021-03-08 22:58:18 +00:00
(add-hook 'overwrite-mode-hook #'hook--overwrite-mode-change-cursor)
2021-03-11 14:24:54 +00:00
;; Scrolling
(acdw/set '((auto-window-vscroll nil)
(fast-but-imprecise-scrolling t)
(scroll-margin 0)
(scroll-conservatively 101)
(scroll-preserve-screen-position 1)))
2021-03-08 22:58:18 +00:00
;; Bindings
(acdw/binds (("C-h" ehelp-command :after ("ehelp" nil nil 'keymap))
([remap just-one-space] cycle-spacing)
("M-/" hippie-expand)
("M-=" count-words)
("C-x C-b" ibuffer)))
2021-03-11 14:24:54 +00:00
;;; Startup
(acdw/set `((inhibit-startup-screen t)
(initial-buffer-choice t)
2021-03-11 18:04:45 +00:00
(initial-scratch-message
,(concat ";; Howdy, "
(nth 0 (split-string user-full-name)) "!"
" Welcome to GNU Emacs.\n\n"))))
2021-03-11 14:24:54 +00:00
;;; Minibuffer
2021-03-11 18:09:41 +00:00
(acdw/set '((minibuffer-prompt-properties (read-only t
cursor-intangible t
face minibuffer-prompt))
(enable-recursive-minibuffers t)
(file-name-shadow-properties (invisible t))))
(minibuffer-depth-indicate-mode +1)
(file-name-shadow-mode +1)
2021-03-11 14:24:54 +00:00
;; Save history
(when (require 'savehist)
(acdw/set `((savehist-additional-variables
(kill-ring search-ring regexp-search-ring))
(history-length t)
(history-delete-duplicates t)
(savehist-autosave-interval 6)
(savehist-file ,(acdw/in-dir "savehist.el"))))
(savehist-mode +1))
;; Icomplete (-vertical)
(when (require 'icomplete)
(acdw/set '((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)))
2021-03-11 18:09:58 +00:00
(acdw/pkg orderless
:set '((completion-styles (orderless))))
2021-03-11 14:24:54 +00:00
(acdw/pkg icomplete-vertical
:binds (("<down>" icomplete-forward-completions
2021-03-11 18:04:45 +00:00
:map icomplete-minibuffer-map)
2021-03-11 14:24:54 +00:00
("C-n" icomplete-forward-completions
2021-03-11 18:04:45 +00:00
:map icomplete-minibuffer-map)
2021-03-11 14:24:54 +00:00
("<up>" icomplete-backward-completions
2021-03-11 18:04:45 +00:00
:map icomplete-minibuffer-map)
2021-03-11 14:24:54 +00:00
("C-p" icomplete-backward-completions
2021-03-11 18:04:45 +00:00
:map icomplete-minibuffer-map)
2021-03-11 14:24:54 +00:00
("C-v" icomplete-vertical-toggle
2021-03-11 18:04:45 +00:00
:map icomplete-minibuffer-map))
2021-03-11 14:24:54 +00:00
:now ((fido-mode -1)
(icomplete-mode +1)
(icomplete-vertical-mode +1))))
;; Consult
(acdw/pkg consult
:binds (;; C-c bindings (`mode-specific-map')
("C-c h" consult-history)
("C-c m" consult-mode-command)
;; 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)
("C-x r x" consult-register)
("C-x r b" consult-bookmark)
;; M-g bindings (`goto-map')
("M-g o" consult-outline)
("M-g m" consult-mark)
("M-g k" consult-global-mark)
("M-g i" consult-imenu)
("M-g e" consult-error)
;; M-s bindings (`search-map')
("M-s g" consult-grep) ; alts:
; consult-git-grep,
; consult-ripgrep
("M-s f" consult-find) ; alts:
; consult-locate
("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)
("<f1> a" consult-apropos)
("C-h a" consult-apropos))
:now ((autoload 'consult-register-preview "consult"))
:set '((register-preview-delay 0)
(register-preview-function #'consult-register-preview)))
2021-03-11 14:24:54 +00:00
;; Marginalia
(acdw/pkg marginalia
:set '((marginalia-annotators (marginalia-annotators-heavy
marginalia-annotators-light)))
:now ((marginalia-mode +1)))
2021-03-11 14:24:54 +00:00
;; Imenu
(when (require 'imenu)
(acdw/set '((imenu-auto-rescan t))))
;; Fonts
(acdw/set-faces ((fixed-pitch . ((t (:inherit default))))))
2021-03-11 14:24:54 +00:00
;;; Packages
;; Undo-fu
(acdw/pkg undo-fu
:binds (("C-/" undo-fu-only-undo)
("C-?" undo-fu-only-redo)))
(acdw/pkg undo-fu-session
:set `((undo-fu-session-incompatible-files ("/COMMIT_EDITMSG\\'"
"/git-rebase-todo\\'"))
(undo-fu-session-directory ,(acdw/in-dir "undo/" t)))
2021-03-11 14:24:54 +00:00
:then ((global-undo-fu-session-mode +1)))
;; Modus themes
(acdw/pkg (modus-themes
:host gitlab
:repo "protesilaos/modus-themes")
:set `((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-scale-headings nil)
(modus-themes-mode-line nil))
:now ((acdw/sunrise-sunset #'modus-themes-load-operandi
2021-03-16 16:15:59 +00:00
#'modus-themes-load-vivendi)))
2021-03-11 14:24:54 +00:00
2021-03-13 05:05:42 +00:00
;; Expand-region
(acdw/pkg expand-region
:binds (("C-=" er/expand-region)))
2021-03-13 07:56:40 +00:00
;;; Frame title
(acdw/set `((frame-title-format
"%b %+%* GNU Emacs")))
2021-03-11 14:24:54 +00:00
2021-03-11 23:59:44 +00:00
;;; Mode line
2021-03-11 18:10:19 +00:00
;; Minions
(acdw/pkg minions)
2021-03-11 18:10:19 +00:00
2021-03-11 23:59:44 +00:00
;; Simple mode line
(acdw/pkg simple-modeline
:set '((simple-modeline-segments
((;; left
acdw-modeline/modified
acdw-modeline/buffer-name
simple-modeline-segment-position
simple-modeline-segment-word-count)
(;; right
acdw-modeline/vc-branch
simple-modeline-segment-misc-info
simple-modeline-segment-process
acdw-modeline/minions
simple-modeline-segment-major-mode))))
:now ((require 'acdw-modeline)
2021-03-12 15:36:15 +00:00
(simple-modeline-mode +1)))
2021-03-11 23:59:44 +00:00
2021-03-11 14:24:54 +00:00
;;; Magit
(acdw/pkg magit
:binds (("g" magit-status :map acdw/leader)))
2021-03-11 18:10:54 +00:00
;;; Web browsing
(acdw/set '((browse-url-browser-function browse-url-firefox)
(browse-url-new-window-flag t)
(browse-url-firefox-new-window-is-tab t)
(shr-max-width fill-column)
(shr-width fill-column)))
(when (eq acdw/system :work)
2021-03-11 18:17:53 +00:00
(add-to-list 'exec-path "C:/Program Files/Mozilla Firefox"))
2021-03-11 18:10:54 +00:00
(acdw/hooks ((text-mode-hook goto-address-mode)
(prog-mode-hook goto-address-prog-mode)))
2021-03-11 18:10:54 +00:00
2021-03-11 18:15:33 +00:00
;;; Dired
2021-03-16 14:29:53 +00:00
(acdw/pkg dired
:local t
:set `((dired-recursive-copies always)
2021-03-11 18:15:33 +00:00
(dired-recursive-deletes always)
(delete-by-moving-to-trash t)
(dired-listing-switches "-Al")
(ls-lisp-dirs-first t)
2021-03-16 14:29:53 +00:00
(dired-dwim-target t))
:now ((autoload 'dired-mode-map "dired" nil nil 'keymap)
(acdw/pkg dired-subtree)
(acdw/pkg dired-x
:local t
:binds (("C-x C-j" dired-jump)))
(acdw/pkg dired-collapse
:hooks ((dired-mode-hook dired-collapse-mode)))
(defun hook--dired-mode ()
(hl-line-mode +1)
(dired-hide-details-mode +1)))
:hooks ((dired-mode-hook hook--dired-mode))
:binds (("i" dired-subtree-toggle :map dired-mode-map)))
2021-03-11 18:15:33 +00:00
2021-03-11 18:15:59 +00:00
;;; Eshell
(acdw/set `((eshell-directory-name ,(acdw/in-dir "eshell/" t))
2021-03-11 18:18:21 +00:00
(eshell-aliases-file ,(acdw/in-dir "eshell/aliases" t))))
2021-03-11 18:15:59 +00:00
2021-03-12 23:20:49 +00:00
;;; Org-mode
(acdw/pkg (org
:repo "https://code.orgmode.org/bzg/org-mode.git")
:now ((require 'acdw-org))
:set `((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))
:hooks ((before-save-hook acdw/hook--org-mode-fix-blank-lines))
2021-03-15 00:18:32 +00:00
:binds (("RET" unpackaged/org-return-dwim
:map org-mode-map :map-after 'org)))
2021-03-15 00:18:52 +00:00
;;; Nov.el -- ebook reader
(acdw/pkg nov
:now ((autoload #'nov-mode "nov")
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)))
:set `((nov-text-width ,fill-column)))
2021-03-15 00:19:02 +00:00
;;; 0x0 -- upload files
(acdw/pkg (0x0 :repo "https://git.sr.ht/~zge/nullpointer-emacs")
:set '((0x0-default-host ttm)))
2021-03-12 23:20:49 +00:00
2021-03-11 18:16:20 +00:00
;;; Programming languages
;; Emacs lisp
(acdw/set '((eval-expression-print-length nil)
(eval-expression-print-level nil)))
(when (require 'cl-lib)
(setq-default lisp-indent-function #'common-lisp-indent-function)
(put 'cl-flet 'common-lisp-indent-function
(get 'flet 'common-lisp-indent-function))
(put 'cl-labels 'common-lisp-indent-function
(get 'labels 'common-lisp-indent-function))
(put 'if 'common-lisp-indent-function 2)
(put 'dotimes-protect 'common-lisp-indent-function
(get 'when 'common-lisp-indent-function)))
2021-03-15 00:19:11 +00:00
;; Racket
(acdw/pkg racket-mode)
2021-03-11 14:24:54 +00:00
;;; Miscellaneous
(acdw/set '((disabled-command-function nil)
(load-prefer-newer t)
(comp-async-report-warnings-errors nil)))
2021-03-11 18:16:50 +00:00
2021-03-11 14:24:54 +00:00
(fset 'yes-or-no-p #'y-or-n-p)
2021-03-11 18:16:50 +00:00
;; Garbage collection
(defun hook--gc-cons-maximize ()
(setq gc-cons-threshold most-positive-fixnum))
(add-hook 'minibuffer-setup-hook #'hook--gc-cons-maximize)
(defun hook--gc-cons-baseline ()
(setq gc-cons-threshold gc-cons-threshold-basis))
(add-hook 'minibuffer-exit-hook #'hook--gc-cons-baseline)
(defun hook--gc-when-unfocused ()
(acdw/when-unfocused #'garbage-collect))
(add-function :after after-focus-change-function
#'hook--gc-when-unfocused)
2021-03-11 14:24:54 +00:00
;;; init.el ends here