From: Daniel Martín Date: Thu, 6 May 2021 08:27:03 +0000 (+0200) Subject: Add a help option to the open large files prompt X-Git-Tag: emacs-28.0.90~2597 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b61c828ea37f6d875f9c2672a262482af5efedb4;p=emacs.git Add a help option to the open large files prompt * lisp/files.el (files--ask-user-about-large-file-help-text): New function that returns information about opening large files in Emacs. (Bug#45412) (files--ask-user-about-large-file): Use read-multiple-choice to display the available actions. * etc/NEWS: Advertise the new feature. --- diff --git a/etc/NEWS b/etc/NEWS index c759b333b60..737b64b0dad 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -284,6 +284,14 @@ that have been marked for deletion. However, if this new option is non-nil then Emacs will require confirmation with 'yes-or-no-p' before deleting. +--- +** New help window when Emacs prompts before opening a large file. +Commands like 'find-file' or 'visit-tags-table' ask to visit a file +normally or literally when the file is larger than a certain size (by +default, 9.5 MiB). Press '?' or 'C-h' in that prompt to read more +about the different options to visit a file, how you can disable the +prompt, and how you can tweak the file size threshold. + * Editing Changes in Emacs 28.1 diff --git a/lisp/files.el b/lisp/files.el index 16ebe744b98..27074beffc1 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -2129,27 +2129,60 @@ think it does, because \"free\" is pretty hard to define in practice." (declare-function x-popup-dialog "menu.c" (position contents &optional header)) +(defun files--ask-user-about-large-file-help-text (op-type size) + "Format the text that explains the options to open large files in Emacs. +OP-TYPE contains the kind of file operation that will be +performed. SIZE is the size of the large file." + (format + "The file that you want to %s is large (%s), which exceeds the + threshold above which Emacs asks for confirmation (%s). + + Large files may be slow to edit or navigate so Emacs asks you + before you try to %s such files. + + You can press: + 'y' to %s the file. + 'n' to abort, and not %s the file. + 'l' (the letter ell) to %s the file literally, which means that + Emacs will %s the file without doing any format or character code + conversion and in Fundamental mode, without loading any potentially + expensive features. + + You can customize the option `large-file-warning-threshold' to be the + file size, in bytes, from which Emacs will ask for confirmation. Set + it to nil to never request confirmation." + op-type + size + (funcall byte-count-to-string-function large-file-warning-threshold) + op-type + op-type + op-type + op-type + op-type)) + (defun files--ask-user-about-large-file (size op-type filename offer-raw) + "Query the user about what to do with large files. +Files are \"large\" if file SIZE is larger than `large-file-warning-threshold'. + +OP-TYPE specifies the file operation being performed on FILENAME. + +If OFFER-RAW is true, give user the additional option to open the +file literally." (let ((prompt (format "File %s is large (%s), really %s?" (file-name-nondirectory filename) (funcall byte-count-to-string-function size) op-type))) (if (not offer-raw) (if (y-or-n-p prompt) nil 'abort) - (let* ((use-dialog (and (display-popup-menus-p) - last-input-event - (listp last-nonmenu-event) - use-dialog-box)) - (choice - (if use-dialog - (x-popup-dialog t `(,prompt - ("Yes" . ?y) - ("No" . ?n) - ("Open literally" . ?l))) - (read-char-choice - (concat prompt " (y)es or (n)o or (l)iterally ") - '(?y ?Y ?n ?N ?l ?L))))) - (cond ((memq choice '(?y ?Y)) nil) - ((memq choice '(?l ?L)) 'raw) + (let ((choice + (car + (read-multiple-choice + prompt '((?y "yes") + (?n "no") + (?l "literally")) + (files--ask-user-about-large-file-help-text + op-type (funcall byte-count-to-string-function size)))))) + (cond ((eq choice ?y) nil) + ((eq choice ?l) 'raw) (t 'abort)))))) (defun abort-if-file-too-large (size op-type filename &optional offer-raw)