branch: elpa/logview
commit 98c385517774e8ee2751aacbb9fdde38d1ff0c38
Author: Paul Pogonyshev <pogonys...@gmail.com>
Commit: Paul Pogonyshev <pogonys...@gmail.com>

    When customizing variables related to submode guessing, automatically try 
to guess again in buffers where this previously failed.
---
 logview.el | 67 +++++++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 40 insertions(+), 27 deletions(-)

diff --git a/logview.el b/logview.el
index 0bf53b2224..3e0ac2fd53 100644
--- a/logview.el
+++ b/logview.el
@@ -49,6 +49,13 @@
   :group 'text)
 
 
+(defun logview--set-submode-affecting-variable (variable value)
+  (set variable value)
+  (dolist (buffer (buffer-list))
+    (with-current-buffer buffer
+      (when (and (eq major-mode 'logview-mode) (not (logview-initialized-p)))
+        (logview--guess-submode)))))
+
 (defcustom logview-additional-submodes nil
   "Association list of log submodes (file parsing rules).
 
@@ -96,7 +103,9 @@ aliases  [optional]
                               (set :inline t
                                    (cons :tag "" (const :tag "Level map:" 
levels)    string)
                                    (cons :tag "" (const :tag "Timestamp:" 
timestamp) (repeat string))
-                                   (cons :tag "" (const :tag "Aliases:"   
aliases)   (repeat string)))))))
+                                   (cons :tag "" (const :tag "Aliases:"   
aliases)   (repeat string))))))
+  :set   'logview--set-submode-affecting-variable
+  :set-after '(logview-additional-timestamp-formats 
logview-additional-level-mappings))
 
 (defcustom logview-additional-level-mappings nil
   "Association list of log level mappings.
@@ -149,7 +158,8 @@ as the name."
                               (cons :tag "" (const :tag "Debug levels:"       
debug)       (repeat string))
                               (cons :tag "" (const :tag "Trace levels:"       
trace)       (repeat string))
                               (set :inline t
-                                   (cons :tag "" (const :tag "Aliases:" 
aliases) (repeat string)))))))
+                                   (cons :tag "" (const :tag "Aliases:" 
aliases) (repeat string))))))
+  :set   'logview--set-submode-affecting-variable)
 
 (defcustom logview-additional-timestamp-formats nil
   "Association list of additional timestamp formats.
@@ -173,7 +183,8 @@ work just as the name."
                         (list :tag "Definition"
                               (cons :tag "" (const :tag "Format:"  regexp)  
regexp)
                               (set :inline t
-                                   (cons :tag "" (const :tag "Aliases:" 
aliases) (repeat string)))))))
+                                   (cons :tag "" (const :tag "Aliases:" 
aliases) (repeat string))))))
+  :set   'logview--set-submode-affecting-variable)
 
 
 (defcustom logview-copy-visible-text-only t
@@ -527,18 +538,16 @@ successfully.")
 (define-derived-mode logview-mode nil "Logview"
   "Major mode for viewing and filtering various log files."
   (logview--update-invisibility-spec)
-  (logview--guess-submode)
-  (logview--split-region-into-entries (point-min) (point-max) 'report-progress)
-  (add-hook 'after-change-functions 'logview--split-region-into-entries t t)
-  (when logview--entry-regexp
-    (read-only-mode 1))
-  (add-hook 'read-only-mode-hook 'logview--update-keymap nil t)
   (logview--update-keymap)
+  (add-hook 'read-only-mode-hook 'logview--update-keymap nil t)
   (set (make-local-variable 'filter-buffer-substring-function) 
'logview--buffer-substring-filter)
-  (add-hook 'change-major-mode-hook 'logview--exiting-mode nil t))
+  (add-hook 'change-major-mode-hook 'logview--exiting-mode nil t)
+  (logview--guess-submode)
+  (unless (logview-initialized-p)
+    (message "Cannot determine log format; press C-c C-s to customize relevant 
options")))
 
 (defun logview--update-keymap ()
-  (use-local-map (if (and buffer-read-only logview--entry-regexp)
+  (use-local-map (if (and buffer-read-only (logview-initialized-p))
                      logview-mode-map
                    logview-mode-inactive-map)))
 
@@ -549,20 +558,8 @@ successfully.")
   (logview--std-matching-and-altering
     (remove-text-properties 1 (1+ (buffer-size)) '(face nil invisible nil))))
 
-(defun logview--guess-submode ()
-  (save-excursion
-    (save-restriction
-      (widen)
-      (goto-char 1)
-      (end-of-line)
-      (let ((first-line (buffer-substring 1 (point))))
-        (catch 'success
-          (logview--iterate-split-alists (lambda (name definition)
-                                           (condition-case error
-                                               (logview--initialize-submode 
name definition first-line)
-                                             (error (warn 
(error-message-string error)))))
-                                         logview-additional-submodes 
logview-std-submodes)
-          (message "Cannot determine log format; press C-c C-s to customize 
relevant options"))))))
+(defun logview-initialized-p ()
+  (not (null logview--entry-regexp)))
 
 
 
@@ -1043,6 +1040,20 @@ These are:
 
 ;;; Internal functions (except helpers for specific command groups).
 
+(defun logview--guess-submode ()
+  (save-excursion
+    (save-restriction
+      (widen)
+      (goto-char 1)
+      (end-of-line)
+      (let ((first-line (buffer-substring 1 (point))))
+        (catch 'success
+          (logview--iterate-split-alists (lambda (name definition)
+                                           (condition-case error
+                                               (logview--initialize-submode 
name definition first-line)
+                                             (error (warn 
(error-message-string error)))))
+                                         logview-additional-submodes 
logview-std-submodes))))))
+
 (defun logview--initialize-submode (name definition test-line)
   (let* ((format    (cdr (assq 'format    definition)))
          (timestamp (cdr (assq 'timestamp definition))))
@@ -1116,7 +1127,9 @@ These are:
                                           (intern (format "logview-%s-entry" 
(symbol-name final-level)))
                                           (intern (format "logview-level-%s" 
(symbol-name final-level)))))
                         logview--submode-level-data))))
-            (logview--update-keymap)
+            (logview--split-region-into-entries (point-min) (point-max) 
'report-progress)
+            (add-hook 'after-change-functions 
'logview--split-region-into-entries t t)
+            (read-only-mode 1)
             (throw 'success nil))
         (when (not (memq 'timestamp features))
           ;; Else we will maybe retry with different timestamp formats.
@@ -1124,7 +1137,7 @@ These are:
 
 
 (defun logview--assert (&rest assertions)
-  (unless logview--entry-regexp
+  (unless (logview-initialized-p)
     (error "Couldn't determine log format; press C-c C-s to customize relevant 
options"))
   (dolist (assertion assertions)
     (unless (memq assertion logview--submode-features)

Reply via email to