branch: elpa/logview commit 75ebe125257622fd1bc3fb8210beea1b7df154bc Author: Paul Pogonyshev <pogonys...@gmail.com> Commit: Paul Pogonyshev <pogonys...@gmail.com>
Make '?' key show a simple cheat sheet with the grouped list of commands of the mode. --- logview.el | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/logview.el b/logview.el index 30f65b4fc1..cdfcdb0bb7 100644 --- a/logview.el +++ b/logview.el @@ -492,6 +492,62 @@ Levels are ordered least to most important.") ") +(defvar logview--cheat-sheet + '(("Movement" + (logview-go-to-message-beginning "Beginning of entry’s message") + (logview-next-entry logview-previous-entry "Next / previous entry") + (logview-next-as-important-entry logview-previous-as-important-entry "Next / previous ‘as important’ entry") + (logview-first-entry logview-last-entry "First / last entry") + "‘As important’ means entries with the same or higher level.") + ("Narrowing and widening" + (logview-narrow-from-this-entry logview-narrow-up-to-this-entry "Narrow from / up to this entry") + (widen "Widen") + (logview-widen-upwards logview-widen-downwards "Widen upwards / downwards")) + ("Filtering by level" + (logview-show-only-errors "Show only errors") + (logview-show-errors-and-warnings "Show errors and warnings") + (logview-show-errors-warnings-and-information "Show errors, warnings and information") + (logview-show-errors-warnings-information-and-debug "Show all levels except trace") + (logview-show-all-levels "Show entries of all levels") + (logview-show-only-as-important "Show entries ‘as important’ as current one")) + ("Text-based filtering" + (logview-edit-filters "Edit filters as text in a separate buffer") + (logview-add-include-name-filter logview-add-exclude-name-filter "Add name include / exclude filter") + (logview-add-include-thread-filter logview-add-exclude-thread-filter "Add thread include / exclude filter") + (logview-add-include-message-filter logview-add-exclude-message-filter "Add message include / exclude filter")) + ("Resetting filters" + (logview-reset-level-filters "Reset level filters") + (logview-reset-name-filters "Reset name filters") + (logview-reset-thread-filters "Reset thread filters") + (logview-reset-message-filters "Reset message filters") + (logview-reset-all-filters "Reset all filters") + (logview-reset-all-filters-restrictions-and-hidings "Reset filters, widen and show explicitly hidden entries")) + ("Explicitly hide or show entries" + (logview-hide-entry "Hide entry") + (logview-hide-region-entries "Hide entries in the region") + (logview-show-entries "Show some explicitly hidden entries") + (logview-show-region-entries "Show explicitly hidden entries in the region")) + ("Hide or show details of individual entries" + (logview-toggle-entry-details "Toggle details of current entry") + (logview-toggle-region-entry-details "Toggle details of entries in the region") + (logview-toggle-details-globally "Toggle details in the whole buffer") + "Here ‘details’ are the message lines after the first.") + ("Change options for current buffer" + (auto-revert-mode "Toggle Auto-Revert mode") + (auto-revert-tail-mode "Toggle Auto-Revert Tail mode") + (logview-toggle-copy-visible-text-only "Toggle ‘copy only visible text’") + (logview-toggle-search-only-in-messages "Toggle ‘search only in messages’") + (logview-toggle-show-ellipses "Toggle ‘show ellipses’") + "Options can be customized globally or changed in each buffer.") + ("Miscellaneous" + (logview-customize-submode-options "Customize options that affect submode selection") + (bury-buffer "Bury buffer") + (logview-refresh-buffer-as-needed "Append tail or revert the buffer, as needed") + (logview-append-log-file-tail "Append log file tail to the buffer") + (logview-revert-buffer "Revert the buffer preserving active filters") + "Universal prefix commands are bound without modifiers: \\[universal-argument], \\[negative-argument], \\[digit-argument <0>]..\\[digit-argument <9>]."))) + + ;;; Macros and inlined functions. @@ -1267,8 +1323,65 @@ These are: (defun logview-mode-help () (interactive) - ;; FIXME: Write - ) + ;; Just reinitialize the buffer every time to simplify development. + (with-current-buffer (get-buffer-create "*Logview cheat sheet*") + (let ((inhibit-read-only t)) + (with-silent-modifications + (widen) + (delete-region 1 (1+ (buffer-size))) + (let ((keys-width 0)) + (dolist (section logview--cheat-sheet) + (dolist (entry (cdr section)) + ;; Second argument is a hack to prefer 'l 1' to 'l e' and similar. + (setq keys-width (max keys-width (length (logview--help-format-keys entry "[1-5]")))))) + (dolist (section logview--cheat-sheet) + (unless (bobp) + (insert "\n")) + (insert (propertize (car section) 'face (if (display-graphic-p) 'bold 'font-lock-keyword-face)) "\n") + (dolist (entry (cdr section)) + (if (listp entry) + (insert " " (logview--help-format-keys entry "[1-5]" keys-width) + " " (car (last entry)) "\n") + (insert "\n " (replace-regexp-in-string (rx "\\[" + (group (1+ (any alnum ?-))) + (? " <" (group (1+ (not (any ?>)))) ">") + "]") + (lambda (text) + (save-match-data + (logview--help-format-keys (list (intern (match-string 1 text))) (match-string 2 text)))) + entry t t) + "\n"))))))) + (goto-char 1) + (help-mode) + (let ((map (make-sparse-keymap))) + (set-keymap-parent map help-mode-map) + (substitute-key-definition 'revert-buffer 'undefined map help-mode-map) + (use-local-map map))) + (pop-to-buffer "*Logview cheat sheet*")) + +(defun logview--help-format-keys (entry &optional preferred-keys width) + (if (listp entry) + (let ((strings)) + (dolist (symbol entry) + (when (symbolp symbol) + (let ((best-length most-positive-fixnum) + (matched-preferred-keys) + (keys)) + (dolist (alternative (where-is-internal symbol logview-mode-map)) + (setq alternative (key-description alternative) + matches-preferred-keys (when preferred-keys (string-match preferred-keys alternative))) + (when (or (< (length alternative) best-length) + (and (= (length alternative) best-length) + matches-preferred-keys + (not matched-preferred-keys))) + (setq keys alternative + best-length (length keys)))) + (push (if keys (propertize keys 'face 'font-lock-builtin-face) "") strings)))) + (let ((string (mapconcat 'identity (nreverse strings) " / "))) + (if width + (format (format "%%%ds" width) string) + string))) + "")) (defun logview-refresh-buffer-as-needed () "Append log file tail or else revert the whole buffer.