From a421cae494e8171fbb4d161d5ab7617d60bd3eb0 Mon Sep 17 00:00:00 2001 From: spl3g Date: Fri, 13 Sep 2024 11:48:20 +0300 Subject: fix(emacs): optimize startup --- home-manager/homeModules/emacs/early-init.el | 197 ++++++++++++++++++++++++++- 1 file changed, 194 insertions(+), 3 deletions(-) (limited to 'home-manager/homeModules/emacs/early-init.el') diff --git a/home-manager/homeModules/emacs/early-init.el b/home-manager/homeModules/emacs/early-init.el index c767bdc..ce8d960 100644 --- a/home-manager/homeModules/emacs/early-init.el +++ b/home-manager/homeModules/emacs/early-init.el @@ -1,6 +1,197 @@ +;;;; Optimisations from https://github.com/jamescherti/minimal-emacs.d + +;;; Garbage collection +(setq gc-cons-threshold most-positive-fixnum) + +(add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold (* 16 1024 1024)))) + +;;; Performance + +;; Prefer loading newer compiled files +(setq load-prefer-newer t) + +;; Increase how much is read from processes in a single chunk (default is 4kb). +(setq read-process-output-max (* 1024 1024)) ; 512kb + +;; Disable warnings from the legacy advice API. They aren't useful. +(setq ad-redefinition-action 'accept) + +(setq warning-suppress-types '((lexical-binding))) + +;; Don't ping things that look like domain names. +(setq ffap-machine-p-known 'reject) + +;; By default, Emacs "updates" its ui more often than it needs to +(setq idle-update-delay 1.0) + +;; Font compacting can be very resource-intensive, especially when rendering +;; icon fonts on Windows. This will increase memory usage. +(setq inhibit-compacting-font-caches t) + + +;; Disable warnings from the legacy advice API. They aren't useful. +(setq ad-redefinition-action 'accept) + +(setq warning-suppress-types '((lexical-binding))) + +;; Don't ping things that look like domain names. +(setq ffap-machine-p-known 'reject) + +;; By default, Emacs "updates" its ui more often than it needs to +(setq idle-update-delay 1.0) + +;; Font compacting can be very resource-intensive, especially when rendering +;; icon fonts on Windows. This will increase memory usage. +(setq inhibit-compacting-font-caches t) + + +;; Disable warnings from the legacy advice API. They aren't useful. +(setq ad-redefinition-action 'accept) + +(setq warning-suppress-types '((lexical-binding))) + +;; Don't ping things that look like domain names. +(setq ffap-machine-p-known 'reject) + +;; By default, Emacs "updates" its ui more often than it needs to +(setq idle-update-delay 1.0) + +;; Font compacting can be very resource-intensive, especially when rendering +;; icon fonts on Windows. This will increase memory usage. +(setq inhibit-compacting-font-caches t) + +(unless (daemonp) + (unless noninteractive + (progn + ;; Disable mode-line-format during init + (defun minimal-emacs--reset-inhibited-vars-h () + (setq-default inhibit-redisplay nil + ;; Inhibiting `message' only prevents redraws and + inhibit-message nil) + (redraw-frame)) + + (defvar minimal-emacs--default-mode-line-format mode-line-format + "Default value of `mode-line-format'.") + (setq-default mode-line-format nil) + + (defun minimal-emacs--startup-load-user-init-file (fn &rest args) + "Advice for startup--load-user-init-file to reset mode-line-format." + (let (init) + (unwind-protect + (progn + (apply fn args) ; Start up as normal + (setq init t)) + (unless init + ;; If we don't undo inhibit-{message, redisplay} and there's an + ;; error, we'll see nothing but a blank Emacs frame. + (minimal-emacs--reset-inhibited-vars-h)) + (unless (default-toplevel-value 'mode-line-format) + (setq-default mode-line-format + minimal-emacs--default-mode-line-format))))) + + (advice-add 'startup--load-user-init-file :around + #'minimal-emacs--startup-load-user-init-file)) + + ;; Without this, Emacs will try to resize itself to a specific column size + (setq frame-inhibit-implied-resize t) + + ;; A second, case-insensitive pass over `auto-mode-alist' is time wasted. + ;; No second pass of case-insensitive search over auto-mode-alist. + (setq auto-mode-case-fold nil) + + ;; Reduce *Message* noise at startup. An empty scratch buffer (or the + ;; dashboard) is more than enough, and faster to display. + (setq inhibit-startup-screen t + inhibit-startup-echo-area-message user-login-name) + (setq initial-buffer-choice nil + inhibit-startup-buffer-menu t + inhibit-x-resources t) + + ;; Disable bidirectional text scanning for a modest performance boost. + (setq-default bidi-display-reordering 'left-to-right + bidi-paragraph-direction 'left-to-right) + + ;; Give up some bidirectional functionality for slightly faster re-display. + (setq bidi-inhibit-bpa t) + + ;; Remove "For information about GNU Emacs..." message at startup + (advice-add #'display-startup-echo-area-message :override #'ignore) + + ;; Suppress the vanilla startup screen completely. We've disabled it with + ;; `inhibit-startup-screen', but it would still initialize anyway. + (advice-add #'display-startup-screen :override #'ignore) + + ;; Shave seconds off startup time by starting the scratch buffer in + ;; `fundamental-mode' + (setq initial-major-mode 'fundamental-mode + initial-scratch-message nil))) + +;;; Native compilation and Byte compilation + +(if (and (featurep 'native-compile) + (fboundp 'native-comp-available-p) + (native-comp-available-p)) + ;; Activate `native-compile' + (setq native-comp-jit-compilation t + package-native-compile t) + ;; Deactivate the `native-compile' feature if it is not available + (setq features (delq 'native-compile features))) + +;; Suppress compiler warnings and don't inundate users with their popups. +(setq native-comp-async-report-warnings-errors 'silent) + +;;; UI elements + +;; Disable startup screens and messages +(setq inhibit-splash-screen t) + + +(push '(menu-bar-lines . 0) default-frame-alist) +(unless (memq window-system '(mac ns)) + (setq menu-bar-mode nil)) + +(unless (daemonp) + (unless noninteractive + (when (fboundp 'tool-bar-setup) + ;; Temporarily override the tool-bar-setup function to prevent it from + ;; running during the initial stages of startup + (advice-add #'tool-bar-setup :override #'ignore) + (define-advice startup--load-user-init-file + (:before (&rest _) minimal-emacs-setup-toolbar) + (advice-remove #'tool-bar-setup #'ignore) + (tool-bar-setup))))) + +(push '(tool-bar-lines . 0) default-frame-alist) +(setq tool-bar-mode nil) + +(push '(vertical-scroll-bars) default-frame-alist) +(push '(horizontal-scroll-bars) default-frame-alist) +(setq scroll-bar-mode nil) +(when (fboundp 'horizontal-scroll-bar-mode) + (horizontal-scroll-bar-mode -1)) + +(when (bound-and-true-p tooltip-mode) + (tooltip-mode -1)) + +;; Disable GUIs because they are inconsistent across systems, desktop +;; environments, and themes, and they don't match the look of Emacs. +(setq use-file-dialog nil) +(setq use-dialog-box nil) + +;; Allow for shorter responses: "y" for yes and "n" for no. +(if (boundp 'use-short-answers) + (setq use-short-answers t) + (advice-add #'yes-or-no-p :override #'y-or-n-p)) +(defalias #'view-hello-file #'ignore) ; Never show the hello file + +;;; And that's mine + (setq package-enable-at-startup nil) (setenv "LSP_USE_PLISTS" "true") -(menu-bar-mode -1) -(tool-bar-mode -1) -(scroll-bar-mode -1) (setq-default pgtk-wait-for-event-timeout 0) +(setq vc-follow-symlinks t) + +(provide 'early-init) +;;; early-init.el ends here -- cgit v1.2.3