Files
emacs/settings/pre-settings.el
2025-08-12 17:19:27 +02:00

634 lines
23 KiB
EmacsLisp
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; pre-settings.el --- Summary -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
;; count startup time
(defun display-startup-time ()
"Display the startup time and number of garbage collections."
(message "Emacs init loaded in %.2f seconds (Full emacs-startup: %.2fs) with %d garbage collections."
(float-time (time-subtract after-init-time before-init-time))
(time-to-seconds (time-since before-init-time))
gcs-done))
(add-hook 'emacs-startup-hook #'display-startup-time 100)
;;
;; functions
;;
(defun my-font-installed-p (font-name)
"Check if font with FONT-NAME is available."
(when (find-font (font-spec :name "all-the-icons")) t))
;;
;; variables
;;
(defvar running-on-windows
(memq system-type '(windows-nt cygwin32 cygwin))
"Non-nil if and only if we're running on Windows.
Both Win32 and Cygwin count.")
;; https://stackoverflow.com/questions/60922620/shell-script-to-check-if-running-in-windows-when-using-wsl
(defvar running-on-windows-wsl
(string-equal
(replace-regexp-in-string
"[ \n]+$" ""
(shell-command-to-string
"uname -a | sed -n 's/.*\\( *Microsoft *\\).*/\\1/ip'"))
"Microsoft"))
(defvar my-dbusp
(and (boundp 'dbus-compiled-version) ;; t on WSL Debian machine
(if (require 'dbus) (dbus-ping :session "org.freedesktop.Notifications"))) ;; is not enough
"Check if DBus is available.")
;;; Before package
;; 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))
;;; Minibuffer
;; Allow nested minibuffers
(setq enable-recursive-minibuffers t)
;; 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)
;;; 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)
;;; Show-paren
(use-package paren
;; highlight parentheses when the cursor is next to them
:config
(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)
(show-paren-mode 1))
;;; Misc
(setq custom-buffer-done-kill t)
(setq whitespace-line-column nil) ; Use the value of `fill-column'.
;; Can be activated with `display-line-numbers-mode'
(setq-default display-line-numbers-width 3)
(setq-default display-line-numbers-widen t)
(setq truncate-string-ellipsis "")
;; Disable truncation of printed s-expressions in the message buffer
(setq eval-expression-print-length nil
eval-expression-print-level nil)
;; Position underlines at the descent line instead of the baseline.
(setq x-underline-at-descent-line t)
(use-package tramp
:defer t
:config
;; tramp-cache.el
(setq tramp-persistency-file-name (concat user-cache-directory "tramp"))
;; Enable full-featured Dirvish over TRAMP on ssh connections
;; https://www.gnu.org/software/tramp/#Improving-performance-of-asynchronous-remote-processes
(connection-local-set-profile-variables
'remote-direct-async-process
'((tramp-direct-async-process . t)))
(connection-local-set-profiles
'(:application tramp :protocol "ssh")
'remote-direct-async-process)
;; Tips to speed up connections
(setq tramp-verbose 1)
(setq tramp-chunksize 2000)
(setq tramp-ssh-controlmaster-options nil)
;;
(setq tramp-completion-reread-directory-timeout 50)
(setq remote-file-name-inhibit-cache 50) )
;; 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)
;; Disable auto-adding a new line at the bottom when scrolling.
(setq next-line-add-newlines nil)
;;; 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 so that operations are conducted from the file's directory
(setq find-file-visit-truename t
vc-follow-symlinks t)
;; Prefer vertical splits over horizontal ones
(setq split-width-threshold 170
split-height-threshold nil)
;;; Buffers
(setq uniquify-buffer-name-style 'forward)
(use-package uniquify
:defer t
:config
(setq uniquify-buffer-name-style 'forward)) ;; forward: bar/mumble/name insead of post-forward-angle-brackets: name<bar/mumble>
;;; 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
;;; Auto save
;; Avoid backups or lockfiles to prevent creating world-readable copies of files
(setq create-lockfiles nil)
(setq make-backup-files nil)
;; by default backup files are saved in the current directory, ending with ~
;; instead stashes them all in
(let ((backup-dir (concat user-cache-directory "backups"))
(auto-saves-dir (concat user-cache-directory "auto-saves/")))
(dolist (dir (list backup-dir auto-saves-dir))
(when (not (file-directory-p dir))
(make-directory dir t)))
(setq backup-directory-alist `(("." . ,backup-dir)))
(setq auto-save-file-name-transforms `((".*" ,auto-saves-dir t)))
(setq auto-save-list-file-prefix (concat auto-saves-dir ".saves-"))
(setq tramp-backup-directory-alist `((".*" . ,backup-dir)))
(setq tramp-auto-save-directory auto-saves-dir) )
;; backup
(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)
;; 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-default nil)
(setq auto-save-no-message t)
;; Do not auto-disable auto-save after deleting large chunks of
;; text.
(setq auto-save-include-big-deletions 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)
;;; VC
(setq vc-git-print-log-follow t)
(setq vc-make-backup-files nil) ; Do not backup version controlled files
(setq vc-git-diff-switches '("--histogram")) ; Faster algorithm for diffing.
;;; 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.
(setq revert-without-query (list ".") ; Do not prompt
auto-revert-stop-on-user-input nil
auto-revert-verbose nil) ; All the "reverting buffer foo" messages are _really_ distracting.
;; 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
;; just as the docs warn, this can really make Emacs sluggish.
(if running-on-windows
(if (fboundp 'lwarn)
(lwarn
'global-auto-revert-mode
:warning
"`global-auto-revert-mode' is turned on. It's nifty,
but it's REALLY SLOW when you have buffers that are visiting
remote files. And despite its documentation, it does NOT ignore
those files, if you're using windows, and the file name begins
with a drive letter and a colon."))
(setq global-auto-revert-non-file-buffers t))
(global-auto-revert-mode 1)
;;; recentf
;; `recentf' is an that maintains a list of recently accessed files.
(use-package recentf
:config
;;(global-set-key "\C-x\ \C-r" 'recentf-open-files) ;; see completion-settings ivy counsel
(setq recentf-save-file (locate-user-emacs-file ".cache/recentf" "recentf"))
(setq recentf-max-saved-items 1000) ; default is 20
(setq recentf-max-menu-items 30) ; default is 10
(setq recentf-auto-cleanup 'never) ; disable before we start recentf! Set to never bc otherwise it tries to read also tramp (remote) files
(setq recentf-exclude
(list "^/\\(?:ssh\\|su\\|sudo\\)?:"
(recentf-expand-file-name user-cache-directory)))
(run-with-idle-timer (* 10 60) t 'recentf-save-list)
(recentf-mode 1) )
;;; saveplace
;; Enables Emacs to remember the last location within a file upon reopening.
(setq save-place-file (concat user-cache-directory "places"))
(setq save-place-limit 600)
(save-place-mode 1)
;;; savehist
;; `savehist-mode' is an Emacs feature that preserves the minibuffer history
;; between sessions.
(setq history-length 500) ;; Since all lists will be truncated when saved, it is important to have a high default history length
(setq savehist-save-minibuffer-history t) ;; Default
(setq savehist-additional-variables
'(kill-ring ; clipboard
register-alist ; macros
mark-ring global-mark-ring ; marks
search-ring regexp-search-ring)) ; searches
;; minibuffer history, e.g. M-x with amex
(setq savehist-file (concat user-cache-directory "history"))
(savehist-mode)
;;; Frames and windows
;; ┌────────────── Frame width ───────────────┐
;; ┌────── Window width ──────┐
;; ┌ ┌──────────────────────────────────────────┐
;; │ │ ┌──────────────────────────────────────┐ │
;; │ │ │ Header line │ │
;; │ ┌ │ ├───┬─┬────────────────────────┬─┬─┬───┤ │
;; F │ W │ │ │ │●┼─ Left fringe ┊ │ │ │●┼── Frame border
;; r │ i │ │ │ ●─┼─┼─ Left margin ┊ │ │ ●─┼─┼── Right margin
;; a │ n │ │ │ │ │ ┊ │●┼───┼─┼── Right fringe
;; m │ d │ │ │ │ │ ┊●┼─┼───┼─┼── Display column
;; e │ o │ │ │ │ │ ┊ │ │ │ │
;; │ w │ │ │ │ │ ┊ │ │ │ │
;; h │ │ │ │ │ │ Text area ┊ │ │ │ │
;; e │ h │ │ │ │ │ ┊ │ │ │ │
;; i │ e │ │ │ │ │ ┊ │ │ │ │
;; g │ i │ │ │ │ │ ┊ │ │ │ │
;; h │ g │ │ │ │ │ ┊ │ │ │ │
;; t │ h │ │ │ │ │ ┊ │ │ │ │
;; │ t │ │ │ │ │ ┊ │ │ │ │
;; │ └ │ ├───┴─┴────────────────────────┴─┴─┴───┤ │
;; │ │ │ Mode line │ │
;; │ │ ├───┬─┬──────────────────────────┬─┬───┤ │
;; │ │ │ │ │ Minibuffer / Echo area │ │ │ │
;; │ │ └───┴─┴──────────────────────────┴─┴───┘ │
;; └ └──────────────────────────────────────────┘
;; └─┬─┘ └┬┘ └┬┘
;; Margin width Fringe width (pixels) ┘ │
;; (chars) Border width (pixels) ┘
;; However, do not resize windows pixelwise, as this can cause crashes in some
;; cases when resizing too many windows at once or rapidly.
(setq window-resize-pixelwise nil)
(setq resize-mini-windows 'grow-only)
(use-package frame
:config
;; The native border "uses" a pixel of the fringe on the rightmost
;; splits, whereas `window-divider-mode' does not.
(setq window-divider-default-right-width 2)
(setq window-divider-default-bottom-width 6)
(setq window-divider-default-places 'right-only)
(window-divider-mode 1))
;;; Fontification
;; Disable fontification during user input to reduce lag in large buffers.
;; Also helps marginally with scrolling performance.
(setq redisplay-skip-fontification-on-input t)
;;; 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)
;; If `scroll-conservatively' is set above 100, the window is never
;; automatically recentered, which decreases the time spend recentering.
(setq scroll-conservatively 101)
;; 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)
;; Number of lines of margin at the top and bottom of a window.
(setq scroll-margin 0)
;; Number of lines of continuity when scrolling by screenfuls.
(setq next-screen-context-lines 0)
;; Horizontal scrolling
(setq hscroll-margin 2
hscroll-step 1)
;;; Mouse
(setq mouse-yank-at-point nil)
;; Emacs 29
(when (memq 'context-menu my-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)
;; Do not extend the cursor to fit wide characters
(setq x-stretch-cursor nil)
;; Reduce rendering/line scan work by not rendering cursors or regions in
;; non-focused windows.
(setq-default cursor-in-non-selected-windows nil)
(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)
(setq-default left-fringe-width 8)
(setq-default right-fringe-width 8)
;; Disable visual indicators in the fringe for buffer boundaries and empty lines
(setq-default indicate-buffer-boundaries nil)
(setq-default indicate-empty-lines nil)
;; 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 2)
;; 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)
;;; Modeline
;; Makes Emacs omit the load average information from the mode line.
(setq display-time-default-load-average nil)
;;; Filetype (python sh ...)
(setq sh-indent-after-continuation 'always)
;;; ls-lisp
(use-package ls-lisp
:defer t
:config
(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
;; 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)
(setq eglot-autoshutdown t) ; Shut down server after killing last managed buffer
;; Activate Eglot in cross-referenced non-project files
(setq eglot-extend-to-xref t)
;; Eglot optimization
(if my-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)))
(setq eglot-report-progress my-debug) ; Prevent minibuffer spam
;;; Flymake
(setq flymake-show-diagnostics-at-end-of-line nil)
;; Disable wrapping around when navigating Flymake errors.
(setq flymake-wrap-around nil)
;;; hl-line-mode
;; Restrict `hl-line-mode' highlighting to the current window, reducing visual
;; clutter and slightly improving `hl-line-mode' 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
(setq flyspell-issue-welcome-flag nil)
;; Improves flyspell performance by preventing messages from being displayed for
;; each word when checking the entire buffer.
(setq flyspell-issue-message-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 `abbrev_defs` 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 (concat user-cache-directory "abbrev_defs"))
(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))
(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 upcase-region downcase-region
list-threads erase-buffer scroll-left
dired-find-alternate-file set-goal-column))
(put cmd 'disabled nil))
;;;
;; omit warnings like: /opt/emacs-conf/lisp/org/oc-basic.el: Warning: buffer-substring is an obsolete generalized variable.
(setq byte-compile-warnings nil)
(use-package delight
:defer t) ;; used for use-package :delight, see delight-delighted-modes, defer b/c of awesome-tray
;; add local icon folder to the image-load-path
(when (featurep 'image)
(add-to-list 'image-load-path (concat config-dir "icon/")))
(use-package cus-edit
:config
(setq custom-buffer-done-kill t)
(load custom-file t t))
(provide 'pre-settings)
;;; pre-settings.el ends here