Files
emacs/settings/pre-settings.el
2025-08-11 20:13:14 +02:00

415 lines
15 KiB
EmacsLisp
Raw 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)))
;;;
;; 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