From 70026d07d0bef09468b93caabf9a1f425533a69a Mon Sep 17 00:00:00 2001 From: Amin Bandali Date: Mon, 10 Feb 2025 15:05:56 -0500 Subject: Drop use-package again I prefer my own manual approach, use-package feels too magical and at times does too much for me. --- .emacs.d/lisp/bandali-essentials.el | 627 +++++++++++++++--------------------- 1 file changed, 262 insertions(+), 365 deletions(-) (limited to '.emacs.d/lisp/bandali-essentials.el') diff --git a/.emacs.d/lisp/bandali-essentials.el b/.emacs.d/lisp/bandali-essentials.el index ad1e141..09ef291 100644 --- a/.emacs.d/lisp/bandali-essentials.el +++ b/.emacs.d/lisp/bandali-essentials.el @@ -24,156 +24,116 @@ ;;; Code: -(use-package emacs - :demand t - :bind - ("C-c e b" . eval-buffer) - ("C-c e r" . eval-region) - :config - (when (display-graphic-p) - ;; Too easy to accidentally suspend (freeze) Emacs GUI. - (b/keymap-global-unset "C-z")) - +(setq-default + ;; Case-sensitive search (and `dabbrev-expand'). + ;; case-fold-search nil + indent-tabs-mode nil ; always use space for indentation + ;; tab-width 4 + indicate-buffer-boundaries 'left) + +(setq + ;; line-spacing 3 + completion-ignore-case t + read-buffer-completion-ignore-case t + enable-recursive-minibuffers t + resize-mini-windows t + message-log-max 20000 + mode-line-compact t + ;; mouse-autoselect-window t + scroll-conservatively 15 + scroll-preserve-screen-position 1 + ;; I don't feel like randomly jumping out of my chair. + ring-bell-function 'ignore) + +;; Mode-line compacting for older Emacsen. +(when (and (version< emacs-version "28") mode-line-compact) + ;; Manually make some `mode-line' spaces smaller. + ;; Emacs 28 and above do a terrific job at this out of the box + ;; when `mode-line-compact' is set to t (see above)." (setq-default - ;; Case-sensitive search (and `dabbrev-expand'). - ;; case-fold-search nil - indent-tabs-mode nil ; always use space for indentation - ;; tab-width 4 - indicate-buffer-boundaries 'left) - - (setq - ;; line-spacing 3 - completion-ignore-case t - read-buffer-completion-ignore-case t - enable-recursive-minibuffers t - resize-mini-windows t - message-log-max 20000 - mode-line-compact t - ;; mouse-autoselect-window t - scroll-conservatively 15 - scroll-preserve-screen-position 1 - ;; I don't feel like randomly jumping out of my chair. - ring-bell-function 'ignore) - - ;; Mode-line compacting for older Emacsen. - (when (and (version< emacs-version "28") mode-line-compact) - ;; Manually make some `mode-line' spaces smaller. - ;; Emacs 28 and above do a terrific job at this out of the box - ;; when `mode-line-compact' is set to t (see above)." - (setq-default - mode-line-format - (mapcar - (lambda (x) - (if (and (stringp x) - (or (string= x " ") - (string= x " "))) - " " - x)) - mode-line-format) - mode-line-buffer-identification - (propertized-buffer-identification "%10b"))) - - ;; Fonts and types. - (when (display-graphic-p) - (set-fontset-font t 'arabic "Sahel WOL") - (let ((emoji-font "Apple Color Emoji")) - (when (member emoji-font (font-family-list)) - (set-fontset-font - t 'emoji `(,emoji-font . "iso10646-1") nil 'prepend))) - (with-eval-after-load 'faces - (let ((grey "#e7e7e7")) - ;; (set-face-attribute 'default nil - ;; :font "Source Code Pro" - ;; :height 113 ; 130 ; 105 - ;; :weight 'medium) - ;; (set-face-attribute 'fixed-pitch nil - ;; :font "Source Code Pro" - ;; :weight 'medium) - ;; (set-face-attribute 'default nil - ;; :font "Inconsolata Medium-12:hinting=true:autohint=true") - ;; (set-face-attribute 'fixed-pitch nil - ;; :font "Inconsolata Medium-12:hinting=true:autohint=true") - (set-face-attribute 'default nil - :font "Source Code Pro Medium-10.5") - (set-face-attribute 'fixed-pitch nil - :font "Source Code Pro Medium-10.5") - (set-face-attribute 'mode-line nil - :box '(:line-width 2 :style released-button) - :background grey - :inherit 'fixed-pitch))))) - -(use-package delight - :ensure t - :defer 0.5) - -(use-package minibuffer - :defer t - :custom - (read-file-name-completion-ignore-case t)) - -(use-package files - :bind - ("C-c f ." . find-file) - :custom - (make-backup-files nil) - ;; Insert newline at the end of files. - ;; (require-final-newline t) - ;; Open read-only file buffers in view-mode, to get `q' for quit. - (view-read-only t)) - -(use-package ffap - :bind - ("C-c f p" . find-file-at-point)) - -(use-package find-func - :bind - ("C-c f l" . find-library)) - -(use-package frame - :bind - ("C-c F m" . make-frame-command) - ("C-c F d" . delete-frame)) - -(use-package window - :defer t - :custom - (split-width-threshold 140)) - -(use-package text-mode - :mode "\\(README.*\\|COMMIT_EDITMSG$\\)") - -(use-package conf-mode - :mode "\\.*rc$") - -(use-package sh-script - :mode ("\\.bashrc$" . sh-mode)) - -(use-package novice - :defer t - :config - (setq disabled-command-function nil)) - -(use-package autorevert - :defer 0.1 - :custom - ;; (auto-revert-verbose nil) - (global-auto-revert-non-file-buffers nil) - :config + mode-line-format + (mapcar + (lambda (x) + (if (and (stringp x) + (or (string= x " ") + (string= x " "))) + " " + x)) + mode-line-format) + mode-line-buffer-identification + (propertized-buffer-identification "%10b"))) + +;; Fonts and types. +(when (display-graphic-p) + (set-fontset-font t 'arabic "Sahel WOL") + (let ((emoji-font "Apple Color Emoji")) + (when (member emoji-font (font-family-list)) + (set-fontset-font + t 'emoji `(,emoji-font . "iso10646-1") nil 'prepend))) + (with-eval-after-load 'faces + (let ((grey "#e7e7e7")) + (set-face-attribute 'default nil + :font "Source Code Pro Medium-10.5") + (set-face-attribute 'fixed-pitch nil + :font "Source Code Pro Medium-10.5") + (set-face-attribute 'mode-line nil + :box '(:line-width 2 :style released-button) + :background grey + :inherit 'fixed-pitch)))) + +(when (display-graphic-p) + ;; Too easy to accidentally suspend (freeze) Emacs GUI. + (b/keymap-global-unset "C-z")) +(b/keymap-global-set "C-c e b" #'eval-buffer) +(b/keymap-global-set "C-c e r" #'eval-region) + +(with-eval-after-load 'minibuffer + (setopt read-file-name-completion-ignore-case t)) + +(with-eval-after-load 'files + (setopt + make-backup-files nil + ;; Insert newline at the end of files. + ;; require-final-newline t + ;; Open read-only file buffers in view-mode, to get `q' for quit. + view-read-only t) + (add-to-list + 'auto-mode-alist '("\\(README.*\\|COMMIT_EDITMSG$\\)" . text-mode)) + (add-to-list 'auto-mode-alist '("\\.*rc$" . conf-mode)) + (add-to-list 'auto-mode-alist '("\\.bashrc$" . sh-mode))) +(b/keymap-global-set "C-c f ." #'find-file) + +;; `ffap' +(b/keymap-global-set "C-c f p" #'find-file-at-point) + +;; `find-func' +(b/keymap-global-set "C-c f l" #'find-library) + +;; `frame' +(b/keymap-global-set "C-c F m" #'make-frame-command) +(b/keymap-global-set "C-c F d" #'delete-frame) + +(with-eval-after-load 'window + (setopt split-width-threshold 140)) + +;; `novice' +(setq disabled-command-function nil) + +(run-with-idle-timer 0.1 nil #'require 'autorevert) +(with-eval-after-load 'autorevert + (setopt + ;; auto-revert-verbose nil + global-auto-revert-non-file-buffers nil) (global-auto-revert-mode 1)) -(use-package time - :defer 0.1 - :bind - ("C-c e i" . emacs-init-time) - ("C-c e u" . emacs-uptime) - :custom - (display-time-default-load-average nil) - (display-time-format " %a %Y-%m-%d %-l:%M%P") - (display-time-mail-icon - '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center)) - (display-time-use-mail-icon t) - :config +(run-with-idle-timer 0.1 nil #'require 'time) +(with-eval-after-load 'time (setopt + display-time-default-load-average nil + display-time-format " %a %Y-%m-%d %-l:%M%P" + display-time-mail-icon + '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center) + display-time-use-mail-icon t zoneinfo-style-world-list `(,@zoneinfo-style-world-list ("Etc/UTC" "UTC") @@ -181,20 +141,21 @@ ("Australia/Melbourne" "Melbourne"))) (unless (display-graphic-p) (display-time-mode 1))) +(b/keymap-global-set "C-c e i" #'emacs-init-time) +(b/keymap-global-set "C-c e u" #'emacs-uptime) (defvar b/battery-format "%p%b %t") -(use-package battery - ;; :if (not (display-graphic-p)) - :defer 0.1 - :custom - (battery-mode-line-format (format " [%s]" b/battery-format))) - -(use-package winner - :defer 0.5 - :config +(run-with-idle-timer 0.1 nil #'require 'battery) +(with-eval-after-load 'battery + (setopt battery-mode-line-format (format " [%s]" b/battery-format)) + ;; (display-battery-mode -1) + ) + +(run-with-idle-timer 0.5 nil #'require 'winner) +(with-eval-after-load 'winner (winner-mode 1) (when (featurep 'exwm) - ;; Prevent a bad interaction between EXWM and winner-mode, where + ;; prevent a bad interaction between EXWM and winner-mode, where ;; sometimes closing a window (like closing a terminal after ;; entering a GPG password via pinentry-gnome3's floating window) ;; results in a dead frame somewhere and effectively freezes EXWM. @@ -206,76 +167,64 @@ (when (frame-live-p (car args)) (apply orig-fun args)))))) -(use-package windmove - :defer 0.5 - :custom - (windmove-wrap-around t) - :bind - ("M-H" . windmove-left) - ("M-L" . windmove-right) - ("M-K" . windmove-up) - ("M-J" . windmove-down)) - -(use-package isearch - :defer t - :custom - (isearch-allow-scroll t) - (isearch-lazy-count t) - ;; Match non-ASCII variants during search - (search-default-mode #'char-fold-to-regexp)) - -(use-package vc - :bind - ("C-x v C-=" . vc-ediff)) - -(use-package vc-git - :defer t - :custom - ;; (vc-git-show-stash 0) - (vc-git-print-log-follow t)) - -(use-package ediff - :defer t - :custom - (ediff-window-setup-function #'ediff-setup-windows-plain) - (ediff-split-window-function #'split-window-horizontally)) - -(use-package face-remap - :disabled - :custom - ;; Gentler font scaling. - (text-scale-mode-step 1.05)) - -(use-package mwheel - :defer 0.4 - :custom - (mouse-wheel-scroll-amount '(1 ((shift) . 1))) ; one line at a time - (mouse-wheel-progressive-speed nil) ; don't accelerate scrolling - (mouse-wheel-follow-mouse t)) ; scroll window under mouse - -(use-package pixel-scroll - :defer 0.4 - :config +(run-with-idle-timer 0.5 nil #'require 'windmove) +(with-eval-after-load 'windmove + (setopt windmove-wrap-around t) + (b/keymap-global-set "M-H" #'windmove-left) + (b/keymap-global-set "M-L" #'windmove-right) + (b/keymap-global-set "M-K" #'windmove-up) + (b/keymap-global-set "M-J" #'windmove-down)) + +(with-eval-after-load 'isearch + (setopt + isearch-allow-scroll t + isearch-lazy-count t + ;; Match non-ASCII variants during search + search-default-mode #'char-fold-to-regexp)) + +;; `vc' +(b/keymap-global-set "C-x v C-=" #'vc-ediff) + +(with-eval-after-load 'vc-git + (setopt + ;; vc-git-show-stash 0 + vc-git-print-log-follow t)) + +(with-eval-after-load 'ediff + (setopt + ediff-window-setup-function #'ediff-setup-windows-plain + ediff-split-window-function #'split-window-horizontally)) + +;; (with-eval-after-load 'face-remap +;; (setopt +;; ;; Gentler font resizing. +;; text-scale-mode-step 1.05)) + +(run-with-idle-timer 0.4 nil #'require 'mwheel) +(with-eval-after-load 'mwheel + (setopt + mouse-wheel-scroll-amount '(1 ((shift) . 1)) ; one line at a time + mouse-wheel-progressive-speed nil ; don't accelerate scrolling + mouse-wheel-follow-mouse t)) ; scroll window under mouse + +(run-with-idle-timer 0.4 nil #'require 'pixel-scroll) +(with-eval-after-load 'pixel-scroll (pixel-scroll-mode 1)) -(use-package epg-config - :defer t - :custom - (epg-gpg-program (executable-find "gpg")) - ;; Ask for GPG passphrase in minibuffer. - ;; Will fail if gpg >= 2.1 is not available. - (epg-pinentry-mode 'loopback)) - -(use-package auth-source - :disabled - :custom - (auth-sources '("~/.authinfo.gpg")) - (authinfo-hidden - (regexp-opt '("password" "client-secret" "token")))) - -(use-package info - :defer t - :config +(with-eval-after-load 'epg-config + (setopt + epg-gpg-program (executable-find "gpg") + ;; Ask for GPG passphrase in minibuffer. + ;; Will fail if gpg >= 2.1 is not available. + epg-pinentry-mode 'loopback)) + +;; (with-eval-after-load 'auth-source +;; (setopt +;; auth-sources '("~/.authinfo.gpg") +;; authinfo-hidden +;; (regexp-opt '("password" "client-secret" "token")))) + +(with-eval-after-load 'info (setq Info-directory-list `(,@Info-directory-list @@ -283,71 +232,48 @@ (convert-standard-filename "info/") source-directory) "/usr/share/info/"))) -(use-package ielm - :bind - ("C-c i" . ielm)) +;; `ielm' +(b/keymap-global-set "C-c i" #'ielm) + +(run-with-idle-timer 0.2 nil #'require 'recentf) +(with-eval-after-load 'recentf + (setopt recentf-max-saved-items 2000) + (recentf-mode 1) -(use-package recentf - ;; recently opened files - :defer 0.2 - :init (defun b/recentf-open () "Use `completing-read' to \\[find-file] a recent file." (interactive) (find-file (completing-read "Find recent file: " recentf-list))) - :bind - ("C-c f r" . b/recentf-open) - :custom - (recentf-max-saved-items 2000) - :config - (recentf-mode 1)) - -(use-package help - :defer t - :custom - (help-window-select t) - :config - (temp-buffer-resize-mode 1)) - -(use-package help-mode - :bind - (:map - help-mode-map - ("p" . backward-button) - ("n" . forward-button) - ("b" . help-go-back) - ("f" . help-go-forward))) - -(use-package help-fns - :bind - ("C-c h F" . describe-face)) - -(use-package doc-view - :bind - (:map - doc-view-mode-map - ("M-RET" . image-previous-line))) - -(use-package man - :defer t - :custom - (Man-width 80)) - -(use-package shr - :defer t - :custom - (shr-max-width 80)) - -(use-package mule-cmds - :defer t - :preface (provide 'mule-cmds) - :custom - (default-input-method "farsi-isiri-9147")) - -(use-package tramp - :defer t - :config + (b/keymap-global-set "C-c f r" #'b/recentf-open)) + +(with-eval-after-load 'help + (temp-buffer-resize-mode 1) + (setopt help-window-select t)) + +(with-eval-after-load 'help-mode + (let ((m help-mode-map)) + (b/keymap-set m "p" #'backward-button) + (b/keymap-set m "n" #'forward-button) + (b/keymap-set m "b" #'help-go-back) + (b/keymap-set m "f" #'help-go-forward))) + +;; `help-fns' +(b/keymap-global-set "C-c h F" #'describe-face) + +(with-eval-after-load 'doc-view + (b/keymap-set doc-view-mode-map "M-RET" #'image-previous-line)) + +(with-eval-after-load 'man + (setopt Man-width 80)) + +(with-eval-after-load 'shr + (setopt shr-max-width 80)) + +(with-eval-after-load 'mule-cmds + (setopt default-input-method "farsi-isiri-9147")) + +(with-eval-after-load 'tramp (tramp-set-completion-function "ssh" (append (tramp-get-completion-function "ssh") @@ -356,104 +282,75 @@ "~/.ssh/config.d/" 'full directory-files-no-dot-files-regexp))))) -(use-package eldoc - ;; Display Lisp objects at point in the echo area. - :defer t - :custom - (eldoc-minor-mode-string " eldoc") - :config +;; Display Lisp objects at point in the echo area. +(with-eval-after-load 'eldoc + (setopt eldoc-minor-mode-string " eldoc") (global-eldoc-mode 1)) -(use-package paren - ;; Highlight matching parens. - :defer 0.2 - :config +;; Highlight matching parens. +(run-with-idle-timer 0.2 nil #'require 'paren) +(with-eval-after-load 'paren (show-paren-mode 1)) -(use-package simple - :delight - (auto-fill-function " f") - :hook - ((text-mode tex-mode) . auto-fill-mode) - :custom - ;; See `bandali-gnus' for my Gnus configuration. - (mail-user-agent 'gnus-user-agent) - (read-mail-command #'gnus) - ;; Save what I copy into clipboard from other applications into - ;; Emacs' kill-ring, which would allow me to still be able to - ;; easily access it in case I kill (cut or copy) something else - ;; inside Emacs before yanking (pasting) what I'd originally - ;; intended to. - (save-interprogram-paste-before-kill t) - :config +(with-eval-after-load 'simple + (setopt + ;; See `bandali-gnus' for my Gnus configuration. + mail-user-agent 'gnus-user-agent + read-mail-command #'gnus + ;; Save what I copy into clipboard from other applications into + ;; Emacs' kill-ring, which would allow me to still be able to + ;; easily access it in case I kill (cut or copy) something else + ;; inside Emacs before yanking (pasting) what I'd originally + ;; intended to. + save-interprogram-paste-before-kill t) (column-number-mode 1) (line-number-mode 1)) +(add-hook 'text-mode-hook #'auto-fill-mode) +(add-hook 'tex-mode-hook #'auto-fill-mode) -(use-package savehist - ;; Save minibuffer history. - :defer 0.2 - :config +;; Save minibuffer history. +(run-with-idle-timer 0.2 nil #'require 'savehist) +(with-eval-after-load 'savehist (savehist-mode 1) (add-to-list 'savehist-additional-variables 'kill-ring)) -(use-package saveplace - ;; Automatically save place in files. - :defer 0.2 - :config +;; Automatically save place in files. +(run-with-idle-timer 0.2 nil #'require 'saveplace nil 'noerror) +(with-eval-after-load 'saveplace (save-place-mode 1)) -(use-package flyspell - :defer t - :custom - (flyspell-mode-line-string " fly") - :hook - ((text-mode tex-mode) . flyspell-mode)) - -(use-package abbrev - :delight - :hook - (text-mode . abbrev-mode)) - -(use-package eww - :bind - ("C-c e w" . eww) - :custom - (eww-download-directory +(with-eval-after-load 'flyspell + (setopt flyspell-mode-line-string " fly")) +(add-hook 'text-mode-hook #'flyspell-mode) +(add-hook 'tex-mode-hook #'flyspell-mode) + +;; `abbrev' +(add-hook 'text-mode-hook #'abbrev-mode) + +(with-eval-after-load 'eww + (setopt + eww-download-directory (file-name-as-directory (getenv "XDG_DOWNLOAD_DIR")))) +(b/keymap-global-set "C-c e w" #'eww) -(use-package display-fill-column-indicator - :defer 0.2 - :config +(run-with-idle-timer + 0.2 nil #'require 'display-fill-column-indicator nil 'noerror) +(with-eval-after-load 'display-fill-column-indicator (global-display-fill-column-indicator-mode 1)) -(use-package completion-preview - ;; :if (package-installed-p 'completion-preview) - :if (version<= "30" emacs-version) - :delight " cprev" - :bind - (:map - completion-preview-active-mode-map - ("M-n" . completion-preview-next-candidate) - ("M-p" . completion-preview-prev-candidate) - ("M-i" . completion-preview-insert)) - :hook - ((prog-mode text-mode comint-mode) . completion-preview-mode)) - -(use-package version - :bind - ("C-c e v" . emacs-version)) - -(use-package bandali-utils - :bind - ("C-c d" . b/duplicate-line-or-region) - ("C-c j" . b/join-line-top) - ("C-S-j" . b/join-line-top) - ("C-c s c" . b/*scratch*) - ("C-c v" . b/invert-default-face) - ("C-c q" . b/unfill-paragraph-or-region) - (:map - text-mode-map - ("M-RET" . b/insert-asterism))) +(when (version<= "30" emacs-version) + ;; (package-installed-p 'completion-preview) + (with-eval-after-load 'completion-preview + (let ((m completion-preview-active-mode-map)) + (b/keymap-set m "M-p" #'completion-preview-prev-candidate) + (b/keymap-set m "M-n" #'completion-preview-next-candidate) + (b/keymap-set m "M-i" #'completion-preview-insert))) + (add-hook 'prog-mode-hook #'completion-preview-mode) + (add-hook 'text-mode-hook #'completion-preview-mode) + (add-hook 'comint-mode-hook #'completion-preview-mode)) + +;; `version' +(b/keymap-global-set "C-c e v" #'emacs-version) (provide 'bandali-essentials) ;;; bandali-essentials.el ends here -- cgit v1.2.3-60-g2f50