Skip to content

Commit 1ec8ac5

Browse files
Don't font-lock logger output
Commit a23104e set font-lock-keywords-only. On reflection, it doesn't make much sense to use font-lock at all in the logger output buffer. Instead the back end could supply structured data (as opposed to a string), and was can apply face properties directly when inserting. This should be faster. Similarly, insert a text property to let us find the start of each item, and update the previous/next item commands to use that instead of a regexp search. Note: This uses the compat package to supply text-property-search functions on older versions of Emacs.
1 parent 226a968 commit 1ec8ac5

File tree

2 files changed

+63
-82
lines changed

2 files changed

+63
-82
lines changed

racket-logger.el

Lines changed: 47 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
;; SPDX-License-Identifier: GPL-3.0-or-later
1010

11+
(require 'compat) ;for text-property-search-{forward backward}
1112
(require 'easymenu)
1213
(require 'rx)
1314
(require 'racket-custom)
@@ -31,32 +32,6 @@
3132
"---"
3233
["Clear" racket-logger-clear]))
3334

34-
(defconst racket-logger-font-lock-keywords
35-
(eval-when-compile
36-
`((,#'racket--font-lock-config . racket-logger-config-face)
37-
(,(rx bol "[ fatal]") . racket-logger-fatal-face)
38-
(,(rx bol "[ error]") . racket-logger-error-face)
39-
(,(rx bol "[warning]") . racket-logger-warning-face)
40-
(,(rx bol "[ info]") . racket-logger-info-face)
41-
(,(rx bol "[ debug]") . racket-logger-debug-face)
42-
(,(rx bol ?\[ (+? anything) ?\] space
43-
(group (+? anything) ?:) space)
44-
1 racket-logger-topic-face))))
45-
46-
(defconst racket--logger-print-config-prefix
47-
"racket-logger-config:\n")
48-
49-
(defun racket--font-lock-config (limit)
50-
"Handle multi-line font-lock of the configuration info."
51-
(ignore-errors
52-
(when (re-search-forward (concat "^" racket--logger-print-config-prefix) limit t)
53-
(let ((md (match-data)))
54-
(goto-char (match-end 0))
55-
(forward-sexp 1)
56-
(setf (elt md 1) (point)) ;; set (match-end 0)
57-
(set-match-data md)
58-
t))))
59-
6035
(define-derived-mode racket-logger-mode special-mode "Racket-Logger"
6136
"Major mode for Racket logger output.
6237
\\<racket-logger-mode-map>
@@ -70,9 +45,7 @@ For more information see:
7045
7146
\\{racket-logger-mode-map}
7247
"
73-
(setq-local font-lock-defaults
74-
(list racket-logger-font-lock-keywords
75-
t)) ;keywords-only #751
48+
(setq-local font-lock-defaults (list nil t)) ;no font lock
7649
(setq-local truncate-lines t)
7750
(setq-local buffer-undo-list t) ;disable undo
7851
(setq-local window-point-insertion-type t))
@@ -90,21 +63,37 @@ For more information see:
9063
(racket--logger-activate-config)))
9164
(get-buffer name)))
9265

93-
(defun racket--logger-on-notify (back-end-name str)
66+
(defun racket--logger-on-notify (back-end-name v)
9467
"This is called from `racket--cmd-dispatch-response'.
9568
9669
As a result, we might create this buffer before the user does a
9770
`racket-logger-mode' command."
9871
(when noninteractive ;emacs --batch
9972
(princ (format "{logger %s}: %s"
10073
(racket-back-end-name)
101-
str)))
74+
v)))
10275
(with-current-buffer (racket--logger-get-buffer-create back-end-name)
103-
(let* ((inhibit-read-only t)
104-
(original-point (point))
105-
(point-was-at-end-p (equal original-point (point-max))))
76+
(pcase-let* ((`(,level ,topic ,message) v)
77+
(`(,level-str . ,level-face)
78+
(pcase level
79+
('fatal (cons "[ fatal]" racket-logger-fatal-face))
80+
('error (cons "[ error]" racket-logger-error-face))
81+
('warning (cons "[warning]" racket-logger-warning-face))
82+
('info (cons "[ info]" racket-logger-info-face))
83+
('debug (cons "[ debug]" racket-logger-debug-face))))
84+
(inhibit-read-only t)
85+
(original-point (point))
86+
(point-was-at-end-p (equal original-point (point-max))))
10687
(goto-char (point-max))
107-
(insert str)
88+
(insert (propertize level-str
89+
'face level-face
90+
'racket-logger-item-level t)
91+
" "
92+
(propertize (symbol-name topic)
93+
'face racket-logger-topic-face)
94+
": "
95+
message
96+
"\n")
10897
(unless point-was-at-end-p
10998
(goto-char original-point)))))
11099

@@ -115,9 +104,9 @@ As a result, we might create this buffer before the user does a
115104
(with-current-buffer (racket--logger-get-buffer-create)
116105
(let ((inhibit-read-only t))
117106
(goto-char (point-max))
118-
(insert (propertize (concat racket--logger-print-config-prefix
107+
(insert (propertize (concat "racket-logger-config:\n"
119108
(pp-to-string racket-logger-config))
120-
'font-lock-multiline t))
109+
'face racket-logger-config-face))
121110
(goto-char (point-max)))))
122111

123112
(defun racket--logger-set (topic level)
@@ -168,31 +157,31 @@ As a result, we might create this buffer before the user does a
168157
(delete-region (point-min) (point-max)))
169158
(racket--logger-activate-config))))
170159

171-
(defconst racket--logger-item-rx
172-
(rx bol ?\[ (0+ space) (or "fatal" "error" "warning" "info" "debug") ?\] space))
173-
174160
(defun racket-logger-next-item (&optional count)
175-
"Move point N items forward.
176-
177-
An \"item\" is a line starting with a log level in brackets.
178-
179-
Interactively, N is the numeric prefix argument.
180-
If N is omitted or nil, move point 1 item forward."
181-
(interactive "P")
182-
(forward-char 1)
183-
(if (re-search-forward racket--logger-item-rx nil t count)
184-
(beginning-of-line)
185-
(backward-char 1)))
161+
"Move point forward COUNT logger output items.
162+
163+
Interactively, COUNT is the numeric prefix argument. If COUNT is
164+
omitted or nil, move point 1 item forward."
165+
(interactive "p")
166+
(let* ((count (or count 1))
167+
(step (if (< 0 count) -1 1))
168+
(search (if (< 0 count)
169+
#'text-property-search-forward
170+
#'text-property-search-backward)))
171+
(while (not (zerop count))
172+
(let ((match (funcall search 'racket-logger-item-level t t t)))
173+
(if (not match)
174+
(setq count 0)
175+
(goto-char (prop-match-beginning match))
176+
(setq count (+ count step)))))))
186177

187178
(defun racket-logger-previous-item (&optional count)
188-
"Move point N items backward.
189-
190-
An \"item\" is a line starting with a log level in brackets.
179+
"Move point backward COUNT logger output items.
191180
192-
Interactively, N is the numeric prefix argument.
193-
If N is omitted or nil, move point 1 item backward."
194-
(interactive "P")
195-
(re-search-backward racket--logger-item-rx nil t count))
181+
Interactively, COUNT is the numeric prefix argument. If COUNT is
182+
omitted or nil, move point 1 item backward."
183+
(interactive "p")
184+
(racket-logger-next-item (if count (- count) -1)))
196185

197186
(defun racket-logger-topic-level ()
198187
"Set or unset the level for a topic.

racket/logger.rkt

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
;; Copyright (c) 2013-2022 by Greg Hendershott.
1+
;; Copyright (c) 2013-2022, 2025 by Greg Hendershott.
22
;; SPDX-License-Identifier: GPL-3.0-or-later
33

44
#lang at-exp racket/base
@@ -37,37 +37,29 @@
3737
[(vector level message _v topic)
3838
(channel-put notify-channel
3939
`(logger
40-
,(~a (label level) " "
41-
(ensure-topic-in-message topic message)
42-
"\n")))
40+
,(cons level
41+
(topic+message topic message))))
4342
(wait receiver)])))))
4443
(void (thread racket-mode-log-receiver-thread))
4544

46-
(define (ensure-topic-in-message topic message)
45+
(define (topic+message topic message)
4746
(match message
48-
[(pregexp (format "^~a: " (regexp-quote (~a topic))))
49-
message]
47+
[(pregexp (format "^~a: (.*)$" (regexp-quote (~a topic)))
48+
(list _ message))
49+
(list topic
50+
message)]
5051
[message-without-topic
51-
(format "~a: ~a" (or topic "*") message-without-topic)]))
52+
(list (or topic '*)
53+
message-without-topic)]))
5254

5355
(module+ test
5456
(require rackunit)
55-
(check-equal? (ensure-topic-in-message 'topic "topic: message")
56-
"topic: message")
57-
(check-equal? (ensure-topic-in-message 'topic "message")
58-
"topic: message")
59-
(check-equal? (ensure-topic-in-message #f "message")
60-
"*: message"))
61-
62-
(define (label level)
63-
;; justify
64-
(case level
65-
[(debug) "[ debug]"]
66-
[(info) "[ info]"]
67-
[(warning) "[warning]"]
68-
[(error) "[ error]"]
69-
[(fatal) "[ fatal]"]
70-
[else @~a{[level]}]))
57+
(check-equal? (topic+message 'topic "message")
58+
(list 'topic "message"))
59+
(check-equal? (topic+message 'topic "topic: message")
60+
(list 'topic "message"))
61+
(check-equal? (topic+message #f "message")
62+
(list '* "message")))
7163

7264
(define (make-receiver alist)
7365
(apply make-log-receiver (list* global-logger

0 commit comments

Comments
 (0)