Optimize opening large files #1834
Fixes an issue where dtrt-indent and/or nav-flash would hang Emacs when opening large files, and disables all mode hooks for large files (without using fundamental-mode so you can at least get syntax highlighting).
This commit is contained in:
parent
2a943437a2
commit
616dec5b93
2 changed files with 42 additions and 4 deletions
|
@ -1,6 +1,6 @@
|
||||||
;;; core-editor.el -*- lexical-binding: t; -*-
|
;;; core-editor.el -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
(defvar doom-detect-indentation-excluded-modes '(fundamental-mode)
|
(defvar doom-detect-indentation-excluded-modes '(fundamental-mode so-long-mode)
|
||||||
"A list of major modes in which indentation should be automatically
|
"A list of major modes in which indentation should be automatically
|
||||||
detected.")
|
detected.")
|
||||||
|
|
||||||
|
@ -9,10 +9,46 @@ detected.")
|
||||||
indentation settings or not. This should be set by editorconfig if it
|
indentation settings or not. This should be set by editorconfig if it
|
||||||
successfully sets indent_style/indent_size.")
|
successfully sets indent_style/indent_size.")
|
||||||
|
|
||||||
|
(defvar-local doom-large-file-p nil)
|
||||||
|
(put 'doom-large-file-p 'permanent-local t)
|
||||||
|
|
||||||
|
(defvar doom-large-file-size 1
|
||||||
|
"The threshold above which Doom enables emergency optimizations.
|
||||||
|
|
||||||
|
This threshold is in MB. See `doom--optimize-for-large-files-a' for
|
||||||
|
implementation details.")
|
||||||
|
|
||||||
|
(defvar doom-large-file-excluded-modes
|
||||||
|
'(so-long-mode special-mode archive-mode tar-mode jka-compr
|
||||||
|
git-commit-mode image-mode doc-view-mode doc-view-mode-maybe
|
||||||
|
ebrowse-tree-mode pdf-view-mode tags-table-mode)
|
||||||
|
"Major modes that `doom-check-large-file-h' will ignore.")
|
||||||
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
;;; File handling
|
;;; File handling
|
||||||
|
|
||||||
|
(defadvice! doom--optimize-for-large-files-a (orig-fn &rest args)
|
||||||
|
"Set `doom-large-file-p' if the file is too large.
|
||||||
|
|
||||||
|
Uses `doom-large-file-size' to determine when a file is too large. When
|
||||||
|
`doom-large-file-p' is set, other plugins can detect this and reduce their
|
||||||
|
runtime costs (or disable themselves) to ensure the buffer is as fast as
|
||||||
|
possible."
|
||||||
|
:around #'after-find-file
|
||||||
|
(if (setq doom-large-file-p
|
||||||
|
(and buffer-file-name
|
||||||
|
(not doom-large-file-p)
|
||||||
|
(not (memq major-mode doom-large-file-excluded-modes))
|
||||||
|
(file-readable-p buffer-file-name)
|
||||||
|
(> (nth 7 (file-attributes buffer-file-name))
|
||||||
|
(* 1024 1024 doom-large-file-size))))
|
||||||
|
(delay-mode-hooks
|
||||||
|
(prog1 (apply orig-fn args)
|
||||||
|
(buffer-disable-undo)
|
||||||
|
(message "Large file detected! Cutting a few corners to improve performance...")))
|
||||||
|
(apply orig-fn args)))
|
||||||
|
|
||||||
;; Resolve symlinks when opening files, so that any operations are conducted
|
;; Resolve symlinks when opening files, so that any operations are conducted
|
||||||
;; from the file's true directory (like `find-file').
|
;; from the file's true directory (like `find-file').
|
||||||
(setq find-file-visit-truename t)
|
(setq find-file-visit-truename t)
|
||||||
|
@ -278,8 +314,9 @@ files, so we replace calls to `pp' with the much faster `prin1'."
|
||||||
(defun doom-detect-indentation-h ()
|
(defun doom-detect-indentation-h ()
|
||||||
(unless (or (not after-init-time)
|
(unless (or (not after-init-time)
|
||||||
doom-inhibit-indent-detection
|
doom-inhibit-indent-detection
|
||||||
(member (substring (buffer-name) 0 1) '(" " "*"))
|
doom-large-file-p
|
||||||
(memq major-mode doom-detect-indentation-excluded-modes))
|
(memq major-mode doom-detect-indentation-excluded-modes)
|
||||||
|
(member (substring (buffer-name) 0 1) '(" " "*")))
|
||||||
;; Don't display messages in the echo area, but still log them
|
;; Don't display messages in the echo area, but still log them
|
||||||
(let ((inhibit-message (not doom-debug-mode)))
|
(let ((inhibit-message (not doom-debug-mode)))
|
||||||
(dtrt-indent-mode +1)))))
|
(dtrt-indent-mode +1)))))
|
||||||
|
|
|
@ -16,7 +16,8 @@ jumping to another part of the file)."
|
||||||
(defun +nav-flash-blink-cursor-maybe (&rest _)
|
(defun +nav-flash-blink-cursor-maybe (&rest _)
|
||||||
"Like `+nav-flash-blink-cursor', but no-ops if in special-mode or term-mode,
|
"Like `+nav-flash-blink-cursor', but no-ops if in special-mode or term-mode,
|
||||||
or triggered from one of `+nav-flash-exclude-commands'."
|
or triggered from one of `+nav-flash-exclude-commands'."
|
||||||
(unless (or (derived-mode-p 'special-mode 'term-mode)
|
(unless (or (bound-and-true-p so-long-enabled)
|
||||||
|
(derived-mode-p 'special-mode 'term-mode)
|
||||||
(memq this-command +nav-flash-exclude-commands)
|
(memq this-command +nav-flash-exclude-commands)
|
||||||
(and (equal (point-marker) (car +nav-flash--last-point))
|
(and (equal (point-marker) (car +nav-flash--last-point))
|
||||||
(equal (selected-window) (cdr +nav-flash--last-point))))
|
(equal (selected-window) (cdr +nav-flash--last-point))))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue