emacs/init.el

377 lines
11 KiB
EmacsLisp
Raw Normal View History

2021-03-08 04:14:38 +00:00
:;;; 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.
(acdw/set '((word-wrap t
truncate-lines nil)))
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)
;; 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 ()
(setq cursor-type (if overwrite-mode t 'bar)))
(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
2021-03-11 14:24:54 +00:00
(acdw/bind "C-h" ehelp-command :after ("ehelp" nil nil 'keymap))
;;; 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)
2021-03-11 18:09:58 +00:00
;; (completion-styles (substring flex))
;; (completion-category-overrides ((file (styles
;; basic substring flex))))
2021-03-11 14:24:54 +00:00
(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
:now ((acdw/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 g" consult-line)
("M-g M-g" consult-line)
("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")
(acdw/set '((register-preview-delay 0)
(register-preview-function #'consult-register-preview)))))
;; Marginalia
(acdw/pkg marginalia
:now ((acdw/set '((marginalia-annotators (marginalia-annotators-heavy
marginalia-annotators-light))))
(marginalia-mode +1)))
;; Imenu
(when (require 'imenu)
(acdw/set '((imenu-auto-rescan t))))
;;; Packages
;; Undo-fu
(acdw/pkg undo-fu
:binds (("C-/" undo-fu-only-undo)
("C-?" undo-fu-only-redo)))
(acdw/pkg undo-fu-session
:now ((acdw/set `((undo-fu-session-incompatible-files ("/COMMIT_EDITMSG\\'"
"/git-rebase-todo\\'"))
(undo-fu-session-directory ,(acdw/in-dir "undo/" t)))))
:then ((global-undo-fu-session-mode +1)))
;; Modus themes
(acdw/pkg (modus-themes
:host gitlab
:repo "protesilaos/modus-themes")
:now ((acdw/set `((modus-themes-slanted-constructs t)
2021-03-11 18:04:45 +00:00
(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)))
2021-03-11 14:24:54 +00:00
(acdw/sunrise-sunset #'modus-themes-load-operandi
#'modus-themes-load-vivendi))
:then
((dolist (face '(modus-theme-heading-1
modus-theme-heading-2
modus-theme-heading-3
modus-theme-heading-4
modus-theme-heading-5
modus-theme-heading-6
modus-theme-heading-7
modus-theme-heading-8))
(acdw/set-face face
`((t (:inherit (fixed-pitch bold))))))))
2021-03-11 18:10:19 +00:00
;; Minions
(acdw/pkg minions
:now ((minions-mode +1)))
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)
(add-to-list 'exec-path "C:/Program Files/ Mozilla Firefox"))
(acdw/hooks text-mode-hook goto-address-mode)
(acdw/hooks prog-mode-hook goto-address-prog-mode)
2021-03-11 18:15:33 +00:00
;;; Dired
(acdw/set `((dired-recursive-copies always)
(dired-recursive-deletes always)
(delete-by-moving-to-trash t)
(dired-listing-switches "-Al")
(ls-lisp-dirs-first t)
(dired-dwim-target t)))
(defun hook--dired-mode ()
(hl-line-mode +1)
(dired-hide-details-mode +1))
(add-hook 'dired-mode-hook #'hook--dired-mode)
(acdw/bind "C-x C-j" dired-jump :after "dired-x")
(with-eval-after-load 'dired
;; I tried `autoload'ing the keymap, and it just wouldn't work. I have no
;; idea what the issue was.
(acdw/pkg dired-subtree
:binds (("i" dired-subtree-toggle :map dired-mode-map))))
(acdw/pkg dired-collapse
:hooks (dired-mode-hook dired-collapse-mode))
2021-03-11 18:15:59 +00:00
;;; Eshell
(acdw/set `((eshell-directory-name ,(acdw/in-dir "eshell/" t))
(eshell-aliases-file ,(acdw/in-dir "eshell/aliases" t))))
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-11 14:24:54 +00:00
;;; Miscellaneous
(acdw/set '((disabled-command-function nil)
(load-prefer-newer t)
(comp-async-report-warnings-errors nil)))
(fset 'yes-or-no-p #'y-or-n-p)
;;; init.el ends here