From 74abd910902e779a2f8334b609b95f68b2bcf756 Mon Sep 17 00:00:00 2001 From: Q Date: Tue, 9 Jan 2024 23:16:05 +0800 Subject: [PATCH 1/9] fix wrong minibuffer size on prompt --- mini-modeline.el | 83 +++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index 90064d2..22fb58f 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -223,43 +223,47 @@ When ARG is: (if (eq arg 'clear) (setq modeline-content nil) (setq modeline-content - (pcase mini-modeline-echo-position - ("left" - (mini-modeline--multi-lr-render - (if mini-modeline--msg - (format-mode-line '(:eval (mini-modeline-msg))) - (format-mode-line l-fmt)) + (pcase mini-modeline-echo-position + ("left" + (mini-modeline--multi-lr-render + (if mini-modeline--msg + (format-mode-line '(:eval (mini-modeline-msg))) + (format-mode-line l-fmt)) (format-mode-line r-fmt))) - ("middle" - (mini-modeline--multi-lr-render - (if mini-modeline--msg - (format-mode-line (append l-fmt '((:eval (mini-modeline-msg))))) - (format-mode-line l-fmt)) + ("middle" + (mini-modeline--multi-lr-render + (if mini-modeline--msg + (format-mode-line (append l-fmt '((:eval (mini-modeline-msg))))) + (format-mode-line l-fmt)) (format-mode-line r-fmt))) - ("right" - (mini-modeline--multi-lr-render - (format-mode-line l-fmt) - (if mini-modeline--msg - (format-mode-line '(:eval (mini-modeline-msg))) - (format-mode-line r-fmt)))))) + ("right" + (mini-modeline--multi-lr-render + (format-mode-line l-fmt) + (if mini-modeline--msg + (format-mode-line '(:eval (mini-modeline-msg))) + (format-mode-line r-fmt)))))) (setq mini-modeline--last-update (current-time))) ;; write to minibuffer - (unless (equal modeline-content - mini-modeline--cache) - (setq mini-modeline--cache modeline-content) - (erase-buffer) - (when mini-modeline--cache - (let ((height-delta (- (cdr mini-modeline--cache) - (window-height (minibuffer-window mini-modeline-frame)))) - ;; ; let mini-modeline take control of mini-buffer size - (resize-mini-windows t)) - (when (or (> height-delta 0) - ;; this is to prevent window flashing for consecutive multi-line message - (mini-modeline--overduep mini-modeline--last-change-size - mini-modeline-echo-duration)) - (window-resize (minibuffer-window mini-modeline-frame) height-delta) - (setq mini-modeline--last-change-size (current-time))) + (when modeline-content + (unless (equal modeline-content + mini-modeline--cache) + (setq mini-modeline--cache modeline-content) + (erase-buffer) + ;; there might be other low level function that affect the echo area height + ;; this timer is a workaround for minibuffer not resized correctly + (run-at-time 0.05 nil + (lambda () + (let ((height-delta (- (cdr mini-modeline--cache) + (window-height (minibuffer-window mini-modeline-frame)))) + ;; let mini-modeline take control of mini-buffer size + (resize-mini-windows 'grow-only)) + (window-resize (minibuffer-window mini-modeline-frame) height-delta) + (setq mini-modeline--last-change-size (current-time))))) + (if (mini-modeline--overduep mini-modeline--last-change-size + mini-modeline-echo-duration) + ;; prepend with a notice that some messages are missed + (insert (concat "[msg missed]" (car mini-modeline--cache))) (insert (car mini-modeline--cache)))))))))) ((error debug) (mini-modeline--log "mini-modeline: %s\n" err))))) @@ -273,7 +277,8 @@ When ARG is: "Render the LEFT and RIGHT part of mini-modeline." (let* ((left (or left "")) (right (or right "")) - (available-width (max (- (frame-width mini-modeline-frame) + (frame-width (frame-width mini-modeline-frame)) + (available-width (max (- frame-width (string-width left) mini-modeline-right-padding) 0)) @@ -286,9 +291,8 @@ When ARG is: (format (format "%%s %%%d.%ds" available-width available-width) left right) 0) (cons - (let ((available-width (+ available-width (string-width left)))) - (format (format "%%0.%ds\n%%s" available-width) right left)) - (ceiling (string-width left) (frame-width mini-modeline-frame)))) + (format (format "%%%d.%ds\n%%s" (- frame-width 1) (- frame-width 1)) right left) + (ceiling (string-width left) frame-width))) (cons (format (format "%%s %%%ds" available-width) left right) 0)))) (defun mini-modeline--multi-lr-render (left right) @@ -344,7 +348,7 @@ BODY will be supplied with orig-func and args." (when mini-modeline-enhance-visual (with-current-buffer mini-modeline--minibuffer (mini-modeline--set-buffer-face))) - (setq resize-mini-windows nil)) + (setq resize-mini-windows mini-modeline--orig-resize-mini-windows)) (declare-function anzu--cons-mode-line "ext:anzu") (declare-function anzu--reset-mode-line "ext:anzu") @@ -392,11 +396,10 @@ BODY will be supplied with orig-func and args." 'mini-modeline-mode-line-inactive (default-value 'face-remapping-alist) face-remaps)))) - (setq mini-modeline--orig-resize-mini-windows resize-mini-windows) - (setq resize-mini-windows nil) + (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) (redisplay) ;; (add-hook 'pre-redisplay-functions #'mini-modeline-display) - (setq mini-modeline--timer (run-with-timer 0 0.1 #'mini-modeline-display)) + (setq mini-modeline--timer (run-with-idle-timer 0.1 t #'mini-modeline-display)) (advice-add #'message :around #'mini-modeline--reroute-msg) (add-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) From 7e95dfe726ad5e71339b9a0d932bd65ee5cab893 Mon Sep 17 00:00:00 2001 From: Q Date: Wed, 24 Jan 2024 20:16:40 +0800 Subject: [PATCH 2/9] simplify the displaying logic --- mini-modeline.el | 484 +++++++++++++++++++++-------------------------- 1 file changed, 216 insertions(+), 268 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index 22fb58f..8a6ac67 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -43,50 +43,45 @@ :group 'minibuffer :prefix "mini-modeline-") -;; Forward declaration for evil-mode-line-tag -(defvar evil-mode-line-tag) - -(defcustom mini-modeline-l-format nil +(defcustom mini-modeline--l-format nil "Left part of mini-modeline, same format with `mode-line-format'." :type `(repeat symbol) :group 'mini-modeline) -(defcustom mini-modeline-r-format '("%e" mode-line-front-space - mode-line-mule-info - mode-line-client - mode-line-modified - mode-line-remote - mode-line-frame-identification - mode-line-buffer-identification - " " mode-line-position " " - evil-mode-line-tag - (:eval (string-trim (format-mode-line mode-line-modes))) - mode-line-misc-info) +(defvar mini-modeline--right-seperator "|" + "separate the non-essential and essential part.") + +(defcustom mini-modeline--r-format '("%e" mode-line-front-space + mode-line-buffer-identification + mini-modeline--right-seperator + mode-line-mule-info + mode-line-client + mode-line-modified + mode-line-remote + mode-line-frame-identification + " " mode-line-position " " + (:eval (string-trim (format-mode-line mode-line-modes))) + mode-line-misc-info) "Right part of mini-modeline, same format with `mode-line-format'." :type `(repeat symbol) :group 'mini-modeline) -(defcustom mini-modeline-face-attr `(:background ,(face-attribute 'mode-line :background)) +(defcustom mini-modeline--face-attr `(:background ,(face-attribute 'mode-line :background)) "Plist of face attribute/value pair for mini-modeline." :type '(plist) :group 'mini-modeline) -(defcustom mini-modeline-truncate-p t +(defcustom mini-modeline--truncate-p nil "Truncates mini-modeline or not." :type 'boolean :group 'mini-modeline) -(defcustom mini-modeline-enhance-visual t +(defcustom mini-modeline--enhance-visual t "Enhance minibuffer and window's visibility." :type 'boolean :group 'mini-modeline) -(defcustom mini-modeline-hide-mode-line t - "Turn off the main modeline when `mini-modeline-mode' is active." - :type 'boolean - :group 'mini-modeline) - -(defface mini-modeline-mode-line +(defface mini-modeline--mode-line '((((background light)) :background "#55ced1" :height 0.14 :box nil) (t @@ -94,7 +89,7 @@ "Modeline face for active window." :group 'mini-modeline) -(defface mini-modeline-mode-line-inactive +(defface mini-modeline--mode-line-inactive '((((background light)) :background "#dddddd" :height 0.1 :box nil) (t @@ -109,40 +104,18 @@ (defvar mini-modeline--orig-mode-line-inactive-remap (or (alist-get 'mode-line-inactive face-remapping-alist) 'mode-line-inactive)) -(defcustom mini-modeline-echo-duration 2 - "Duration to keep display echo." - :type 'number - :group 'mini-modeline) - -(defcustom mini-modeline-frame nil - "Frame to display mini-modeline on. -Nil means current selected frame." - :type 'sexp - :group 'mini-modeline) - -(defcustom mini-modeline-display-gui-line t +(defcustom mini-modeline--display-gui-line t "Display thin line at the bottom of the window." :type 'boolean :group 'mini-modeline) -(defcustom mini-modeline-right-padding 3 +(defcustom mini-modeline--right-padding 2 "Padding to use in the right side. Set this to the minimal value that doesn't cause truncation." :type 'integer :group 'mini-modeline) -(defcustom mini-modeline-echo-position "left" - "Position to display echo area. -Set this to 'left' 'middle' 'right'." - :type '(choice (const "left") - (const "middle") - (const "right")) - :group 'mini-modeline) - -(defvar mini-modeline--last-echoed nil) - -(defvar mini-modeline--msg nil) -(defvar mini-modeline--msg-message nil +(defvar mini-modeline--message nil "Store the string from `message'.") ;; perf @@ -151,149 +124,66 @@ Set this to 'left' 'middle' 'right'." :type 'number :group 'mini-modeline) -(defvar mini-modeline--last-update (current-time)) -(defvar mini-modeline--last-change-size (current-time)) -(defvar mini-modeline--cache nil) -(defvar mini-modeline--command-state 'begin - "The state of current executed command begin -> [exec exec-read] -> end.") +(defvar mini-modeline--last-update-time (current-time)) +(defvar mini-modeline--idle t + "The state of current executed command.") (defvar-local mini-modeline--face-cookie nil) (defun mini-modeline--set-buffer-face () "Set buffer default face for current buffer." (setq mini-modeline--face-cookie - (face-remap-add-relative 'default mini-modeline-face-attr))) + (face-remap-add-relative 'default mini-modeline--face-attr))) -(defun mini-modeline--log (&rest args) +(defvar my-log-flag nil) + +(defun my-log-flag-toggle () + (interactive) + (setq my-log-flag (not my-log-flag))) + +(defun mini-modeline--log (force &rest args) "Log message into message buffer with ARGS as same parameters in `message'." - (save-excursion - (with-current-buffer "*Messages*" - (let ((inhibit-read-only t)) - (goto-char (point-max)) - (insert (apply #'format args)))))) + (when (or my-log-flag force) + (save-excursion + (with-current-buffer "*Messages*" + (let ((inhibit-read-only t) + (log-text (apply #'format args))) + (goto-char (point-max)) + (insert log-text) + (insert "\n")))))) + +(defun mini-modeline--show-buffers () + (interactive) + (split-window-vertically) + (switch-to-buffer " *Minibuf-0*") + (call-interactively 'split-window-vertically) + (call-interactively 'other-window) + (switch-to-buffer " *Echo Area 0*") + (call-interactively 'other-window)) (defsubst mini-modeline--overduep (since duration) "Check if time already pass DURATION from SINCE." (>= (float-time (time-since since)) duration)) -(defvar mini-modeline--minibuffer nil) -(defun mini-modeline-display (&optional arg) - "Update mini-modeline. -When ARG is: -- `force', force update the minibuffer. -- `clear', clear the minibuffer. This implies `force'." - (save-match-data - (condition-case err - (cl-letf (((symbol-function 'completion-all-completions) #'ignore) - (l-fmt mini-modeline-l-format) - (r-fmt mini-modeline-r-format)) - (unless (or (active-minibuffer-window) - (input-pending-p)) - (setq mini-modeline--minibuffer - (window-buffer (minibuffer-window mini-modeline-frame))) - (with-current-buffer mini-modeline--minibuffer - (let ((truncate-lines mini-modeline-truncate-p) - (inhibit-read-only t) - (inhibit-redisplay t) - (buffer-undo-list t) - modeline-content) - (when (or (memq arg '(force clear)) - (mini-modeline--overduep mini-modeline--last-update - mini-modeline-update-interval)) - (when-let ((msg (or mini-modeline--msg-message (current-message)))) - ;; Clear echo area and start new timer for echo message - ;; (mini-modeline--log "msg: %s\n" msg) - ;; (mini-modeline--log "from: %s\n" mini-modeline--msg-message) - (message nil) - (setq mini-modeline--last-echoed (current-time)) - ;; we proritize the message from `message' - ;; or the message when we're not in middle of a command running. - (when (or mini-modeline--msg-message - (eq mini-modeline--command-state 'begin)) - (setq mini-modeline--command-state 'exec) - ;; Don't echo keystrokes when in middle of command - (setq echo-keystrokes 0)) - (setq mini-modeline--msg msg)) - ;; Reset echo message when timeout and not in middle of command - (when (and mini-modeline--msg - (not (memq mini-modeline--command-state '(exec exec-read))) - (mini-modeline--overduep mini-modeline--last-echoed - mini-modeline-echo-duration)) - (setq mini-modeline--msg nil)) - ;; Showing mini-modeline - (if (eq arg 'clear) - (setq modeline-content nil) - (setq modeline-content - (pcase mini-modeline-echo-position - ("left" - (mini-modeline--multi-lr-render - (if mini-modeline--msg - (format-mode-line '(:eval (mini-modeline-msg))) - (format-mode-line l-fmt)) - (format-mode-line r-fmt))) - ("middle" - (mini-modeline--multi-lr-render - (if mini-modeline--msg - (format-mode-line (append l-fmt '((:eval (mini-modeline-msg))))) - (format-mode-line l-fmt)) - (format-mode-line r-fmt))) - ("right" - (mini-modeline--multi-lr-render - (format-mode-line l-fmt) - (if mini-modeline--msg - (format-mode-line '(:eval (mini-modeline-msg))) - (format-mode-line r-fmt)))))) - (setq mini-modeline--last-update (current-time))) - - ;; write to minibuffer - (when modeline-content - (unless (equal modeline-content - mini-modeline--cache) - (setq mini-modeline--cache modeline-content) - (erase-buffer) - ;; there might be other low level function that affect the echo area height - ;; this timer is a workaround for minibuffer not resized correctly - (run-at-time 0.05 nil - (lambda () - (let ((height-delta (- (cdr mini-modeline--cache) - (window-height (minibuffer-window mini-modeline-frame)))) - ;; let mini-modeline take control of mini-buffer size - (resize-mini-windows 'grow-only)) - (window-resize (minibuffer-window mini-modeline-frame) height-delta) - (setq mini-modeline--last-change-size (current-time))))) - (if (mini-modeline--overduep mini-modeline--last-change-size - mini-modeline-echo-duration) - ;; prepend with a notice that some messages are missed - (insert (concat "[msg missed]" (car mini-modeline--cache))) - (insert (car mini-modeline--cache)))))))))) - ((error debug) - (mini-modeline--log "mini-modeline: %s\n" err))))) - -(defun mini-modeline-msg () - "Place holder to display echo area message." - (when mini-modeline--msg - (replace-regexp-in-string "%" "%%" mini-modeline--msg))) - (defsubst mini-modeline--lr-render (left right) - "Render the LEFT and RIGHT part of mini-modeline." - (let* ((left (or left "")) - (right (or right "")) - (frame-width (frame-width mini-modeline-frame)) - (available-width (max (- frame-width - (string-width left) - mini-modeline-right-padding) - 0)) - (required-width (string-width right))) - ;; (mini-modeline--log "a:%s r:%s\n" available-width required-width) - (if (< available-width required-width) - (if mini-modeline-truncate-p + "Render the LEFT and RIGHT part of mini-modeline." + (let* ((left (or left "")) + (right (or right "")) + (frame-width (frame-width nil)) + (available-width (max (- frame-width + (string-width left) + mini-modeline--right-padding) + 0)) + (required-width (string-width right))) + (when (> (string-width right) frame-width) + (setq right (nth 1 (split-string right mini-modeline--right-seperator)))) + (if (< available-width required-width) + (if mini-modeline--truncate-p + (cons (format (format "%%s %%%d.%ds" available-width available-width) left right) + 0) (cons - ;; Emacs 25 cannot use position format - (format (format "%%s %%%d.%ds" available-width available-width) left right) - 0) - (cons - (format (format "%%%d.%ds\n%%s" (- frame-width 1) (- frame-width 1)) right left) - (ceiling (string-width left) frame-width))) - (cons (format (format "%%s %%%ds" available-width) left right) 0)))) + (format (format "%%%d.%ds\n%%s" (- frame-width 1) (- frame-width 1)) right left) + (ceiling (string-width left) frame-width))) + (cons (format (format "%%s %%%ds" available-width) left right) 0)))) (defun mini-modeline--multi-lr-render (left right) "Render the LEFT and RIGHT part of mini-modeline with multiline supported. @@ -309,14 +199,69 @@ Return value is (STRING . LINES)." (setq extra-lines (+ extra-lines (cdr lr))))) (cons (string-join re "\n") (+ lines extra-lines)))) +(defvar mini-modeline--unprocessed-message '()) + +(defun mini-modeline--display (&optional force) + "Update mini-modeline." + (save-match-data + (condition-case err + (cl-letf (((symbol-function 'completion-all-completions) #'ignore)) + (unless (or (active-minibuffer-window) + (input-pending-p)) + (let* ((mini-modeline-window (minibuffer-window nil)) + (mini-modeline-buffer (window-buffer mini-modeline-window))) + (with-current-buffer mini-modeline-buffer + (let (mini-modeline-content-left + mini-modeline-content) + ;; (mini-modeline--log nil "mini-modeline--display, command state %s" mini-modeline--idle) + (when (or mini-modeline--idle force) + (setq mini-modeline-content-left (string-join mini-modeline--unprocessed-message "\n")) + (setq mini-modeline-content (mini-modeline--multi-lr-render + (or mini-modeline-content-left (format-mode-line mini-modeline--l-format)) + (format-mode-line mini-modeline--r-format))) + + (setq mini-modeline--unprocessed-message '()) + (setq mini-modeline--last-update-time (current-time)) + (run-at-time 0.1 nil 'mini-modeline--set-minibuffer + mini-modeline-content + mini-modeline-window + mini-modeline-buffer))))))) + ((error debug) + (mini-modeline--log t "mini-modeline: %s\n" err))))) + +(defun mini-modeline--set-minibuffer (mini-modeline-content + mini-modeline-window + mini-modeline-buffer) + (let* ((height-delta (- (cdr mini-modeline-content) + (window-height mini-modeline-window))) + (truncate-lines mini-modeline--truncate-p) + (inhibit-read-only t) + (buffer-undo-list t) + (inhibit-redisplay t) + (cursor-in-echo-area t) + (resize-mini-windows t)) + (with-current-buffer mini-modeline-buffer + (erase-buffer) + (insert (car mini-modeline-content)) + ;; (mini-modeline--log nil "mini-modeline--set-minibuffer minibuffer height: %s, delta: %s" + ;; (window-height mini-modeline-window) height-delta) + (when (> height-delta 0) + (window-resize mini-modeline-window height-delta))))) + +(setq inhibit-read-only t) (defun mini-modeline--reroute-msg (func &rest args) "Reroute FUNC with ARGS that echo to echo area to place hodler." - (if inhibit-message - (apply func args) - (let* ((inhibit-message t) - (mini-modeline--msg-message (apply func args))) - (mini-modeline-display 'force) - mini-modeline--msg-message))) + (let* ((inhibit-message t) + (msg (apply func args)) + (max-message-length (min 400 (length msg)))) + (when (> max-message-length 0) + (setq mini-modeline--message + (replace-regexp-in-string "%" "%%" (substring msg 0 max-message-length))) + (add-to-list 'mini-modeline--unprocessed-message mini-modeline--message t) + (mini-modeline--log nil "Reroute message %s minibuffer active: %s input pending: %s" + msg (active-minibuffer-window) (input-pending-p)) + (mini-modeline--display 'force)) + msg)) (defmacro mini-modeline--wrap (func &rest body) "Add an advice around FUNC with name mini-modeline--%s. @@ -329,81 +274,84 @@ BODY will be supplied with orig-func and args." (defsubst mini-modeline--pre-cmd () "Pre command hook of mini-modeline." - (setq mini-modeline--command-state 'begin)) + ;; Don't echo keystrokes when in middle of command + (setq echo-keystrokes 0) + (mini-modeline--display) + (setq mini-modeline--idle nil)) (defsubst mini-modeline--post-cmd () "Post command hook of mini-modeline." - (setq mini-modeline--command-state 'end - echo-keystrokes mini-modeline--echo-keystrokes)) + (mini-modeline--display) + (setq mini-modeline--idle t) + (setq echo-keystrokes mini-modeline--echo-keystrokes)) (defvar mini-modeline--orig-resize-mini-windows resize-mini-windows) (defsubst mini-modeline--enter-minibuffer () "`minibuffer-setup-hook' of mini-modeline." - (when mini-modeline-enhance-visual + (when mini-modeline--enhance-visual (mini-modeline--set-buffer-face)) (setq resize-mini-windows 'grow-only)) (defsubst mini-modeline--exit-minibuffer () "`minibuffer-exit-hook' of mini-modeline." - (when mini-modeline-enhance-visual - (with-current-buffer mini-modeline--minibuffer - (mini-modeline--set-buffer-face))) (setq resize-mini-windows mini-modeline--orig-resize-mini-windows)) (declare-function anzu--cons-mode-line "ext:anzu") (declare-function anzu--reset-mode-line "ext:anzu") -(defvar mini-modeline--timer nil) - (defun mini-modeline--enable () "Enable `mini-modeline'." - (when mini-modeline-hide-mode-line - ;; Hide modeline for terminal, or use empty modeline for GUI. - (setq-default mini-modeline--orig-mode-line mode-line-format) - (setq-default mode-line-format (when (and mini-modeline-display-gui-line - (display-graphic-p)) - '(" "))) - ;; Do the same thing with opening buffers. - (mapc - (lambda (buf) - (with-current-buffer buf - (when (local-variable-p 'mode-line-format) - (setq mini-modeline--orig-mode-line mode-line-format) - (setq mode-line-format (when (and mini-modeline-display-gui-line - (display-graphic-p)) - '(" ")))) - (when (and mini-modeline-enhance-visual - (or (minibufferp buf) - (string-prefix-p " *Echo Area" (buffer-name)))) - (mini-modeline--set-buffer-face)) - ;; Make the modeline in GUI a thin bar. - (when (and mini-modeline-display-gui-line - (local-variable-p 'face-remapping-alist) - (display-graphic-p)) - (setf (alist-get 'mode-line face-remapping-alist) - 'mini-modeline-mode-line - (alist-get 'mode-line-inactive face-remapping-alist) - 'mini-modeline-mode-line-inactive)))) - (buffer-list)) - - ;; Make the modeline in GUI a thin bar. - (when (and mini-modeline-display-gui-line - (display-graphic-p)) - (let ((face-remaps (default-value 'face-remapping-alist))) - (setf (alist-get 'mode-line face-remaps) - 'mini-modeline-mode-line - (alist-get 'mode-line-inactive face-remaps) - 'mini-modeline-mode-line-inactive - (default-value 'face-remapping-alist) face-remaps)))) + ;; Hide modeline for terminal, or use empty modeline for GUI. + (setq-default mini-modeline--orig-mode-line mode-line-format) + (setq-default mode-line-format (when (and mini-modeline--display-gui-line + (display-graphic-p)) + '(" "))) + ;; Do the same thing with opening buffers. + (mapc + (lambda (buf) + (with-current-buffer buf + (when (local-variable-p 'mode-line-format) + (setq mini-modeline--orig-mode-line mode-line-format) + (setq mode-line-format (when (and mini-modeline--display-gui-line + (display-graphic-p)) + '(" ")))) + (when (and mini-modeline--enhance-visual + (or (minibufferp buf) + (string-prefix-p " *Echo Area" (buffer-name)))) + (mini-modeline--set-buffer-face)) + ;; Make the modeline in GUI a thin bar. + (when (and mini-modeline--display-gui-line + (local-variable-p 'face-remapping-alist) + (display-graphic-p)) + (setf (alist-get 'mode-line face-remapping-alist) + 'mini-modeline--mode-line + (alist-get 'mode-line-inactive face-remapping-alist) + 'mini-modeline--mode-line-inactive)))) + (buffer-list)) + + ;; Make the modeline in GUI a thin bar. + (when (and mini-modeline--display-gui-line + (display-graphic-p)) + (let ((face-remaps (default-value 'face-remapping-alist))) + (setf (alist-get 'mode-line face-remaps) + 'mini-modeline--mode-line + (alist-get 'mode-line-inactive face-remaps) + 'mini-modeline--mode-line-inactive + (default-value 'face-remapping-alist) face-remaps))) (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) (redisplay) - ;; (add-hook 'pre-redisplay-functions #'mini-modeline-display) - (setq mini-modeline--timer (run-with-idle-timer 0.1 t #'mini-modeline-display)) + + ;; (defvar mini-modeline--timer nil) + ;; (setq mini-modeline--timer (run-with-idle-timer 0.1 t #'mini-modeline--display)) + + (setq message-original (symbol-function 'message)) (advice-add #'message :around #'mini-modeline--reroute-msg) + (add-hook 'focus-in-hook 'mini-modeline--display) (add-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) (add-hook 'minibuffer-exit-hook #'mini-modeline--exit-minibuffer) + ;; (add-hook 'pre-redisplay-functions #'mini-modeline--display) (add-hook 'pre-command-hook #'mini-modeline--pre-cmd) (add-hook 'post-command-hook #'mini-modeline--post-cmd) @@ -411,64 +359,64 @@ BODY will be supplied with orig-func and args." ;; anzu (mini-modeline--wrap anzu--cons-mode-line - (let ((mode-line-format mini-modeline-r-format)) + (let ((mode-line-format mini-modeline--r-format)) (apply orig-func args) - (setq mini-modeline-r-format mode-line-format))) + (setq mini-modeline--r-format mode-line-format))) (mini-modeline--wrap anzu--reset-mode-line - (let ((mode-line-format mini-modeline-r-format)) + (let ((mode-line-format mini-modeline--r-format)) (apply orig-func args) - (setq mini-modeline-r-format mode-line-format))) + (setq mini-modeline--r-format mode-line-format))) ;; read-key-sequence (mini-modeline--wrap read-key-sequence (progn - (setq mini-modeline--command-state 'exec-read) + (setq mini-modeline--idle nil) (apply orig-func args))) (mini-modeline--wrap read-key-sequence-vector (progn - (setq mini-modeline--command-state 'exec-read) + (setq mini-modeline--idle nil) (apply orig-func args)))) (defun mini-modeline--disable () "Disable `mini-modeline'." - (when mini-modeline-hide-mode-line - (setq-default mode-line-format (default-value 'mini-modeline--orig-mode-line)) - (when (display-graphic-p) - (let ((face-remaps (default-value 'face-remapping-alist))) - (setf (alist-get 'mode-line face-remaps) - mini-modeline--orig-mode-line-remap - (alist-get 'mode-line-inactive face-remaps) - mini-modeline--orig-mode-line-inactive-remap - (default-value 'face-remapping-alist) face-remaps))) - - (mapc - (lambda (buf) - (with-current-buffer buf - (when (local-variable-p 'mode-line-format) - (setq mode-line-format mini-modeline--orig-mode-line)) - (when mini-modeline--face-cookie - (face-remap-remove-relative mini-modeline--face-cookie)) - (when (and (local-variable-p 'face-remapping-alist) - (display-graphic-p)) - (setf (alist-get 'mode-line face-remapping-alist) - mini-modeline--orig-mode-line-remap - (alist-get 'mode-line-inactive face-remapping-alist) - mini-modeline--orig-mode-line-inactive-remap)))) - (buffer-list))) + (setq-default mode-line-format (default-value 'mini-modeline--orig-mode-line)) + (when (display-graphic-p) + (let ((face-remaps (default-value 'face-remapping-alist))) + (setf (alist-get 'mode-line face-remaps) + mini-modeline--orig-mode-line-remap + (alist-get 'mode-line-inactive face-remaps) + mini-modeline--orig-mode-line-inactive-remap + (default-value 'face-remapping-alist) face-remaps))) + + (mapc + (lambda (buf) + (with-current-buffer buf + (when (local-variable-p 'mode-line-format) + (setq mode-line-format mini-modeline--orig-mode-line)) + (when mini-modeline--face-cookie + (face-remap-remove-relative mini-modeline--face-cookie)) + (when (and (local-variable-p 'face-remapping-alist) + (display-graphic-p)) + (setf (alist-get 'mode-line face-remapping-alist) + mini-modeline--orig-mode-line-remap + (alist-get 'mode-line-inactive face-remapping-alist) + mini-modeline--orig-mode-line-inactive-remap)))) + (buffer-list)) (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) (redisplay) - ;; (remove-hook 'post-command-hook #'mini-modeline-display) - ;; (remove-hook 'pre-redisplay-functions #'mini-modeline-display) - (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) - (mini-modeline-display 'clear) + ;; (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) + ;; (funcall 'clear-minibuffer-message) + (message nil) (advice-remove #'message #'mini-modeline--reroute-msg) + (remove-hook 'focus-in-hook 'mini-modeline--display) (remove-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) (remove-hook 'minibuffer-exit-hook #'mini-modeline--exit-minibuffer) + ;; (remove-hook 'pre-redisplay-functions #'mini-modeline--display) (remove-hook 'pre-command-hook #'mini-modeline--pre-cmd) (remove-hook 'post-command-hook #'mini-modeline--post-cmd) From 59dfd9d6f8d054d972c8fe6b6521d48cd4da6ba5 Mon Sep 17 00:00:00 2001 From: Q Date: Sat, 9 Mar 2024 09:41:34 +0800 Subject: [PATCH 3/9] fix post-cmd-hook, keep message between command --- mini-modeline.el | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index 8a6ac67..b6c7c7b 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -134,15 +134,27 @@ Set this to the minimal value that doesn't cause truncation." (setq mini-modeline--face-cookie (face-remap-add-relative 'default mini-modeline--face-attr))) -(defvar my-log-flag nil) +(defvar message-log-flag nil) -(defun my-log-flag-toggle () +(defun message-log (force &rest args) + "Log message into message buffer with ARGS as same parameters in `message'." + (when (or message-log-flag force) + (save-excursion + (with-current-buffer "*Messages*" + (let ((inhibit-read-only t) + (log-text (apply #'format args))) + (goto-char (point-max)) + (insert log-text) + (insert "\n") + (notify "message:" log-text)))))) + +(defun message-log-flag-toggle () (interactive) - (setq my-log-flag (not my-log-flag))) + (setq message-log-flag (not message-log-flag))) (defun mini-modeline--log (force &rest args) "Log message into message buffer with ARGS as same parameters in `message'." - (when (or my-log-flag force) + (when (or message-log-flag force) (save-excursion (with-current-buffer "*Messages*" (let ((inhibit-read-only t) @@ -201,7 +213,7 @@ Return value is (STRING . LINES)." (defvar mini-modeline--unprocessed-message '()) -(defun mini-modeline--display (&optional force) +(defun mini-modeline--display (&optional force keep-msg) "Update mini-modeline." (save-match-data (condition-case err @@ -219,13 +231,14 @@ Return value is (STRING . LINES)." (setq mini-modeline-content (mini-modeline--multi-lr-render (or mini-modeline-content-left (format-mode-line mini-modeline--l-format)) (format-mode-line mini-modeline--r-format))) - - (setq mini-modeline--unprocessed-message '()) + (unless keep-msg + (setq mini-modeline--unprocessed-message '())) (setq mini-modeline--last-update-time (current-time)) - (run-at-time 0.1 nil 'mini-modeline--set-minibuffer - mini-modeline-content - mini-modeline-window - mini-modeline-buffer))))))) + (setq mini-modeline--timer + (run-at-time 0.1 nil 'mini-modeline--set-minibuffer + mini-modeline-content + mini-modeline-window + mini-modeline-buffer)))))))) ((error debug) (mini-modeline--log t "mini-modeline: %s\n" err))))) @@ -260,7 +273,7 @@ Return value is (STRING . LINES)." (add-to-list 'mini-modeline--unprocessed-message mini-modeline--message t) (mini-modeline--log nil "Reroute message %s minibuffer active: %s input pending: %s" msg (active-minibuffer-window) (input-pending-p)) - (mini-modeline--display 'force)) + (mini-modeline--display 'force t)) msg)) (defmacro mini-modeline--wrap (func &rest body) @@ -276,13 +289,15 @@ BODY will be supplied with orig-func and args." "Pre command hook of mini-modeline." ;; Don't echo keystrokes when in middle of command (setq echo-keystrokes 0) - (mini-modeline--display) (setq mini-modeline--idle nil)) (defsubst mini-modeline--post-cmd () "Post command hook of mini-modeline." - (mini-modeline--display) + ;; (message-log t "post-cmd %s %s" (string-join mini-modeline--unprocessed-message "\n") (current-buffer)) (setq mini-modeline--idle t) + (mini-modeline--display) + ;; (unless (active-minibuffer-window) + ;; (mini-modeline--display)) (setq echo-keystrokes mini-modeline--echo-keystrokes)) (defvar mini-modeline--orig-resize-mini-windows resize-mini-windows) @@ -294,7 +309,8 @@ BODY will be supplied with orig-func and args." (defsubst mini-modeline--exit-minibuffer () "`minibuffer-exit-hook' of mini-modeline." - (setq resize-mini-windows mini-modeline--orig-resize-mini-windows)) + (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) + (mini-modeline--display)) (declare-function anzu--cons-mode-line "ext:anzu") (declare-function anzu--reset-mode-line "ext:anzu") @@ -342,7 +358,7 @@ BODY will be supplied with orig-func and args." (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) (redisplay) - ;; (defvar mini-modeline--timer nil) + (defvar mini-modeline--timer nil) ;; (setq mini-modeline--timer (run-with-idle-timer 0.1 t #'mini-modeline--display)) (setq message-original (symbol-function 'message)) From 9169f0ddf6fc2906072423abdab883435b529215 Mon Sep 17 00:00:00 2001 From: Q Date: Mon, 11 Mar 2024 14:32:22 +0800 Subject: [PATCH 4/9] deal with message congestion --- mini-modeline.el | 133 +++++++++++++++++++++++++++++------------------ 1 file changed, 83 insertions(+), 50 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index b6c7c7b..d36a68b 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -33,6 +33,7 @@ (require 'frame) (require 'timer) (require 'face-remap) +(require 'cl-lib) (eval-when-compile (require 'subr-x) @@ -48,12 +49,9 @@ :type `(repeat symbol) :group 'mini-modeline) -(defvar mini-modeline--right-seperator "|" - "separate the non-essential and essential part.") - (defcustom mini-modeline--r-format '("%e" mode-line-front-space mode-line-buffer-identification - mini-modeline--right-seperator + ;; function name in [mule-info] could be long mode-line-mule-info mode-line-client mode-line-modified @@ -115,9 +113,6 @@ Set this to the minimal value that doesn't cause truncation." :type 'integer :group 'mini-modeline) -(defvar mini-modeline--message nil - "Store the string from `message'.") - ;; perf (defcustom mini-modeline-update-interval 0.1 "The minimum interval to update mini-modeline." @@ -152,7 +147,7 @@ Set this to the minimal value that doesn't cause truncation." (interactive) (setq message-log-flag (not message-log-flag))) -(defun mini-modeline--log (force &rest args) +(defun message-log (force &rest args) "Log message into message buffer with ARGS as same parameters in `message'." (when (or message-log-flag force) (save-excursion @@ -187,7 +182,9 @@ Set this to the minimal value that doesn't cause truncation." 0)) (required-width (string-width right))) (when (> (string-width right) frame-width) - (setq right (nth 1 (split-string right mini-modeline--right-seperator)))) + (setq right (concat "[" (nth 1 (split-string right "\\["))))) + (when (> (string-width right) frame-width) + (setq right (nth 1 (split-string right "\\]")))) (if (< available-width required-width) (if mini-modeline--truncate-p (cons (format (format "%%s %%%d.%ds" available-width available-width) left right) @@ -200,79 +197,115 @@ Set this to the minimal value that doesn't cause truncation." (defun mini-modeline--multi-lr-render (left right) "Render the LEFT and RIGHT part of mini-modeline with multiline supported. Return value is (STRING . LINES)." - (let* ((l (split-string left "\n")) - (r (split-string right "\n")) - (lines (max (length l) (length r))) + (let* ((l (nreverse (split-string left "\n"))) + ;; right is a single line + ;; (lines (max (length l) (length r))) + (lines (length l)) + ;; right part is on an separate bottom line + (result-lines 0) (extra-lines 0) re) - (--dotimes lines - (let ((lr (mini-modeline--lr-render (elt l it) (elt r it)))) + (if (> lines 1) + (let* ((root (frame-root-window nil)) + (max-lines (- (window-height root) + (window-min-size root) + 1))) + ;; (--dotimes lines + ;; (let ((lr (mini-modeline--lr-render (elt l it) (elt r it)))) + ;; (setq re (nconc re `(,(car lr)))) + ;; (setq extra-lines (+ extra-lines (cdr lr))))) + (dolist (i l) + (let ((first-i (equal 0 result-lines)) + lr) + (if first-i + (setq lr (mini-modeline--lr-render i right)) + (setq lr (mini-modeline--lr-render i ""))) + ;; lines before max-lines counted backwards are removed to fit the mini-window + (if (> (+ result-lines 1 (cdr lr)) max-lines) + (cl-return re) + (setq result-lines (+ result-lines 1 (cdr lr))) + (setq re (nconc re + (if (and first-i (> (cdr lr) 0)) + (nreverse `(,(car lr))) + `(,(car lr)))))))) + (setq re (nreverse re))) + (let ((lr (mini-modeline--lr-render left right))) (setq re (nconc re `(,(car lr)))) - (setq extra-lines (+ extra-lines (cdr lr))))) - (cons (string-join re "\n") (+ lines extra-lines)))) + (setq result-lines (+ 1 (cdr lr))))) + (cons (string-join re "\n") result-lines))) (defvar mini-modeline--unprocessed-message '()) (defun mini-modeline--display (&optional force keep-msg) "Update mini-modeline." - (save-match-data - (condition-case err - (cl-letf (((symbol-function 'completion-all-completions) #'ignore)) - (unless (or (active-minibuffer-window) - (input-pending-p)) + (when (and (or mini-modeline--idle force) + (not (or (active-minibuffer-window) + (input-pending-p)))) + (save-match-data + (condition-case err + (cl-letf (((symbol-function 'completion-all-completions) #'ignore)) (let* ((mini-modeline-window (minibuffer-window nil)) (mini-modeline-buffer (window-buffer mini-modeline-window))) (with-current-buffer mini-modeline-buffer (let (mini-modeline-content-left mini-modeline-content) - ;; (mini-modeline--log nil "mini-modeline--display, command state %s" mini-modeline--idle) - (when (or mini-modeline--idle force) - (setq mini-modeline-content-left (string-join mini-modeline--unprocessed-message "\n")) - (setq mini-modeline-content (mini-modeline--multi-lr-render - (or mini-modeline-content-left (format-mode-line mini-modeline--l-format)) - (format-mode-line mini-modeline--r-format))) - (unless keep-msg - (setq mini-modeline--unprocessed-message '())) - (setq mini-modeline--last-update-time (current-time)) - (setq mini-modeline--timer - (run-at-time 0.1 nil 'mini-modeline--set-minibuffer - mini-modeline-content - mini-modeline-window - mini-modeline-buffer)))))))) - ((error debug) - (mini-modeline--log t "mini-modeline: %s\n" err))))) + ;; (message-log nil "mini-modeline--display, command state %s" mini-modeline--idle) + (setq mini-modeline-content-left (string-join mini-modeline--unprocessed-message "\n")) + (setq mini-modeline-content (mini-modeline--multi-lr-render + (or mini-modeline-content-left (format-mode-line mini-modeline--l-format)) + (format-mode-line mini-modeline--r-format))) + (unless keep-msg + (setq mini-modeline--unprocessed-message '())) + (setq mini-modeline--last-update-time (current-time)) + (setq mini-modeline--timer + (run-at-time 0.1 nil 'mini-modeline--set-minibuffer + mini-modeline-content + mini-modeline-window + mini-modeline-buffer)))))) + ((error debug) + (message-log t "mini-modeline: %s\n" err)))))) (defun mini-modeline--set-minibuffer (mini-modeline-content mini-modeline-window mini-modeline-buffer) - (let* ((height-delta (- (cdr mini-modeline-content) + (let* ((mini-modeline-content-height (cdr mini-modeline-content)) + (height-delta (- mini-modeline-content-height (window-height mini-modeline-window))) + ;; (height-delta-diff (- height-delta (window-max-delta mini-modeline-window))) (truncate-lines mini-modeline--truncate-p) - (inhibit-read-only t) (buffer-undo-list t) (inhibit-redisplay t) + (inhibit-read-only t) + ;; (auto-window-vscroll t) + ;; (redisplay-adhoc-scroll-in-resize-mini-windows t) + ;; (window-point-insertion-type t) + ;; (max-mini-window-height 0.5) (cursor-in-echo-area t) (resize-mini-windows t)) (with-current-buffer mini-modeline-buffer (erase-buffer) (insert (car mini-modeline-content)) - ;; (mini-modeline--log nil "mini-modeline--set-minibuffer minibuffer height: %s, delta: %s" + ;; (message-log nil "mini-modeline--set-minibuffer minibuffer height: %s, delta: %s" ;; (window-height mini-modeline-window) height-delta) + ;; (when (> height-delta-diff 0) + ;; ;; (> mini-modeline-content-height (window-height mini-modeline-window) + ;; (delete-region (point-min) (progn (forward-line height-delta-diff) (point)))) (when (> height-delta 0) + ;; (window--resize-mini-window mini-modeline-window height-delta) (window-resize mini-modeline-window height-delta))))) (setq inhibit-read-only t) + (defun mini-modeline--reroute-msg (func &rest args) "Reroute FUNC with ARGS that echo to echo area to place hodler." (let* ((inhibit-message t) - (msg (apply func args)) - (max-message-length (min 400 (length msg)))) - (when (> max-message-length 0) - (setq mini-modeline--message - (replace-regexp-in-string "%" "%%" (substring msg 0 max-message-length))) - (add-to-list 'mini-modeline--unprocessed-message mini-modeline--message t) - (mini-modeline--log nil "Reroute message %s minibuffer active: %s input pending: %s" - msg (active-minibuffer-window) (input-pending-p)) + (msg (apply func args))) + ;; (replace-regexp-in-string "%" "%%" (substring msg 0 max-message-length)) + (unless (string-empty-p msg) + ;; todo delete trailing spaces and blank lines + (add-to-list 'mini-modeline--unprocessed-message msg t) + ;; (message-log nil "Reroute message %s minibuffer active: %s input pending: %s" + ;; msg (active-minibuffer-window) (input-pending-p)) (mini-modeline--display 'force t)) msg)) @@ -296,8 +329,6 @@ BODY will be supplied with orig-func and args." ;; (message-log t "post-cmd %s %s" (string-join mini-modeline--unprocessed-message "\n") (current-buffer)) (setq mini-modeline--idle t) (mini-modeline--display) - ;; (unless (active-minibuffer-window) - ;; (mini-modeline--display)) (setq echo-keystrokes mini-modeline--echo-keystrokes)) (defvar mini-modeline--orig-resize-mini-windows resize-mini-windows) @@ -367,6 +398,7 @@ BODY will be supplied with orig-func and args." (add-hook 'focus-in-hook 'mini-modeline--display) (add-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) (add-hook 'minibuffer-exit-hook #'mini-modeline--exit-minibuffer) + (add-hook 'echo-area-clear-hook #'mini-modeline--exit-minibuffer) ;; (add-hook 'pre-redisplay-functions #'mini-modeline--display) (add-hook 'pre-command-hook #'mini-modeline--pre-cmd) (add-hook 'post-command-hook #'mini-modeline--post-cmd) @@ -432,6 +464,7 @@ BODY will be supplied with orig-func and args." (remove-hook 'focus-in-hook 'mini-modeline--display) (remove-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) (remove-hook 'minibuffer-exit-hook #'mini-modeline--exit-minibuffer) + (remove-hook 'echo-area-clear-hook #'mini-modeline--exit-minibuffer) ;; (remove-hook 'pre-redisplay-functions #'mini-modeline--display) (remove-hook 'pre-command-hook #'mini-modeline--pre-cmd) (remove-hook 'post-command-hook #'mini-modeline--post-cmd) From 53a51dd383f71562fc4bd2be8c0b2dad9ceb3e54 Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 14 Mar 2024 19:37:03 +0800 Subject: [PATCH 5/9] use message in keyboard quit --- mini-modeline.el | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index d36a68b..5445157 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -49,17 +49,17 @@ :type `(repeat symbol) :group 'mini-modeline) -(defcustom mini-modeline--r-format '("%e" mode-line-front-space - mode-line-buffer-identification - ;; function name in [mule-info] could be long +(defcustom mini-modeline--r-format '("%e" mode-line-process mode-line-mule-info mode-line-client - mode-line-modified mode-line-remote mode-line-frame-identification - " " mode-line-position " " - (:eval (string-trim (format-mode-line mode-line-modes))) - mode-line-misc-info) + (:eval (propertize mode-line-buffer-identification 'face 'link)) + ;; [function name] could be long + (which-func-mode which-func-format) + mode-line-position-column-line-format + mode-line-modified + (:eval (propertize (format-time-string "%H:%M") 'face 'bold))) "Right part of mini-modeline, same format with `mode-line-format'." :type `(repeat symbol) :group 'mini-modeline) @@ -394,6 +394,7 @@ BODY will be supplied with orig-func and args." (setq message-original (symbol-function 'message)) (advice-add #'message :around #'mini-modeline--reroute-msg) + (advice-add #'force-mode-line-update :after #'mini-modeline--display) (add-hook 'focus-in-hook 'mini-modeline--display) (add-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) @@ -460,6 +461,7 @@ BODY will be supplied with orig-func and args." ;; (funcall 'clear-minibuffer-message) (message nil) (advice-remove #'message #'mini-modeline--reroute-msg) + (advice-remove #'force-mode-line-update #'mini-modeline--display) (remove-hook 'focus-in-hook 'mini-modeline--display) (remove-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) @@ -488,5 +490,26 @@ BODY will be supplied with orig-func and args." (mini-modeline--enable) (mini-modeline--disable))) +;; Emacs bug: too many places that write to the echo area without using message +(defun keyboard-quit () + "Signal a `quit' condition. + During execution of Lisp code, this character causes a quit directly. + At top-level, as an editor command, this simply beeps." + (interactive) + ;; Avoid adding the region to the window selection. + (setq saved-region-selection nil) + (let (select-active-regions) + (deactivate-mark)) + (if (fboundp 'kmacro-keyboard-quit) + (kmacro-keyboard-quit)) + (when completion-in-region-mode + (completion-in-region-mode -1)) + ;; Force the next redisplay cycle to remove the "Def" indicator from + ;; all the mode lines. + (if defining-kbd-macro + (force-mode-line-update t)) + (setq defining-kbd-macro nil) + (message "Quit")) + (provide 'mini-modeline) ;;; mini-modeline.el ends here From c231e210b5308edfbede7ace983088fa57b387e7 Mon Sep 17 00:00:00 2001 From: Q Date: Mon, 1 Apr 2024 14:07:20 +0800 Subject: [PATCH 6/9] remove flicker --- mini-modeline.el | 103 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 26 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index 5445157..6d720a5 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -74,7 +74,7 @@ :type 'boolean :group 'mini-modeline) -(defcustom mini-modeline--enhance-visual t +(defcustom mini-modeline--enhance-visual nil "Enhance minibuffer and window's visibility." :type 'boolean :group 'mini-modeline) @@ -126,6 +126,8 @@ Set this to the minimal value that doesn't cause truncation." (defvar-local mini-modeline--face-cookie nil) (defun mini-modeline--set-buffer-face () "Set buffer default face for current buffer." + ;; (set (make-local-variable 'face-remapping-alist) + ;; '((default :height 0.9))) (setq mini-modeline--face-cookie (face-remap-add-relative 'default mini-modeline--face-attr))) @@ -167,6 +169,8 @@ Set this to the minimal value that doesn't cause truncation." (switch-to-buffer " *Echo Area 0*") (call-interactively 'other-window)) +(defvar mini-modeline--last-resize (current-time)) + (defsubst mini-modeline--overduep (since duration) "Check if time already pass DURATION from SINCE." (>= (float-time (time-since since)) duration)) @@ -235,6 +239,7 @@ Return value is (STRING . LINES)." (cons (string-join re "\n") result-lines))) (defvar mini-modeline--unprocessed-message '()) +(defvar mini-modeline-content-left-last nil) (defun mini-modeline--display (&optional force keep-msg) "Update mini-modeline." @@ -250,8 +255,12 @@ Return value is (STRING . LINES)." (let (mini-modeline-content-left mini-modeline-content) ;; (message-log nil "mini-modeline--display, command state %s" mini-modeline--idle) - (setq mini-modeline-content-left (string-join mini-modeline--unprocessed-message "\n")) - (setq mini-modeline-content (mini-modeline--multi-lr-render + ;; (message-log t "current msg: %s" (current-message)) + (setq mini-modeline-content-left (or (and mini-modeline--unprocessed-message + (string-join mini-modeline--unprocessed-message "\n")) + mini-modeline-content-left-last)) + (setq mini-modeline-content-left-last mini-modeline-content-left + mini-modeline-content (mini-modeline--multi-lr-render (or mini-modeline-content-left (format-mode-line mini-modeline--l-format)) (format-mode-line mini-modeline--r-format))) (unless keep-msg @@ -282,6 +291,7 @@ Return value is (STRING . LINES)." ;; (max-mini-window-height 0.5) (cursor-in-echo-area t) (resize-mini-windows t)) + ;; when it's not echoing anything, the echo area displays the buffer *Minibuf-0* (note that the buffer name starts with a space). (with-current-buffer mini-modeline-buffer (erase-buffer) (insert (car mini-modeline-content)) @@ -290,7 +300,10 @@ Return value is (STRING . LINES)." ;; (when (> height-delta-diff 0) ;; ;; (> mini-modeline-content-height (window-height mini-modeline-window) ;; (delete-region (point-min) (progn (forward-line height-delta-diff) (point)))) - (when (> height-delta 0) + ;; don't shrink the minibuffer too often, which causes windows flashing + (when (or (> height-delta 0) + (and (mini-modeline--overduep mini-modeline--last-resize 2))) + (setq mini-modeline--last-resize (current-time)) ;; (window--resize-mini-window mini-modeline-window height-delta) (window-resize mini-modeline-window height-delta))))) @@ -301,7 +314,8 @@ Return value is (STRING . LINES)." (let* ((inhibit-message t) (msg (apply func args))) ;; (replace-regexp-in-string "%" "%%" (substring msg 0 max-message-length)) - (unless (string-empty-p msg) + (unless (and (string-empty-p msg) + (equal msg (car (last mini-modeline--unprocessed-message)))) ;; todo delete trailing spaces and blank lines (add-to-list 'mini-modeline--unprocessed-message msg t) ;; (message-log nil "Reroute message %s minibuffer active: %s input pending: %s" @@ -328,9 +342,19 @@ BODY will be supplied with orig-func and args." "Post command hook of mini-modeline." ;; (message-log t "post-cmd %s %s" (string-join mini-modeline--unprocessed-message "\n") (current-buffer)) (setq mini-modeline--idle t) - (mini-modeline--display) + ;; (unless (current-message) + ;; (mini-modeline--display)) + ;; remove flashing, the post-command-hook is called too often, eg. in eldoc-mode + (when (mini-modeline--overduep mini-modeline--last-update-time mini-modeline-update-interval) + (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) + (mini-modeline--display)) (setq echo-keystrokes mini-modeline--echo-keystrokes)) +(defsubst mini-modeline--post-insert () + "Post insert hook of mini-modeline." + (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) + (mini-modeline--display 'force)) + (defvar mini-modeline--orig-resize-mini-windows resize-mini-windows) (defsubst mini-modeline--enter-minibuffer () "`minibuffer-setup-hook' of mini-modeline." @@ -340,7 +364,7 @@ BODY will be supplied with orig-func and args." (defsubst mini-modeline--exit-minibuffer () "`minibuffer-exit-hook' of mini-modeline." - (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) + (setq resize-mini-windows nil) (mini-modeline--display)) (declare-function anzu--cons-mode-line "ext:anzu") @@ -386,23 +410,28 @@ BODY will be supplied with orig-func and args." 'mini-modeline--mode-line-inactive (default-value 'face-remapping-alist) face-remaps))) - (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) + (setq resize-mini-windows nil) (redisplay) (defvar mini-modeline--timer nil) - ;; (setq mini-modeline--timer (run-with-idle-timer 0.1 t #'mini-modeline--display)) + (defvar mini-modeline--idle-timer nil) + + (setq mini-modeline--idle-timer (run-with-idle-timer 5 t #'mini-modeline--display)) (setq message-original (symbol-function 'message)) (advice-add #'message :around #'mini-modeline--reroute-msg) (advice-add #'force-mode-line-update :after #'mini-modeline--display) - (add-hook 'focus-in-hook 'mini-modeline--display) + (add-hook 'focus-out-hook 'mini-modeline--display) (add-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) (add-hook 'minibuffer-exit-hook #'mini-modeline--exit-minibuffer) (add-hook 'echo-area-clear-hook #'mini-modeline--exit-minibuffer) ;; (add-hook 'pre-redisplay-functions #'mini-modeline--display) (add-hook 'pre-command-hook #'mini-modeline--pre-cmd) + ;; post-command-hook runs too often, not compatible with eldoc-mode (add-hook 'post-command-hook #'mini-modeline--post-cmd) + ;; (add-hook 'buffer-list-update-hook #'mini-modeline--post-cmd) + ;; (add-hook 'post-self-insert-hook #'mini-modeline--post-insert) ;; compatibility ;; anzu @@ -457,19 +486,21 @@ BODY will be supplied with orig-func and args." (setq resize-mini-windows mini-modeline--orig-resize-mini-windows) (redisplay) - ;; (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) + (when (timerp mini-modeline--idle-timer) (cancel-timer mini-modeline--idle-timer)) ;; (funcall 'clear-minibuffer-message) (message nil) (advice-remove #'message #'mini-modeline--reroute-msg) (advice-remove #'force-mode-line-update #'mini-modeline--display) - (remove-hook 'focus-in-hook 'mini-modeline--display) + (remove-hook 'focus-out-hook 'mini-modeline--display) (remove-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) (remove-hook 'minibuffer-exit-hook #'mini-modeline--exit-minibuffer) (remove-hook 'echo-area-clear-hook #'mini-modeline--exit-minibuffer) ;; (remove-hook 'pre-redisplay-functions #'mini-modeline--display) (remove-hook 'pre-command-hook #'mini-modeline--pre-cmd) (remove-hook 'post-command-hook #'mini-modeline--post-cmd) + ;; (remove-hook 'buffer-list-update-hook #'mini-modeline--post-cmd) + ;; (remove-hook 'post-self-insert-hook #'mini-modeline--post-insert) ;; compatibility (advice-remove #'anzu--cons-mode-line 'mini-modeline--anzu--cons-mode-line) @@ -491,25 +522,45 @@ BODY will be supplied with orig-func and args." (mini-modeline--disable))) ;; Emacs bug: too many places that write to the echo area without using message +;; https://emacs.stackexchange.com/questions/7563/make-use-of-an-empty-echo-area-to-display-information/80156 +;; The echo area displayed is the content of ` *Echo Area 0*` or ` *Echo Area 1*` and these are "normal" buffers. It should be posible to patch Emacs so as to provide maybe a hook run whenever these buffers are "flushed" (or are displayed and empty), so that this functionality can be implemented efficiently and reliably. + +;; use C-g to refresh if message is blocked by echo area text (defun keyboard-quit () "Signal a `quit' condition. During execution of Lisp code, this character causes a quit directly. At top-level, as an editor command, this simply beeps." (interactive) - ;; Avoid adding the region to the window selection. - (setq saved-region-selection nil) - (let (select-active-regions) - (deactivate-mark)) - (if (fboundp 'kmacro-keyboard-quit) - (kmacro-keyboard-quit)) - (when completion-in-region-mode - (completion-in-region-mode -1)) - ;; Force the next redisplay cycle to remove the "Def" indicator from - ;; all the mode lines. - (if defining-kbd-macro - (force-mode-line-update t)) - (setq defining-kbd-macro nil) - (message "Quit")) + (let* ((resize-mini-windows t) + (mini-modeline-window (minibuffer-window nil)) + (mini-modeline-buffer (window-buffer mini-modeline-window))) + (if (with-current-buffer " *Echo Area 0*" + (let ((echo-string (buffer-string))) + ;; (message-log t "current echo area message: %s" echo-string) + (erase-buffer) + (string-empty-p echo-string))) + (progn + ;; Avoid adding the region to the window selection. + (setq saved-region-selection nil) + (let (select-active-regions) + (deactivate-mark)) + (if (fboundp 'kmacro-keyboard-quit) + (kmacro-keyboard-quit)) + (when completion-in-region-mode + (completion-in-region-mode -1)) + ;; Force the next redisplay cycle to remove the "Def" indicator from + ;; all the mode lines. + (if defining-kbd-macro + (force-mode-line-update t)) + (setq defining-kbd-macro nil) + ;; do a force window resize + (with-current-buffer mini-modeline-buffer + (erase-buffer) + (redisplay)) + (message "Quit")) + ;; (current-message) is cleared on key press? + ;; clear text in echo area not printed by message, since all message is rerouted + (mini-modeline--display 'force)))) (provide 'mini-modeline) ;;; mini-modeline.el ends here From d47b27a413afa85ed6e63934561848b1b33ac8bf Mon Sep 17 00:00:00 2001 From: Q Date: Mon, 1 Apr 2024 17:36:46 +0800 Subject: [PATCH 7/9] add screencast --- flashing_on_editing_org_mode_buffer.webm | Bin 0 -> 145115 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 flashing_on_editing_org_mode_buffer.webm diff --git a/flashing_on_editing_org_mode_buffer.webm b/flashing_on_editing_org_mode_buffer.webm new file mode 100644 index 0000000000000000000000000000000000000000..c49469512190e237758cadef14f67cadc8defc3f GIT binary patch literal 145115 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�?S3MeNxw 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 Date: Sat, 7 Dec 2024 22:14:11 +0800 Subject: [PATCH 8/9] many fixes --- mini-modeline.el | 62 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index 6d720a5..34f79d5 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -44,10 +44,6 @@ :group 'minibuffer :prefix "mini-modeline-") -(defcustom mini-modeline--l-format nil - "Left part of mini-modeline, same format with `mode-line-format'." - :type `(repeat symbol) - :group 'mini-modeline) (defcustom mini-modeline--r-format '("%e" mode-line-process mode-line-mule-info @@ -240,6 +236,7 @@ Return value is (STRING . LINES)." (defvar mini-modeline--unprocessed-message '()) (defvar mini-modeline-content-left-last nil) +(defvar mini-modeline--repeat-left-last-time nil) (defun mini-modeline--display (&optional force keep-msg) "Update mini-modeline." @@ -256,27 +253,37 @@ Return value is (STRING . LINES)." mini-modeline-content) ;; (message-log nil "mini-modeline--display, command state %s" mini-modeline--idle) ;; (message-log t "current msg: %s" (current-message)) - (setq mini-modeline-content-left (or (and mini-modeline--unprocessed-message - (string-join mini-modeline--unprocessed-message "\n")) - mini-modeline-content-left-last)) - (setq mini-modeline-content-left-last mini-modeline-content-left - mini-modeline-content (mini-modeline--multi-lr-render - (or mini-modeline-content-left (format-mode-line mini-modeline--l-format)) + (if mini-modeline--unprocessed-message + (setq mini-modeline-content-left + (string-join (last mini-modeline--unprocessed-message 3) "\n") + mini-modeline-content-left-last mini-modeline-content-left) + (when mini-modeline-content-left-last + (setq mini-modeline-content-left mini-modeline-content-left-last) + (if mini-modeline--repeat-left-last-time + ;; reset mini-modeline-content-left-last after showing for at least 5 seconds + (when (mini-modeline--overduep mini-modeline--repeat-left-last-time 5) + (setq mini-modeline--repeat-left-last-time nil + mini-modeline-content-left-last nil)) + (setq mini-modeline--repeat-left-last-time (current-time))))) + (setq mini-modeline-content (mini-modeline--multi-lr-render + (or mini-modeline-content-left "") (format-mode-line mini-modeline--r-format))) - (unless keep-msg - (setq mini-modeline--unprocessed-message '())) - (setq mini-modeline--last-update-time (current-time)) + (cancel-timer mini-modeline--timer) (setq mini-modeline--timer (run-at-time 0.1 nil 'mini-modeline--set-minibuffer mini-modeline-content mini-modeline-window - mini-modeline-buffer)))))) + mini-modeline-buffer + mini-modeline--unprocessed-message + keep-msg)))))) ((error debug) (message-log t "mini-modeline: %s\n" err)))))) (defun mini-modeline--set-minibuffer (mini-modeline-content mini-modeline-window - mini-modeline-buffer) + mini-modeline-buffer + msgs + keep-msg) (let* ((mini-modeline-content-height (cdr mini-modeline-content)) (height-delta (- mini-modeline-content-height (window-height mini-modeline-window))) @@ -305,7 +312,11 @@ Return value is (STRING . LINES)." (and (mini-modeline--overduep mini-modeline--last-resize 2))) (setq mini-modeline--last-resize (current-time)) ;; (window--resize-mini-window mini-modeline-window height-delta) - (window-resize mini-modeline-window height-delta))))) + (window-resize mini-modeline-window height-delta))) + (unless keep-msg + (setq mini-modeline--unprocessed-message + (cl-set-difference msgs mini-modeline--unprocessed-message))) + (setq mini-modeline--last-update-time (current-time)))) (setq inhibit-read-only t) @@ -314,8 +325,8 @@ Return value is (STRING . LINES)." (let* ((inhibit-message t) (msg (apply func args))) ;; (replace-regexp-in-string "%" "%%" (substring msg 0 max-message-length)) - (unless (and (string-empty-p msg) - (equal msg (car (last mini-modeline--unprocessed-message)))) + (unless (or (string-empty-p msg) + (equal msg (car (last mini-modeline--unprocessed-message)))) ;; todo delete trailing spaces and blank lines (add-to-list 'mini-modeline--unprocessed-message msg t) ;; (message-log nil "Reroute message %s minibuffer active: %s input pending: %s" @@ -346,13 +357,13 @@ BODY will be supplied with orig-func and args." ;; (mini-modeline--display)) ;; remove flashing, the post-command-hook is called too often, eg. in eldoc-mode (when (mini-modeline--overduep mini-modeline--last-update-time mini-modeline-update-interval) - (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) + (cancel-timer mini-modeline--timer) (mini-modeline--display)) (setq echo-keystrokes mini-modeline--echo-keystrokes)) (defsubst mini-modeline--post-insert () "Post insert hook of mini-modeline." - (when (timerp mini-modeline--timer) (cancel-timer mini-modeline--timer)) + (cancel-timer mini-modeline--timer) (mini-modeline--display 'force)) (defvar mini-modeline--orig-resize-mini-windows resize-mini-windows) @@ -413,7 +424,7 @@ BODY will be supplied with orig-func and args." (setq resize-mini-windows nil) (redisplay) - (defvar mini-modeline--timer nil) + (defvar mini-modeline--timer (timer--create)) (defvar mini-modeline--idle-timer nil) (setq mini-modeline--idle-timer (run-with-idle-timer 5 t #'mini-modeline--display)) @@ -446,6 +457,13 @@ BODY will be supplied with orig-func and args." (apply orig-func args) (setq mini-modeline--r-format mode-line-format))) + ;; y-or-n-p and map-y-or-n-p uses message to display prompt + ;; (mini-modeline--wrap + ;; map-y-or-n-p + ;; (progn + ;; (setq mini-modeline--idle nil) + ;; (apply orig-func args))) + ;; read-key-sequence (mini-modeline--wrap read-key-sequence @@ -557,9 +575,11 @@ BODY will be supplied with orig-func and args." (with-current-buffer mini-modeline-buffer (erase-buffer) (redisplay)) + (setq mini-modeline--unprocessed-message '()) (message "Quit")) ;; (current-message) is cleared on key press? ;; clear text in echo area not printed by message, since all message is rerouted + (setq mini-modeline-content-left-last nil) (mini-modeline--display 'force)))) (provide 'mini-modeline) From 9732eedafebee9ce9d1496a671676202f0a6948a Mon Sep 17 00:00:00 2001 From: Q Date: Wed, 8 Jan 2025 22:18:39 +0800 Subject: [PATCH 9/9] update --- mini-modeline.el | 103 +++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 58 deletions(-) diff --git a/mini-modeline.el b/mini-modeline.el index 34f79d5..3304bbd 100755 --- a/mini-modeline.el +++ b/mini-modeline.el @@ -136,26 +136,15 @@ Set this to the minimal value that doesn't cause truncation." (with-current-buffer "*Messages*" (let ((inhibit-read-only t) (log-text (apply #'format args))) + (notify "message:" log-text) (goto-char (point-max)) (insert log-text) - (insert "\n") - (notify "message:" log-text)))))) + (insert "\n")))))) (defun message-log-flag-toggle () (interactive) (setq message-log-flag (not message-log-flag))) -(defun message-log (force &rest args) - "Log message into message buffer with ARGS as same parameters in `message'." - (when (or message-log-flag force) - (save-excursion - (with-current-buffer "*Messages*" - (let ((inhibit-read-only t) - (log-text (apply #'format args))) - (goto-char (point-max)) - (insert log-text) - (insert "\n")))))) - (defun mini-modeline--show-buffers () (interactive) (split-window-vertically) @@ -190,7 +179,7 @@ Set this to the minimal value that doesn't cause truncation." (cons (format (format "%%s %%%d.%ds" available-width available-width) left right) 0) (cons - (format (format "%%%d.%ds\n%%s" (- frame-width 1) (- frame-width 1)) right left) + (format (format "%%s\n%%%d.%ds" (- frame-width 1) (- frame-width 1)) left right) (ceiling (string-width left) frame-width))) (cons (format (format "%%s %%%ds" available-width) left right) 0)))) @@ -381,6 +370,46 @@ BODY will be supplied with orig-func and args." (declare-function anzu--cons-mode-line "ext:anzu") (declare-function anzu--reset-mode-line "ext:anzu") +;; Emacs bug: too many places that write to the echo area without using message +;; https://emacs.stackexchange.com/questions/7563/make-use-of-an-empty-echo-area-to-display-information/80156 +;; The echo area displayed is the content of ` *Echo Area 0*` or ` *Echo Area 1*` and these are "normal" buffers. It should be posible to patch Emacs so as to provide maybe a hook run whenever these buffers are "flushed" (or are displayed and empty), so that this functionality can be implemented efficiently and reliably. + +;; use C-g to refresh if message is blocked by echo area text +(defun mini-modeline-keyboard-quit (orign-fun) + "Signal a `quit' condition. + During execution of Lisp code, this character causes a quit directly. + At top-level, as an editor command, this simply beeps." + (interactive) + (let* ((resize-mini-windows t) + (mini-modeline-window (minibuffer-window nil)) + (minibuf (active-minibuffer-window))) + (when minibuf (with-current-buffer (window-buffer minibuf) + (minibuffer-keyboard-quit))) + (if (with-current-buffer " *Echo Area 0*" + (let ((echo-string (buffer-string))) + ;; (message-log t "current echo area message: %s" echo-string) + (erase-buffer) + (string-empty-p echo-string))) + (progn + ;; Avoid adding the region to the window selection. + (setq saved-region-selection nil) + (let (select-active-regions) + (deactivate-mark)) + (if (fboundp 'kmacro-keyboard-quit) + (kmacro-keyboard-quit)) + (when completion-in-region-mode + (completion-in-region-mode -1)) + (setq defining-kbd-macro nil)) + (setq mini-modeline--unprocessed-message '()) + ;; (current-message) is cleared on key press? + ;; clear text in echo area not printed by message, since all message is rerouted + (setq mini-modeline-content-left-last nil) + ;; (with-current-buffer mini-modeline-buffer + ;; ;; do a force window resize + ;; (erase-buffer) + ;; (redisplay)) + (mini-modeline--display 'force)))) + (defun mini-modeline--enable () "Enable `mini-modeline'." ;; Hide modeline for terminal, or use empty modeline for GUI. @@ -432,6 +461,7 @@ BODY will be supplied with orig-func and args." (setq message-original (symbol-function 'message)) (advice-add #'message :around #'mini-modeline--reroute-msg) (advice-add #'force-mode-line-update :after #'mini-modeline--display) + (advice-add #'keyboard-quit :around #'mini-modeline-keyboard-quit) (add-hook 'focus-out-hook 'mini-modeline--display) (add-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) @@ -509,6 +539,7 @@ BODY will be supplied with orig-func and args." (message nil) (advice-remove #'message #'mini-modeline--reroute-msg) (advice-remove #'force-mode-line-update #'mini-modeline--display) + (advice-remove #'keyboard-quit #'mini-modeline-keyboard-quit) (remove-hook 'focus-out-hook 'mini-modeline--display) (remove-hook 'minibuffer-setup-hook #'mini-modeline--enter-minibuffer) @@ -527,7 +558,6 @@ BODY will be supplied with orig-func and args." (advice-remove #'read-key-sequence 'mini-modeline--read-key-sequence) (advice-remove #'read-key-sequence-vector 'mini-modeline--read-key-sequence-vector)) - ;;;###autoload (define-minor-mode mini-modeline-mode "Enable modeline in minibuffer." @@ -539,48 +569,5 @@ BODY will be supplied with orig-func and args." (mini-modeline--enable) (mini-modeline--disable))) -;; Emacs bug: too many places that write to the echo area without using message -;; https://emacs.stackexchange.com/questions/7563/make-use-of-an-empty-echo-area-to-display-information/80156 -;; The echo area displayed is the content of ` *Echo Area 0*` or ` *Echo Area 1*` and these are "normal" buffers. It should be posible to patch Emacs so as to provide maybe a hook run whenever these buffers are "flushed" (or are displayed and empty), so that this functionality can be implemented efficiently and reliably. - -;; use C-g to refresh if message is blocked by echo area text -(defun keyboard-quit () - "Signal a `quit' condition. - During execution of Lisp code, this character causes a quit directly. - At top-level, as an editor command, this simply beeps." - (interactive) - (let* ((resize-mini-windows t) - (mini-modeline-window (minibuffer-window nil)) - (mini-modeline-buffer (window-buffer mini-modeline-window))) - (if (with-current-buffer " *Echo Area 0*" - (let ((echo-string (buffer-string))) - ;; (message-log t "current echo area message: %s" echo-string) - (erase-buffer) - (string-empty-p echo-string))) - (progn - ;; Avoid adding the region to the window selection. - (setq saved-region-selection nil) - (let (select-active-regions) - (deactivate-mark)) - (if (fboundp 'kmacro-keyboard-quit) - (kmacro-keyboard-quit)) - (when completion-in-region-mode - (completion-in-region-mode -1)) - ;; Force the next redisplay cycle to remove the "Def" indicator from - ;; all the mode lines. - (if defining-kbd-macro - (force-mode-line-update t)) - (setq defining-kbd-macro nil) - ;; do a force window resize - (with-current-buffer mini-modeline-buffer - (erase-buffer) - (redisplay)) - (setq mini-modeline--unprocessed-message '()) - (message "Quit")) - ;; (current-message) is cleared on key press? - ;; clear text in echo area not printed by message, since all message is rerouted - (setq mini-modeline-content-left-last nil) - (mini-modeline--display 'force)))) - (provide 'mini-modeline) ;;; mini-modeline.el ends here