Truncate output from grep

* doc/emacs/building.texi (Compilation): Document it.
* lisp/progmodes/compile.el (compilation-max-output-line-length):
New user option (bug#44983).
(compilation-filter): Use it.
(compilation--insert-abbreviated-line): New function.
This commit is contained in:
Lars Ingebrigtsen 2022-04-30 12:56:18 +02:00
parent 5acf75cec1
commit 58398dea25
3 changed files with 62 additions and 2 deletions

View file

@ -138,6 +138,14 @@ of environment variable settings; each element should be a string of
the form @code{"@var{envvarname}=@var{value}"}. These environment
variable settings override the usual ones.
@vindex compilation-max-output-line-length
Displaying extremely long lines in compilation output can slow Emacs
down. Lines that are longer than
@code{compilation-max-output-line-length} will have the portion that's
exceeds that limit hidden behind a button that can be clicked on to
reveal the hidden portion. Set this variable to @code{nil} to never
hide anything.
@node Compilation Mode
@section Compilation Mode

View file

@ -672,6 +672,14 @@ script that was used in ancient South Asia. A new input method,
* Changes in Specialized Modes and Packages in Emacs 29.1
** Compile
+++
*** New user option 'compilation-max-output-line-length'.
Lines longer than this will have the ends hidden, with a button to
reveal the hidden text. This speeds up operations like grepping on
files that have few newlines.
** Flymake
+++

View file

@ -1752,6 +1752,13 @@ If nil, ask to kill it."
:type 'boolean
:version "24.3")
(defcustom compilation-max-output-line-length 400
"Output lines that are longer than this value will be hidden.
If nil, don't hide anything."
:type '(choice (const :tag "Hide nothing" nil)
number)
:version "29.1")
(defun compilation--update-in-progress-mode-line ()
;; `compilation-in-progress' affects the mode-line of all
;; buffers when it changes from nil to non-nil or vice-versa.
@ -2426,13 +2433,16 @@ and runs `compilation-filter-hook'."
;; We used to use `insert-before-markers', so that windows with
;; point at `process-mark' scroll along with the output, but we
;; now use window-point-insertion-type instead.
(insert string)
(if (not compilation-max-output-line-length)
(insert string)
(dolist (line (string-lines string nil t))
(compilation--insert-abbreviated-line
line compilation-max-output-line-length)))
(unless comint-inhibit-carriage-motion
(comint-carriage-motion (process-mark proc) (point)))
(set-marker (process-mark proc) (point))
;; Update the number of errors in compilation-mode-line-errors
(compilation--ensure-parse (point))
;; (setq-local compilation-buffer-modtime (current-time))
(run-hooks 'compilation-filter-hook))
(goto-char pos)
(narrow-to-region min max)
@ -2440,6 +2450,40 @@ and runs `compilation-filter-hook'."
(set-marker min nil)
(set-marker max nil))))))
(defun compilation--insert-abbreviated-line (string width)
(if (and (> (current-column) 0)
(get-text-property (1- (point)) 'button))
;; We already have an abbreviation; just add the string to it.
(let ((beg (point)))
(insert string)
(add-text-properties
beg
;; Don't make the final newline invisible.
(if (= (aref string (1- (length string))) ?\n)
(1- (point))
(point))
(text-properties-at (1- beg))))
(insert string)
;; If we exceeded the limit, hide the last portion of the line.
(when (> (current-column) width)
(let ((start (save-excursion
(move-to-column width)
(point))))
(buttonize-region
start (point)
(lambda (start)
(let ((inhibit-read-only t))
(remove-text-properties start (save-excursion
(goto-char start)
(line-end-position))
(text-properties-at start)))))
(put-text-property
start (if (= (aref string (1- (length string))) ?\n)
;; Don't hide the final newline.
(1- (point))
(point))
'display (if (char-displayable-p ?…) "[…]" "[...]"))))))
(defsubst compilation-buffer-internal-p ()
"Test if inside a compilation buffer."
(local-variable-p 'compilation-locs))