[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Changes to grep/src/grep.c

From: Charles Levert
Subject: Changes to grep/src/grep.c
Date: Mon, 20 Jun 2005 21:04:39 -0400

Index: grep/src/grep.c
diff -u grep/src/grep.c:1.99 grep/src/grep.c:1.100
--- grep/src/grep.c:1.99        Tue Jun 14 20:56:42 2005
+++ grep/src/grep.c     Tue Jun 21 01:04:39 2005
@@ -82,8 +82,63 @@
    variable GREP_COLOR.  The default is to print red.  */
 static const char *grep_color = "01;31";
-/* Select Graphic Rendition (SGR) strings.  */
-/* Also Erase in Line (EL) to Right by default.  */
+/* Select Graphic Rendition (SGR, "\33[...m") strings.  */
+/* Also Erase in Line (EL) to Right ("\33[K") by default.  */
+/*    Why have EL to Right after SGR?
+        -- The behavior of line-wrapping when at the bottom of the
+           terminal screen and at the end of the current line is often
+           such that a new line is introduced, entirely cleared with
+           the current background color which may be different from the
+           default one (see the boolean back_color_erase terminfo(5)
+           capability), thus scrolling the display by one line.
+           The end of this new line will stay in this background color
+           even after reverting to the default background color with
+           "\33[m', unless it is explicitly cleared again with "\33[K"
+           (which is the behavior the user would instinctively expect
+           from the whole thing).  There may be some unavoidable
+           background-color flicker at the end of this new line because
+           of this (when timing with the monitor's redraw is just right).
+        -- The behavior of HT (tab, "\t") is usually the same as that of
+           Cursor Forward Tabulation (CHT) with a default parameter
+           of 1 ("\33[I"), i.e., it performs pure movement to the next
+           tab stop, without any clearing of either content or screen
+           attributes (including background color); try
+              echo -ne 'asdfqwerzxcv\rASDF\tZXCV\n'
+           in a bash(1) shell to demonstrate this.  This is not what the
+           user would instinctively expect of HT (but is ok for CHT).
+           The instinctive behavior would include clearing the terminal
+           cells that are skipped over by HT with blank cells in the
+           current screen attributes, including background color;
+           the boolean dest_tabs_magic_smso terminfo(5) capability
+           indicates this saner behavior for HT, but only some rare
+           terminals have it (although it also indicates a special
+           glitch with standout mode in the Teleray terminal for which
+           it was initially introduced).  The remedy is to add "\33K"
+           after each SGR sequence, be it START (to fix the behavior
+           of any HT after that before another SGR) or END (to fix the
+           behavior of an HT in default background color that would
+           follow a line-wrapping at the bottom of the screen in another
+           background color, and to complement doing it after START).
+           Piping grep's output through a pager such as less(1) avoids
+           any HT problems since the pager performs tab expansion.
+      Generic disadvantages of this remedy are:
+        -- Some very rare terminals might support SGR but not EL (nobody
+           will use "grep --color" on a terminal that does not support
+           SGR in the first place).
+        -- Having these extra control sequences might somewhat complicate
+           the task of any program trying to parse "grep --color"
+           output in order to extract structuring information from it.
+      A specific disadvantage to doing it after SGR START is:
+        -- Even more possible background color flicker (when timing
+           with the monitor's redraw is just right), even when not at the
+           bottom of the screen.
+      There are no additional disadvantages specific to doing it after
+      SGR END.
+      It would be impractical for GNU grep to become a full-fledged
+      terminal program linked against ncurses or the like, so it will
+      not detect terminfo(5) capabilities.  */
 #define SGR_START "\33[%sm\33[K"
 #define SGR_END   "\33[m\33[K"

reply via email to

[Prev in Thread] Current Thread [Next in Thread]