From 04126e9fda050fa753ddc22511e3c3f8dc275f7a Mon Sep 17 00:00:00 2001 From: Mitch Taylor Date: Sun, 22 Mar 2026 22:07:22 -0300 Subject: initial commit --- files/emacs/.emacs.d/init.el | 578 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 578 insertions(+) create mode 100644 files/emacs/.emacs.d/init.el (limited to 'files/emacs/.emacs.d/init.el') diff --git a/files/emacs/.emacs.d/init.el b/files/emacs/.emacs.d/init.el new file mode 100644 index 0000000..fc25abe --- /dev/null +++ b/files/emacs/.emacs.d/init.el @@ -0,0 +1,578 @@ +;;; init.el --- Init -*- lexical-binding: t; -*- + +;; Author: James Cherti +;; URL: https://github.com/jamescherti/minimal-emacs.d +;; Package-Requires: ((emacs "29.1")) +;; Keywords: maint +;; Version: 1.4.1 +;; SPDX-License-Identifier: GPL-3.0-or-later + +;;; Commentary: +;; The minimal-emacs.d project is a lightweight and optimized Emacs base +;; (init.el and early-init.el) that gives you full control over your +;; configuration. It provides better defaults, an optimized startup, and a clean +;; foundation for building your own vanilla Emacs setup. +;; +;; Building the minimal-emacs.d init.el and early-init.el was the result of +;; extensive research and testing to fine-tune the best parameters and +;; optimizations for an Emacs configuration. +;; +;; Do not modify this file; instead, modify pre-init.el or post-init.el. + +;;; Code: + +;;; Load pre-init.el + +(if (fboundp 'minimal-emacs-load-user-init) + (when minimal-emacs-load-pre-init + (minimal-emacs-load-user-init "pre-init.el")) + (error "The early-init.el file failed to load")) + +;;; Before package + +;; The initial buffer is created during startup even in non-interactive +;; sessions, and its major mode is fully initialized. Modes like `text-mode', +;; `org-mode', or even the default `lisp-interaction-mode' load extra packages +;; and run hooks, which can slow down startup. +;; +;; Using `fundamental-mode' for the initial buffer to avoid unnecessary +;; startup overhead. +(setq initial-major-mode 'fundamental-mode + initial-scratch-message nil) + +;; Set-language-environment sets default-input-method, which is unwanted. +(setq default-input-method nil) + +;; Ask the user whether to terminate asynchronous compilations on exit. +;; This prevents native compilation from leaving temporary files in /tmp. +(setq native-comp-async-query-on-exit t) + +;; Allow for shorter responses: "y" for yes and "n" for no. +(setq read-answer-short t) +(if (boundp 'use-short-answers) + (setq use-short-answers t) + (advice-add 'yes-or-no-p :override #'y-or-n-p)) + +;;; Undo/redo + +(setq undo-limit (* 13 160000) + undo-strong-limit (* 13 240000) + undo-outer-limit (* 13 24000000)) + +;;; package.el + +(when (and (bound-and-true-p minimal-emacs-package-initialize-and-refresh) + (not (bound-and-true-p byte-compile-current-file)) + (not (or (fboundp 'straight-use-package) + (fboundp 'elpaca)))) + ;; Initialize and refresh package contents again if needed + (package-initialize) + (unless package-archive-contents + (package-refresh-contents)) + (when (and (version< emacs-version "29.1") + (not (package-installed-p 'use-package))) + (package-install 'use-package)) + (require 'use-package)) + +;;; Minibuffer + +(setq enable-recursive-minibuffers t) ; Allow nested minibuffers + +;; Keep the cursor out of the read-only portions of the.minibuffer +(setq minibuffer-prompt-properties + '(read-only t intangible t cursor-intangible t face minibuffer-prompt)) +(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) + +;;; Display and user interface + +;; By default, Emacs "updates" its ui more often than it needs to +(setq which-func-update-delay 1.0) +(setq idle-update-delay which-func-update-delay) ;; Obsolete in >= 30.1 + +(defalias #'view-hello-file #'ignore) ; Never show the hello file + +;; No beeping or blinking +(setq visible-bell nil) +(setq ring-bell-function #'ignore) + +;; Position underlines at the descent line instead of the baseline. +(setq x-underline-at-descent-line t) + +(setq truncate-string-ellipsis "…") + +(setq display-time-default-load-average nil) ; Omit load average + +;;; Show-paren + +(setq show-paren-delay 0.1 + show-paren-highlight-openparen t + show-paren-when-point-inside-paren t + show-paren-when-point-in-periphery t) + +;;; Buffer management + +(setq custom-buffer-done-kill t) + +;; Disable auto-adding a new line at the bottom when scrolling. +(setq next-line-add-newlines nil) + +;; This setting forces Emacs to save bookmarks immediately after each change. +;; Benefit: you never lose bookmarks if Emacs crashes. +(setq bookmark-save-flag 1) + +(setq uniquify-buffer-name-style 'forward) + +(setq remote-file-name-inhibit-cache 50) + +;; Disable fontification during user input to reduce lag in large buffers. +;; Also helps marginally with scrolling performance. +(setq redisplay-skip-fontification-on-input t) + +;;; Misc + +(setq whitespace-line-column nil) ; Use the value of `fill-column'. + +;; Disable ellipsis when printing s-expressions in the message buffer +(setq eval-expression-print-length nil + eval-expression-print-level nil) + +;; This directs gpg-agent to use the minibuffer for passphrase entry +(setq epg-pinentry-mode 'loopback) + +;; By default, Emacs stores sensitive authinfo credentials as unencrypted text +;; in your home directory. Use GPG to encrypt the authinfo file for enhanced +;; security. +(setq auth-sources (list "~/.authinfo.gpg")) + +;;; `display-line-numbers-mode' + +(setq-default display-line-numbers-width 3) +(setq-default display-line-numbers-widen t) + +;;; imenu + +;; Automatically rescan the buffer for Imenu entries when `imenu' is invoked +;; This ensures the index reflects recent edits. +(setq imenu-auto-rescan t) + +;; Prevent truncation of long function names in `imenu' listings +(setq imenu-max-item-length 160) + +;;; Tramp + +(setq tramp-verbose 1) + +;;; Files + +;; Delete by moving to trash in interactive mode +(setq delete-by-moving-to-trash (not noninteractive)) +(setq remote-file-name-inhibit-delete-by-moving-to-trash t) + +;; Ignoring this is acceptable since it will redirect to the buffer regardless. +(setq find-file-suppress-same-file-warnings t) + +;; Resolve symlinks to avoid duplicate buffers +(setq find-file-visit-truename t + ;; Automatically follow a symlink to its source if that source is managed + ;; by a version control system, rather than asking for permission. + vc-follow-symlinks t) + +;; Prefer vertical splits over horizontal ones +(setq split-width-threshold 170 + split-height-threshold nil) + +;;; comint (general command interpreter in a window) + +(setq ansi-color-for-comint-mode t + comint-prompt-read-only t + comint-buffer-maximum-size 4096) + +;;; Compilation + +(setq compilation-ask-about-save nil + compilation-always-kill t + compilation-scroll-output 'first-error) + +;; Skip confirmation prompts when creating a new file or buffer +(setq confirm-nonexistent-file-or-buffer nil) + +;;; Backup files + +;; Disable the creation of lockfiles (e.g., .#filename). +;; Modern workflows rely on `global-auto-revert-mode' to handle external file +;; changes gracefully, making the restrictive nature of lockfiles unnecessary. +(setq create-lockfiles nil) + +;; Disable backup files (e.g., filename~). Note that `auto-save-default' +;; remains enabled by default. Even with `make-backup-files' backups disabled, +;; Emacs will still generate temporary recovery files (e.g., #filename#) for +;; unsaved buffers. This protects your active work from sudden crashes while +;; ensuring the file system is cleaned up immediately upon a successful save. +(setq make-backup-files nil) + +(setq backup-directory-alist + `(("." . ,(expand-file-name "backup" user-emacs-directory)))) +(setq tramp-backup-directory-alist backup-directory-alist) +(setq backup-by-copying-when-linked t) +(setq backup-by-copying t) ; Backup by copying rather renaming +(setq delete-old-versions t) ; Delete excess backup versions silently +(setq version-control t) ; Use version numbers for backup files +(setq kept-new-versions 5) +(setq kept-old-versions 5) + +;;; VC + +(setq vc-git-print-log-follow t) +(setq vc-git-diff-switches '("--histogram")) ; Faster algorithm for diffing. + +;;; Auto save + +;; Enable auto-save to safeguard against crashes or data loss. The +;; `recover-file' or `recover-session' functions can be used to restore +;; auto-saved data. +(setq auto-save-no-message t) + +(when noninteractive + ;; The command line interface + (setq enable-dir-local-variables nil) + (setq case-fold-search nil)) + +;; Do not auto-disable auto-save after deleting large chunks of +;; text. +(setq auto-save-include-big-deletions t) + +(setq auto-save-list-file-prefix + (expand-file-name "autosave/" user-emacs-directory)) +(setq tramp-auto-save-directory + (expand-file-name "tramp-autosave/" user-emacs-directory)) + +(setq auto-save-file-name-transforms + `(("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'" + ,(file-name-concat auto-save-list-file-prefix "tramp-\\2-") sha1) + ("\\`/\\([^/]+/\\)*\\([^/]+\\)\\'" + ,(file-name-concat auto-save-list-file-prefix "\\2-") sha1))) + +;; Ensure the directory for auto-save session logs exists with restricted +;; permissions. +(when auto-save-default + (let ((auto-save-dir (file-name-directory auto-save-list-file-prefix))) + (unless (file-exists-p auto-save-dir) + (with-file-modes #o700 + (make-directory auto-save-dir t))))) + +;; Auto save options +(setq kill-buffer-delete-auto-save-files t) + +;; Remove duplicates from the kill ring to reduce clutter +(setq kill-do-not-save-duplicates t) + +;;; Auto revert +;; Auto-revert in Emacs is a feature that automatically updates the contents of +;; a buffer to reflect changes made to the underlying file. + +;; Revert other buffers (e.g, Dired) +(setq global-auto-revert-non-file-buffers t) +(setq global-auto-revert-ignore-modes '(Buffer-menu-mode)) ; Resolve issue #29 + +;;; recentf + +;; `recentf' is an that maintains a list of recently accessed files. +(setq recentf-max-saved-items 300) ; default is 20 +(setq recentf-max-menu-items 15) +(setq recentf-auto-cleanup 'mode) + +;;; saveplace + +;; Enables Emacs to remember the last location within a file upon reopening. +(setq save-place-file (expand-file-name "saveplace" user-emacs-directory)) +(setq save-place-limit 600) + +;;; savehist + +;; `savehist-mode' is an Emacs feature that preserves the minibuffer history +;; between sessions. +(setq history-length 300) +(setq savehist-additional-variables + '(register-alist ; macros + mark-ring global-mark-ring ; marks + search-ring regexp-search-ring)) ; searches + +;;; Frames and windows + +(setq resize-mini-windows 'grow-only) + +;; The native border "uses" a pixel of the fringe on the rightmost +;; splits, whereas `window-divider-mode' does not. +(setq window-divider-default-bottom-width 1 + window-divider-default-places t + window-divider-default-right-width 1) + +;;; Scrolling + +;; Enables faster scrolling. This may result in brief periods of inaccurate +;; syntax highlighting, which should quickly self-correct. +(setq fast-but-imprecise-scrolling t) + +;; Move point to top/bottom of buffer before signaling a scrolling error. +(setq scroll-error-top-bottom t) + +;; Keep screen position if scroll command moved it vertically out of the window. +(setq scroll-preserve-screen-position t) + +;; Emacs recenters the window when the cursor moves past `scroll-conservatively' +;; lines beyond the window edge. A value over 101 disables recentering; the +;; default (0) is too eager. Here it is set to 20 for a balanced behavior. +(setq scroll-conservatively 20) + +;; 1. Preventing automatic adjustments to `window-vscroll' for long lines. +;; 2. Resolving the issue of random half-screen jumps during scrolling. +(setq auto-window-vscroll nil) + +;; Horizontal scrolling +(setq hscroll-margin 2 + hscroll-step 1) + +;; Emacs 29 +(when (memq 'context-menu minimal-emacs-ui-features) + (when (and (display-graphic-p) (fboundp 'context-menu-mode)) + (add-hook 'after-init-hook #'context-menu-mode))) + +;;; Cursor + +;; The blinking cursor is distracting and interferes with cursor settings in +;; some minor modes that try to change it buffer-locally (e.g., Treemacs). +(when (bound-and-true-p blink-cursor-mode) + (blink-cursor-mode -1)) + +;; Don't blink the paren matching the one at point, it's too distracting. +(setq blink-matching-paren nil) + +;; Reduce rendering/line scan work by not rendering cursors or regions in +;; non-focused windows. +(setq highlight-nonselected-windows nil) + +;;; Text editing, indent, font, and formatting + +;; Avoid automatic frame resizing when adjusting settings. +(setq global-text-scale-adjust-resizes-frames nil) + +;; A longer delay can be annoying as it causes a noticeable pause after each +;; deletion, disrupting the flow of editing. +(setq delete-pair-blink-delay 0.03) + +;; Continue wrapped lines at whitespace rather than breaking in the +;; middle of a word. +(setq-default word-wrap t) + +;; Disable wrapping by default due to its performance cost. +(setq-default truncate-lines t) + +;; If enabled and `truncate-lines' is disabled, soft wrapping will not occur +;; when the window is narrower than `truncate-partial-width-windows' characters. +(setq truncate-partial-width-windows nil) + +;; Configure automatic indentation to be triggered exclusively by newline and +;; DEL (backspace) characters. +(setq-default electric-indent-chars '(?\n ?\^?)) + +;; Prefer spaces over tabs. Spaces offer a more consistent default compared to +;; 8-space tabs. This setting can be adjusted on a per-mode basis as needed. +(setq-default indent-tabs-mode nil + tab-width 4) + +;; Enable indentation and completion using the TAB key +(setq tab-always-indent 'complete) +(setq tab-first-completion 'word-or-paren-or-punct) + +;; Perf: Reduce command completion overhead. +(setq read-extended-command-predicate #'command-completion-default-include-p) + +;; Enable multi-line commenting which ensures that `comment-indent-new-line' +;; properly continues comments onto new lines. +(setq comment-multi-line t) + +;; Ensures that empty lines within the commented region are also commented out. +;; This prevents unintended visual gaps and maintains a consistent appearance. +(setq comment-empty-lines t) + +;; We often split terminals and editor windows or place them side-by-side, +;; making use of the additional horizontal space. +(setq-default fill-column 80) + +;; Disable the obsolete practice of end-of-line spacing from the typewriter era. +(setq sentence-end-double-space nil) + +;; According to the POSIX, a line is defined as "a sequence of zero or more +;; non-newline characters followed by a terminating newline". +(setq require-final-newline t) + +;; Eliminate delay before highlighting search matches +(setq lazy-highlight-initial-delay 0) + +;;; Filetype + +;; Do not notify the user each time Python tries to guess the indentation offset +(setq python-indent-guess-indent-offset-verbose nil) + +(setq sh-indent-after-continuation 'always) + +;;; Dired and ls-lisp + +(setq dired-free-space nil + dired-dwim-target t ; Propose a target for intelligent moving/copying + dired-deletion-confirmer 'y-or-n-p + dired-filter-verbose nil + dired-recursive-deletes 'top + dired-recursive-copies 'always + dired-vc-rename-file t + dired-create-destination-dirs 'ask + ;; Suppress Dired buffer kill prompt for deleted dirs + dired-clean-confirm-killing-deleted-buffers nil) + +;; This is a higher-level predicate that wraps `dired-directory-changed-p' +;; with additional logic. This `dired-buffer-stale-p' predicate handles remote +;; files, wdired, unreadable dirs, and delegates to dired-directory-changed-p +;; for modification checks. +(setq auto-revert-remote-files nil) +(setq dired-auto-revert-buffer 'dired-buffer-stale-p) + +;; dired-omit-mode +(setq dired-omit-verbose nil + dired-omit-files (concat "\\`[.]\\'")) + +(setq ls-lisp-verbosity nil) +(setq ls-lisp-dirs-first t) + +;;; Ediff + +;; Configure Ediff to use a single frame and split windows horizontally +(setq ediff-window-setup-function 'ediff-setup-windows-plain + ediff-split-window-function 'split-window-horizontally) + +;;; Help + +;; Enhance `apropos' and related functions to perform more extensive searches +(setq apropos-do-all t) + +;; Fixes #11: Prevents help command completion from triggering autoload. +;; Loading additional files for completion can slow down help commands and may +;; unintentionally execute initialization code from some libraries. +(setq help-enable-completion-autoload nil) +(setq help-enable-autoload nil) +(setq help-enable-symbol-autoload nil) +(setq help-window-select t) ;; Focus new help windows when opened + +;;; Eglot + +(setq eglot-report-progress minimal-emacs-debug) ; Prevent minibuffer spam +(setq eglot-autoshutdown t) ; Shut down after killing last managed buffer + +;; A setting of nil or 0 means Eglot will not block the UI at all, allowing +;; Emacs to remain fully responsive, although LSP features will only become +;; available once the connection is established in the background. +(setq eglot-sync-connect 0) + +;; Activate Eglot in cross-referenced non-project files +(setq eglot-extend-to-xref t) + +;; Eglot optimization +(if minimal-emacs-debug + (setq eglot-events-buffer-config '(:size 2000000 :format full)) + ;; This reduces log clutter to improves performance. + (setq jsonrpc-event-hook nil) + ;; Reduce memory usage and avoid cluttering *EGLOT events* buffer + (setq eglot-events-buffer-size 0) ; Deprecated + (setq eglot-events-buffer-config '(:size 0 :format short))) + +;;; Flymake + +(setq flymake-show-diagnostics-at-end-of-line nil) +(setq flymake-wrap-around nil) + +;;; hl-line-mode + +;; Highlighting the current window, reducing clutter and improving performance +(setq hl-line-sticky-flag nil) +(setq global-hl-line-sticky-flag nil) + +;;; icomplete + +;; Do not delay displaying completion candidates in `fido-mode' or +;; `fido-vertical-mode' +(setq icomplete-compute-delay 0.01) + +;;; flyspell + +;; Improves flyspell performance by preventing messages from being displayed for +;; each word when checking the entire buffer. +(setq flyspell-issue-message-flag nil) +(setq flyspell-issue-welcome-flag nil) + +;;; ispell + +;; In Emacs 30 and newer, disable Ispell completion to avoid annotation errors +;; when no `ispell' dictionary is set. +(setq text-mode-ispell-word-completion nil) + +(setq ispell-silently-savep t) + +;;; ibuffer + +(setq ibuffer-formats + '((mark modified read-only locked + " " (name 55 55 :left :elide) + " " (size 8 -1 :right) + " " (mode 18 18 :left :elide) " " filename-and-process) + (mark " " (name 16 -1) " " filename))) + +;;; xref + +;; Enable completion in the minibuffer instead of the definitions buffer +(setq xref-show-definitions-function 'xref-show-definitions-completing-read + xref-show-xrefs-function 'xref-show-definitions-completing-read) + +;;; abbrev + +;; Ensure the abbrev_defs file is stored in the correct location when +;; `user-emacs-directory' is modified, as it defaults to ~/.emacs.d/abbrev_defs +;; regardless of the change. +(setq abbrev-file-name (expand-file-name "abbrev_defs" user-emacs-directory)) + +(setq save-abbrevs 'silently) + +;;; dabbrev + +(setq dabbrev-upcase-means-case-search t) + +(setq dabbrev-ignored-buffer-modes + '(archive-mode image-mode docview-mode tags-table-mode + pdf-view-mode tags-table-mode)) + +(setq dabbrev-ignored-buffer-regexps + '(;; - Buffers starting with a space (internal or temporary buffers) + "\\` " + ;; Tags files such as ETAGS, GTAGS, RTAGS, TAGS, e?tags, and GPATH, + ;; including versions with numeric extensions like <123> + "\\(?:\\(?:[EG]?\\|GR\\)TAGS\\|e?tags\\|GPATH\\)\\(<[0-9]+>\\)?")) + +;;; Remove warnings from narrow-to-region, upcase-region... + +(dolist (cmd '(list-timers narrow-to-region narrow-to-page + upcase-region downcase-region + list-threads erase-buffer scroll-left + dired-find-alternate-file set-goal-column)) + (put cmd 'disabled nil)) + +;;; Load post init + +(when (and minimal-emacs-load-post-init + (fboundp 'minimal-emacs-load-user-init)) + (minimal-emacs-load-user-init "post-init.el")) + +(setq minimal-emacs--success t) + +;; Local variables: +;; byte-compile-warnings: (not obsolete free-vars) +;; End: + +;;; init.el ends here -- cgit v1.2.3