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

    For better usability always split current window vertically when creating 
filter popup; position cursor in it better.
---
 logview.el | 203 ++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 100 insertions(+), 103 deletions(-)

diff --git a/logview.el b/logview.el
index 20a4327512..a8e5acf0d7 100644
--- a/logview.el
+++ b/logview.el
@@ -404,68 +404,45 @@ You can temporarily change this on per-buffer basis using
                                              (group bow "NAME" eow)
                                              (group bow "THREAD" eow))))
 
+(defconst logview--valid-filter-prefixes '("a+" "a-" "t+" "t-" "m+" "m-"))
 
-(defvar logview--entry-regexp)
-(make-variable-buffer-local 'logview--entry-regexp)
 
-(defvar logview--submode-features)
-(make-variable-buffer-local 'logview--submode-features)
+(defvar-local logview--entry-regexp nil)
+(defvar-local logview--submode-features nil)
 
-(defvar logview--submode-level-alist nil
+(defvar-local logview--submode-level-alist nil
   "Submode levels mapped to final levels.
 Levels are ordered least to most important.")
-(make-variable-buffer-local 'logview--submode-level-alist)
 
-(defvar logview--submode-level-data nil
+(defvar-local logview--submode-level-data nil
   "An alist of level string to the following lists:
 - level symbol (for quick filtering);
 - level entry face;
 - level string face.")
-(make-variable-buffer-local 'logview--submode-level-data)
 
-(defvar logview--min-shown-level)
-(make-variable-buffer-local 'logview--min-shown-level)
+(defvar-local logview--min-shown-level nil)
+(defvar-local logview--as-important-levels nil)
 
-(defvar logview--as-important-levels)
-(make-variable-buffer-local 'logview--as-important-levels)
-
-(defvar logview--applied-filters '(nil nil nil nil nil nil))
-(make-variable-buffer-local 'logview--applied-filters)
-
-(defvar logview--all-current-filters)
-(make-variable-buffer-local 'logview--all-current-filters)
-
-(defvar logview--include-name-regexp)
-(make-variable-buffer-local 'logview--include-name-regexp)
-
-(defvar logview--exclude-name-regexp)
-(make-variable-buffer-local 'logview--exclude-name-regexp)
-
-(defvar logview--include-thread-regexp)
-(make-variable-buffer-local 'logview--include-thread-regexp)
-
-(defvar logview--exclude-thread-regexp)
-(make-variable-buffer-local 'logview--exclude-thread-regexp)
-
-(defvar logview--include-message-regexp)
-(make-variable-buffer-local 'logview--include-message-regexp)
-
-(defvar logview--exclude-message-regexp)
-(make-variable-buffer-local 'logview--exclude-message-regexp)
+(defvar-local logview--applied-filters '(nil nil nil nil nil nil))
+(defvar-local logview--all-current-filters    nil)
+(defvar-local logview--include-name-regexp    nil)
+(defvar-local logview--exclude-name-regexp    nil)
+(defvar-local logview--include-thread-regexp  nil)
+(defvar-local logview--exclude-thread-regexp  nil)
+(defvar-local logview--include-message-regexp nil)
+(defvar-local logview--exclude-message-regexp nil)
 
 (defvar logview--name-regexp-history)
 (defvar logview--thread-regexp-history)
 (defvar logview--message-regexp-history)
 
-(defvar logview--process-buffer-changes)
-(make-variable-buffer-local 'logview--process-buffer-changes)
+(defvar-local logview--process-buffer-changes nil)
 
-(defvar logview--filter-editing-buffer)
-(make-variable-buffer-local 'logview--filter-editing-buffer)
+(defvar-local logview--filter-editing-buffer nil)
 
 
-(defvar logview-filter-edit--parent-buffer)
-(make-variable-buffer-local 'logview-filter-edit--parent-buffer)
+(defvar-local logview-filter-edit--parent-buffer nil)
+(defvar-local logview-filter-edit--window-configuration nil)
 
 (defvar logview-filter-edit--hint-comment
   "# Press C-c C-c to save edited filters, C-c C-k to quit without saving.
@@ -863,13 +840,17 @@ hidden."
 (defun logview-edit-filters ()
   (interactive)
   (let ((self    (current-buffer))
+        (windows (current-window-configuration))
         (filters logview--all-current-filters))
     (unless (buffer-live-p logview--filter-editing-buffer)
       (setq logview--filter-editing-buffer (generate-new-buffer (format "%s: 
Filters" (buffer-name)))))
-    (pop-to-buffer logview--filter-editing-buffer)
+    (split-window-vertically)
+    (other-window 1)
+    (switch-to-buffer logview--filter-editing-buffer)
     (unless (eq major-mode 'logview-filter-edit-mode)
       (logview-filter-edit-mode))
-    (setq logview-filter-edit--parent-buffer self)
+    (setq logview-filter-edit--parent-buffer        self
+          logview-filter-edit--window-configuration windows)
     (logview-filter-edit--initialize-text filters)))
 
 (defun logview-add-include-name-filter ()
@@ -1000,7 +981,7 @@ entries and cancel any narrowing restrictions."
   (when (memq 'level logview--submode-features)
     (logview-reset-level-filters))
   (when (or (memq 'name logview--submode-features) (memq 'thread 
logview--submode-features) also-cancel-explicit-hiding)
-    (logview--parse-filters t)
+    (logview--parse-filters logview--valid-filter-prefixes)
     (logview--apply-parsed-filters also-cancel-explicit-hiding)))
 
 
@@ -1410,25 +1391,25 @@ See `logview--iterate-entries-forward' for details."
       (with-temp-buffer
         (insert filters)
         (goto-char 1)
-        (while (not (eobp))
-          (logview--with-next-filter-lines
-           (lambda (type line-begin begin end)
-             (let ((filter-line       (not (member type '("#" "" nil))))
-                   (reset-this-filter (or (eq to-reset t) (member type 
to-reset))))
-               (when reset-this-filter
-                 (delete-region begin (point)))
-               (when (not (and filter-line reset-this-filter))
-                 (push (buffer-substring-no-properties line-begin (point)) 
non-discarded-lines))
-               (when (and filter-line (not reset-this-filter))
-                 (let ((regexp (logview--filter-regexp begin end)))
-                   (when (logview--valid-regexp-p regexp)
-                     (pcase type
-                       ("a+" (push regexp include-name-regexps))
-                       ("a-" (push regexp exclude-name-regexps))
-                       ("t+" (push regexp include-thread-regexps))
-                       ("t-" (push regexp exclude-thread-regexps))
-                       ("m+" (push regexp include-message-regexps))
-                       ("m-" (push regexp exclude-message-regexps)))))))))))
+        (logview--iterate-filter-lines
+         (lambda (type line-begin begin end)
+           (let ((filter-line       (not (member type '("#" "" nil))))
+                 (reset-this-filter (member type to-reset)))
+             (when reset-this-filter
+               (delete-region begin (point)))
+             (when (not (and filter-line reset-this-filter))
+               (push (buffer-substring-no-properties line-begin (point)) 
non-discarded-lines))
+             (when (and filter-line (not reset-this-filter))
+               (let ((regexp (logview--filter-regexp begin end)))
+                 (when (logview--valid-regexp-p regexp)
+                   (pcase type
+                     ("a+" (push regexp include-name-regexps))
+                     ("a-" (push regexp exclude-name-regexps))
+                     ("t+" (push regexp include-thread-regexps))
+                     ("t-" (push regexp exclude-thread-regexps))
+                     ("m+" (push regexp include-message-regexps))
+                     ("m-" (push regexp exclude-message-regexps))))))
+             t))))
       (setq logview--all-current-filters    (apply 'concat (nreverse 
non-discarded-lines))
             logview--include-name-regexp    (logview--build-filter-regexp 
include-name-regexps)
             logview--exclude-name-regexp    (logview--build-filter-regexp 
exclude-name-regexps)
@@ -1437,9 +1418,10 @@ See `logview--iterate-entries-forward' for details."
             logview--include-message-regexp (logview--build-filter-regexp 
include-message-regexps)
             logview--exclude-message-regexp (logview--build-filter-regexp 
exclude-message-regexps)))))
 
-(defun logview--with-next-filter-lines (callback)
-  "Find next filter specification in the current buffer.
-Buffer must be positioned at the start of a line.
+(defun logview--iterate-filter-lines (callback)
+  "Find successive filter specification in the current buffer.
+Buffer must be positioned at the start of a line.  Iteration
+continues until CALLBACK returns nil or end of buffer is reached.
 
 CALLBACK is called with four arguments: TYPE, LINE-BEGIN, BEGIN,
 and END.  TYPE may be a string: \"a+\", \"a-\", \"t+\", \"t-\", \"m+\" or
@@ -1450,19 +1432,24 @@ message filters.  LINE-BEGIN is the beginnig of the 
line where
 the entry starts; in case of filters this is a few charaters
 before BEGIN.  Point is positioned at the start of next line,
 which is usually one line beyond END."
-  (let* ((line-begin       (point))
-         (begin            line-begin)
-         (case-fold-search nil)
-         (type             (when (looking-at "\\([atm][-+]\\) 
\\|\\s-*\\(#\\)\\|\\s-*$")
-                             (if (match-beginning 1)
-                                 (progn (setq begin (match-end 0))
-                                        (match-string 1))
-                               (or (match-string 2) "")))))
-    (forward-line)
-    (when (member type '("m+" "m-"))
-      (while (looking-at "\\.\\. ")
-        (forward-line)))
-    (funcall callback type line-begin begin (if (bolp) 
(logview--linefeed-back-checked (point)) (point)))))
+  (let ((case-fold-search nil)
+        line-begin
+        begin
+        type)
+    (while (and (not (eobp))
+                (progn
+                  (setq line-begin (point)
+                        begin      line-begin
+                        type       (when (looking-at "\\([atm][-+]\\) 
\\|\\s-*\\(#\\)\\|\\s-*$")
+                                     (if (match-beginning 1)
+                                         (progn (setq begin (match-end 0))
+                                                (match-string 1))
+                                       (or (match-string 2) ""))))
+                  (forward-line)
+                  (when (member type '("m+" "m-"))
+                    (while (looking-at "\\.\\. ")
+                      (forward-line)))
+                  (funcall callback type line-begin begin (if (bolp) 
(logview--linefeed-back-checked (point)) (point))))))))
 
 (defun logview--filter-regexp (begin end)
   (replace-regexp-in-string "\n\\.\\. " "\n" (buffer-substring-no-properties 
begin end)))
@@ -1725,10 +1712,12 @@ Optional third argument is to make the function 
suitable for
 
 (defun logview-filter-edit--quit (save)
   (let ((parent  logview-filter-edit--parent-buffer)
+        (windows logview-filter-edit--window-configuration)
         (filters (when save
                    (buffer-substring-no-properties 1 (1+ (buffer-size))))))
-    (quit-window t)
+    (kill-buffer)
     (switch-to-buffer parent)
+    (set-window-configuration windows)
     (when save
       (setq logview--all-current-filters filters)
       (logview--parse-filters)
@@ -1739,36 +1728,44 @@ Optional third argument is to make the function 
suitable for
     (setq text (concat logview-filter-edit--hint-comment text)))
   (delete-region 1 (1+ (buffer-size)))
   (insert text)
+  (unless (bolp)
+    (insert "\n"))
+  ;; Put cursor at the first filter beginning if possible.
+  (goto-char 1)
+  (logview--iterate-filter-lines (lambda (type line-begin begin end)
+                                   (if (member type 
logview--valid-filter-prefixes)
+                                       (progn (goto-char begin) nil)
+                                     t)))
   (set-buffer-modified-p nil))
 
-(defun logview-filter-edit--font-lock-region (begin end &optional _old-length)
+(defun logview-filter-edit--font-lock-region (region-begin region-end 
&optional _old-length)
   (save-excursion
     (save-match-data
       (save-restriction
         (with-silent-modifications
           (widen)
-          (goto-char begin)
+          (goto-char region-begin)
           (forward-line 0)
-          (while (progn (logview--with-next-filter-lines
-                         (lambda (type line-begin begin end)
-                           (cond ((null type)
-                                  (put-text-property begin end 'face 'error))
-                                 ((string= type "#")
-                                  (put-text-property begin end 'face 
'font-lock-comment-face))
-                                 ((string= type "")
-                                  (put-text-property begin end 'face nil))
-                                 (t
-                                  (let* ((valid (logview--valid-regexp-p 
(logview--filter-regexp begin end))))
-                                    (goto-char begin)
-                                    (while (let ((from (point)))
-                                             (put-text-property (- from 3) 
from 'face 'logview-edit-filters-type-prefix)
-                                             (forward-line)
-                                             (put-text-property from (if 
(bolp) (logview--linefeed-back (point)) (point))
-                                                                'face (unless 
valid 'error))
-                                             (when (< (point) end)
-                                               (forward-char 3)
-                                               t))))))))
-                        (< (point) end))))))))
+          (logview--iterate-filter-lines
+           (lambda (type _line-begin begin end)
+             (cond ((null type)
+                    (put-text-property begin end 'face 'error))
+                   ((string= type "#")
+                    (put-text-property begin end 'face 
'font-lock-comment-face))
+                   ((string= type "")
+                    (put-text-property begin end 'face nil))
+                   (t
+                    (let* ((valid (logview--valid-regexp-p 
(logview--filter-regexp begin end))))
+                      (goto-char begin)
+                      (while (let ((from (point)))
+                               (put-text-property (- from 3) from 'face 
'logview-edit-filters-type-prefix)
+                               (forward-line)
+                               (put-text-property from (if (bolp) 
(logview--linefeed-back (point)) (point))
+                                                  'face (unless valid 'error))
+                               (when (< (point) end)
+                                 (forward-char 3)
+                                 t))))))
+             (< (point) region-end))))))))
 
 
 (provide 'logview)

Reply via email to