unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Elijah G <eg642616@gmail.com>
To: sbaugh@catern.com
Cc: Eli Zaretskii <eliz@gnu.org>,
	Spencer Baugh <sbaugh@janestreet.com>,
	philipk@posteo.net, emacs-devel@gnu.org,
	Po Lu <luangruo@yahoo.com>
Subject: Re: [PATCH] Flymake Support Indicator Errors in Margin
Date: Wed, 27 Mar 2024 15:29:28 -0600	[thread overview]
Message-ID: <CACnP4N+r6aoGOjSHxJAEfT6+jY7bEWYkw7UeRx6iy-w0D+39Ag@mail.gmail.com> (raw)
In-Reply-To: <871q7w4jn7.fsf@catern.com>

[-- Attachment #1: Type: text/plain, Size: 203 bytes --]

I've now updated the patch to allow auto resize margins and using margins
when it's in terminal frames.

Sadly I couldn't find anything for detecting HDiPI frames, so the user
must have to configure it.

[-- Attachment #2: 0001-Flymake-support-for-indicating-errors-in-margin.patch --]
[-- Type: application/octet-stream, Size: 9680 bytes --]

From b8f4c14b868f94fcf4e5a4ea3a86900919b0b244 Mon Sep 17 00:00:00 2001
From: "Elias G. B. Perez" <eg642616@gmail.com>
Date: Wed, 27 Mar 2024 14:27:19 -0600
Subject: [PATCH] Flymake support for indicating errors in margin

Add optional support for display flymake error in margin that
allow displaying error indicators in terminal frames.
* lisp/progmodes/flymake.el (flymake-indicator-type):
(flymake-margin-indicators-string, flymake-autoresize-margins)
(flymake-margin-indicator-position): New user options.
(flymake-original-margin-width): Add buffer-local variable for
store original buffer margin width.
(flymake-error, flymake-warning, flymake-note): Use new margin
value.
(flymake--fringe-overlay-spec): Change function name.
(flymake--indicator-overlay-spec): New function.
(flymake--resize-margins): New function for resize margins in
current buffer.
(flymake--highlight-line, flymake-mode): Rework.
---
 lisp/progmodes/flymake.el | 131 +++++++++++++++++++++++++++++++++-----
 1 file changed, 116 insertions(+), 15 deletions(-)

diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index db00cc59c0e..41750d56070 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -180,6 +180,58 @@ flymake-fringe-indicator-position
 		 (const right-fringe)
 		 (const :tag "No fringe indicators" nil)))
 
+(defcustom flymake-indicator-type (if (display-graphic-p)
+                                      'fringes
+                                    'margins)
+  "Indicate which indicator type to use for display errors.
+
+The value can be nil (dont indicate errors but just highlight them),
+fringes (use fringes) or margins (use margins)
+
+Difference between fringes and margin is that fringes support diplaying
+bitmaps on graphical displays and margins display text in a blank area
+of buffer that works in both graphical and text displays.
+
+See Info node `Fringes' and Info node `(elisp)Display Margins'."
+  :version "30.1"
+  :type '(choice (const :tag "Use Fringes" fringes)
+                 (const :tag "Use Margins "margins)
+                 (const :tag "No indicators" nil)))
+
+(defcustom flymake-margin-indicators-string
+  '((error "!!" compilation-error)
+    (warning "!" compilation-warning)
+    (note "!" compilation-info))
+  "Strings used for margins indicators.
+The value of each list may be a list of 3 elements where specifies the
+error type, its string to use and its face,
+or a list of 2 elements specifying only the error type and its string.
+Indicators can be an ASCII or non-ASCII string.
+
+The option `flymake-margin-indicator-position' controls how and where
+this is used."
+  :version "30.1"
+  :type '(repeat :tag "Error types lists"
+                 (list :tag "String and face for error types"
+                       (symbol :tag "Error type")
+                       (string :tag "String")
+                       (face :tag "Face"))))
+
+(defcustom flymake-autoresize-margins t
+  "If non-nil automatically resize margin-width.
+Only if `flymake-indicator-type' is set to margins."
+  :version "30.1"
+  :type 'boolean)
+
+(defcustom flymake-margin-indicator-position 'left-margin
+  "The position to put Flymake margin indicator.
+The value can be nil (do not use indicators), `left-margin' or `right-margin'.
+See `flymake-margin-indicators-string'."
+  :version "30.1"
+  :type '(choice (const left-margin)
+                 (const right-margin)
+                 (const :tag "No margin indicators" nil)))
+
 (make-obsolete-variable 'flymake-start-syntax-check-on-newline
 		        "can check on newline in post-self-insert-hook"
                         "27.1")
@@ -258,6 +310,9 @@ flymake-timer
 (defvar-local flymake-check-start-time nil
   "Time at which syntax check was started.")
 
+(defvar-local flymake-original-margin-width nil
+  "Store original margin width")
+
 (defun flymake--log-1 (level sublog msg &rest args)
   "Do actual work for `flymake-log'."
   (let (;; never popup the log buffer
@@ -630,6 +685,7 @@ flymake-diagnostic-types-alist
 
 (put 'flymake-error 'face 'flymake-error)
 (put 'flymake-error 'flymake-bitmap 'flymake-error-bitmap)
+(put 'flymake-error 'flymake-margin-string (alist-get 'error flymake-margin-indicators-string))
 (put 'flymake-error 'severity (warning-numeric-level :error))
 (put 'flymake-error 'mode-line-face 'flymake-error-echo)
 (put 'flymake-error 'echo-face 'flymake-error-echo)
@@ -638,6 +694,7 @@ flymake-diagnostic-types-alist
 
 (put 'flymake-warning 'face 'flymake-warning)
 (put 'flymake-warning 'flymake-bitmap 'flymake-warning-bitmap)
+(put 'flymake-warning 'flymake-margin-string (alist-get 'warning flymake-margin-indicators-string))
 (put 'flymake-warning 'severity (warning-numeric-level :warning))
 (put 'flymake-warning 'mode-line-face 'flymake-warning-echo)
 (put 'flymake-warning 'echo-face 'flymake-warning-echo)
@@ -646,6 +703,7 @@ flymake-diagnostic-types-alist
 
 (put 'flymake-note 'face 'flymake-note)
 (put 'flymake-note 'flymake-bitmap 'flymake-note-bitmap)
+(put 'flymake-note 'flymake-margin-string (alist-get 'note flymake-margin-indicators-string))
 (put 'flymake-note 'severity (warning-numeric-level :debug))
 (put 'flymake-note 'mode-line-face 'flymake-note-echo)
 (put 'flymake-note 'echo-face 'flymake-note-echo)
@@ -682,19 +740,53 @@ flymake--severity
   (flymake--lookup-type-property type 'severity
                                  (warning-numeric-level :error)))
 
-(defun flymake--fringe-overlay-spec (bitmap &optional recursed)
-  (if (and (symbolp bitmap)
-           (boundp bitmap)
-           (not recursed))
-      (flymake--fringe-overlay-spec
-       (symbol-value bitmap) t)
-    (and flymake-fringe-indicator-position
-         bitmap
-         (propertize "!" 'display
-                     (cons flymake-fringe-indicator-position
-                           (if (listp bitmap)
-                               bitmap
-                             (list bitmap)))))))
+(defun flymake--indicator-overlay-spec (indicator)
+  "Return INDICATOR as propertized string to use in error indicators."
+  (let* ((value (if (symbolp indicator)
+                    (symbol-value indicator)
+                  indicator))
+         (indicator-car (if (listp value)
+                            (car value)
+                          value))
+         (indicator-cdr (if (listp value)
+                            (cdr value))))
+    (cond
+     ((symbolp indicator-car)
+      (propertize "!" 'display
+                  (cons flymake-fringe-indicator-position
+                        (if (listp value)
+                            value
+                          (list value)))))
+     ((stringp indicator-car)
+      (propertize "!"
+                  'display
+                  `((margin ,flymake-margin-indicator-position)
+                    ,(propertize
+                      indicator-car
+                      'face
+                      `(:inherit (,indicator-cdr
+                                  default)))))))))
+
+(defun flymake--resize-margins (&optional og-width)
+  "Resize current window margins according `flymake-margin-indicator-position'.
+Return to original margin width if OG-WIDTH is non-nil."
+  (when (and (eq flymake-indicator-type 'margins)
+             flymake-autoresize-margins)
+    (cond
+     ((and og-width flymake-original-margin-width)
+      (if (eq flymake-margin-indicator-position 'left-margin)
+          (setq-local left-margin-width flymake-original-margin-width)
+        (setq-local right-margin-width flymake-original-margin-width)))
+     (t
+      (if (eq flymake-margin-indicator-position 'left-margin)
+          (setq-local flymake-original-margin-width left-margin-width
+                      left-margin-width 2)
+        (setq-local flymake-original-margin-width right-margin-width
+                    right-margin-width 2))))
+    ;; Apply margin to all windows avalaibles
+    (mapc (lambda (x)
+            (set-window-buffer x (window-buffer x)))
+          (get-buffer-window-list nil nil 'visible))))
 
 (defun flymake--equal-diagnostic-p (a b)
   "Tell if A and B are equivalent `flymake--diag' objects."
@@ -840,10 +932,13 @@ flymake--highlight-line
                                         type prop value)))))
       (default-maybe 'face 'flymake-error)
       (default-maybe 'before-string
-        (flymake--fringe-overlay-spec
+        (flymake--indicator-overlay-spec
          (flymake--lookup-type-property
           type
-          'flymake-bitmap
+          (cond ((eq flymake-indicator-type 'fringes)
+                 'flymake-bitmap)
+                ((eq flymake-indicator-type 'margins)
+                 'flymake-margin-string))
           (alist-get 'bitmap (alist-get type ; backward compat
                                         flymake-diagnostic-types-alist)))))
       ;; (default-maybe 'after-string
@@ -1285,6 +1380,9 @@ flymake-mode
     (add-hook 'kill-buffer-hook 'flymake-kill-buffer-hook nil t)
     (add-hook 'eldoc-documentation-functions 'flymake-eldoc-function t t)
 
+    ;; AutoResize margins.
+    (flymake--resize-margins)
+
     ;; If Flymake happened to be already ON, we must cleanup
     ;; existing diagnostic overlays, lest we forget them by blindly
     ;; reinitializing `flymake--state' in the next line.
@@ -1333,6 +1431,9 @@ flymake-mode
     ;;+(remove-hook 'find-file-hook (function flymake-find-file-hook) t)
     (remove-hook 'eldoc-documentation-functions 'flymake-eldoc-function t)
 
+    ;; return margin to original size
+    (flymake--resize-margins t)
+
     (when flymake-timer
       (cancel-timer flymake-timer)
       (setq flymake-timer nil))
-- 
2.44.0.windows.1


  parent reply	other threads:[~2024-03-27 21:29 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-11 23:18 [PATCH] Flymake Support Indicator Errors in Margin Elijah G
2024-03-12  9:24 ` Philip Kaludercic
2024-03-12 17:22   ` Elijah G
2024-03-13 12:18     ` Eli Zaretskii
2024-03-14  1:50       ` Elijah G
2024-03-14 11:05         ` Eli Zaretskii
2024-03-14 11:28           ` João Távora
2024-03-14 15:35           ` Elijah G
2024-03-16 11:10             ` Eli Zaretskii
2024-03-17 16:44               ` bird
2024-03-17 17:01                 ` Eli Zaretskii
2024-03-17 17:34                 ` Elijah G
2024-03-17 18:43                   ` bird
2024-03-17 19:21                     ` Elijah G
2024-03-25  1:46                       ` Elijah G
2024-03-27  0:13                         ` sbaugh
2024-03-27  0:36                           ` Elijah G
2024-03-27 21:29                           ` Elijah G [this message]
2024-03-28  6:01                             ` Eli Zaretskii
2024-03-28 17:34                               ` Elijah G
2024-04-06 11:36                                 ` Eli Zaretskii
2024-03-28  7:30                             ` Juri Linkov
2024-03-28 17:44                               ` Elijah G
2024-04-06 11:35                             ` Eli Zaretskii
2024-04-06 20:14                               ` Elijah G
2024-04-07  5:47                                 ` Eli Zaretskii
2024-04-07 17:20                                   ` Elijah G
2024-04-18  9:10                                     ` Eli Zaretskii
2024-03-19  7:03                   ` Augusto Stoffel
2024-03-17 17:49                 ` Elijah G
2024-03-19  7:04                   ` Augusto Stoffel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACnP4N+r6aoGOjSHxJAEfT6+jY7bEWYkw7UeRx6iy-w0D+39Ag@mail.gmail.com \
    --to=eg642616@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=luangruo@yahoo.com \
    --cc=philipk@posteo.net \
    --cc=sbaugh@catern.com \
    --cc=sbaugh@janestreet.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).