Community
    • Login

    How to highlight lines with color one by one?

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    22 Posts 7 Posters 3.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Heart StrongH
      Heart Strong
      last edited by

      like zebra? zebra.png

      Alan KilbornA 1 Reply Last reply Reply Quote 0
      • Alan KilbornA
        Alan Kilborn @Heart Strong
        last edited by

        @heart-strong

        So really what you are asking is how to make every other line stand out in some way, I would guess so that when your eyes are tracking far away from the line number area, that you can tell which line is which?

        You can’t do this with Notepad++ as it ships, but you can do it with a scripting plugin. Here’s an example using the LuaScript plugin: https://dail8859.github.io/LuaScript/examples/stylecsv.lua.html

        1 Reply Last reply Reply Quote 3
        • Alan KilbornA
          Alan Kilborn
          last edited by

          As an alternative method, here’s how to do it with the PythonScript plugin. I call this script BackgroundColorEveryOtherLine.py.

          # -*- coding: utf-8 -*-
          from __future__ import print_function
          
          from Npp import *
          
          class BCEOL(object):
          
              def __init__(self):
                  self.indicator_nbr = 20
                  editor.indicSetStyle(self.indicator_nbr, INDICATORSTYLE.FULLBOX)
                  editor.indicSetFore(self.indicator_nbr, (0xB5, 0xB5, 0xB5))
                  editor.indicSetAlpha(self.indicator_nbr, 100)
                  editor.indicSetOutlineAlpha(self.indicator_nbr, editor.indicGetAlpha(self.indicator_nbr))
                  editor.indicSetUnder(self.indicator_nbr, True)
                  editor.callbackSync(self.updateui_callback, [SCINTILLANOTIFICATION.UPDATEUI])
                  self.updateui_callback(None)
          
              def getLastVisibleLine(self):  # companion to editor.getFirstVisibleLine()
                  first_line = editor.getFirstVisibleLine()
                  last_visible_line = first_line + editor.linesOnScreen()
                  if 1: # deal with the case where (e.g.) viewport is 40 lines but file has only 10 lines of content
                      last_real_line = editor.lineFromPosition(editor.getTextLength())
                      if last_real_line < last_visible_line: last_visible_line = last_real_line
                  return last_visible_line
          
              def clear_ind_from_start_to_end(self, start_pos, end_pos):
                  editor.setIndicatorCurrent(self.indicator_nbr)
                  editor.indicatorClearRange(start_pos, end_pos - start_pos)
          
              def fill_ind_from_start_to_end(self, start_pos, end_pos):
                  editor.setIndicatorCurrent(self.indicator_nbr)
                  editor.indicatorFillRange(start_pos, end_pos - start_pos)
          
              def updateui_callback(self, args):
                  for line_nbr in range(editor.getFirstVisibleLine(), self.getLastVisibleLine() + 1):
                      line_start_pos = editor.positionFromLine(line_nbr)
                      line_end_pos = editor.getLineEndPosition(line_nbr)
                      self.clear_ind_from_start_to_end(line_start_pos, line_end_pos)
                      if line_nbr % 2:  # color every other line
                          self.fill_ind_from_start_to_end(line_start_pos, line_end_pos)
          
          if __name__ == '__main__': BCEOL()
          

          Here’s a bit of the effect:

          72727c0d-5ab1-48f4-b84f-1606e4bae524-image.png

          dailD T WT 2 Replies Last reply Reply Quote 3
          • dailD
            dail @Alan Kilborn
            last edited by

            @alan-kilborn That’s pretty neat. Another option might be to look at markers. SC_MARK_BACKGROUND would give a nice affect since it colors the entire line, not just the text. Though maybe it is easier to manage indicators on each UI update rather than markers.

            1 Reply Last reply Reply Quote 3
            • Alan KilbornA
              Alan Kilborn
              last edited by

              So I took @dail’s suggestion to heart and made a new version of the script that uses markers. I must say that with the coloring extending past the ends of the lines, it is a better effect. Here’s BackgroundColorEveryOtherLine2.py:

              # -*- coding: utf-8 -*-
              from __future__ import print_function
              
              from Npp import *
              
              #-------------------------------------------------------------------------------
              
              def editor_getLastVisibleLine():  # companion to editor.getFirstVisibleLine()
                  first_line = editor.getFirstVisibleLine()
                  last_visible_line = first_line + editor.linesOnScreen()
                  if 1: # deal with the case where (e.g.) viewport is 40 lines but file has only 10 lines of content
                      last_real_line = editor.lineFromPosition(editor.getTextLength())
                      if last_real_line < last_visible_line: last_visible_line = last_real_line
                  return last_visible_line
              
              def editor_indicClearFromPosToPos(indicator_nbr, start_pos, end_pos):
                  # need to do these statements in as quick succession as possible, so that N++ itself doesn't interfere
                  editor.setIndicatorCurrent(indicator_nbr)
                  editor.indicatorClearRange(start_pos, end_pos - start_pos)
              
              def editor_indicFillFromPosToPos(indicator_nbr, start_pos, end_pos):
                  # need to do these statements in as quick succession as possible, so that N++ itself doesn't interfere
                  editor.setIndicatorCurrent(indicator_nbr)
                  editor.indicatorFillRange(start_pos, end_pos - start_pos)
              
              #-------------------------------------------------------------------------------
              
              class BCEOL_with_indicators(object):
              
                  def __init__(self):
                      self.indicator_nbr = 20
                      editor.indicSetStyle(self.indicator_nbr, INDICATORSTYLE.FULLBOX)
                      editor.indicSetFore(self.indicator_nbr, (0xB5, 0xB5, 0xB5))
                      editor.indicSetAlpha(self.indicator_nbr, 100)
                      editor.indicSetOutlineAlpha(self.indicator_nbr, editor.indicGetAlpha(self.indicator_nbr))
                      editor.indicSetUnder(self.indicator_nbr, True)
                      editor.callbackSync(self.updateui_callback, [SCINTILLANOTIFICATION.UPDATEUI])
                      self.updateui_callback(None)
              
                  def updateui_callback(self, args):
                      for line_nbr in range(editor.getFirstVisibleLine(), editor_getLastVisibleLine() + 1):
                          line_start_pos = editor.positionFromLine(line_nbr)
                          line_end_pos = editor.getLineEndPosition(line_nbr)
                          editor_indicClearFromPosToPos(self.indicator_nbr, line_start_pos, line_end_pos)
                          if line_nbr % 2:  # color every other line
                              editor_indicFillFromPosToPos(self.indicator_nbr, line_start_pos, line_end_pos)
              
              #-------------------------------------------------------------------------------
              
              class BCEOL_with_markers(object):
              
                  def __init__(self):
              
                      self.marker_id = 0
                      marker_symbol = MARKERSYMBOL.BACKGROUND
                      editor.markerDefine(self.marker_id, marker_symbol)
                      editor.markerSetBack(self.marker_id, (0xB5, 0xB5, 0xB5))
                      editor.callbackSync(self.updateui_callback, [SCINTILLANOTIFICATION.UPDATEUI])
                      self.updateui_callback(None)
              
                  def updateui_callback(self, args):
                      for line_nbr in range(editor.getFirstVisibleLine(), editor_getLastVisibleLine() + 1):
                          marker_mask = editor.markerGet(line_nbr)
                          has_marker_already = True if (marker_mask & (1 << self.marker_id)) else False
                          if line_nbr % 2:
                              if not has_marker_already: editor.markerAdd(line_nbr, self.marker_id)
                          else:
                              if has_marker_already: editor.markerDelete(line_nbr, self.marker_id)
              
              #-------------------------------------------------------------------------------
              
              if __name__ == '__main__':
                  #BCEOL_with_indicators()
                  BCEOL_with_markers()
              
              

              Here’s a sample of its appearance:

              5d126b86-60d5-41ff-9d8e-70b6cc2d317e-image.png

              1 Reply Last reply Reply Quote 2
              • Alan KilbornA
                Alan Kilborn
                last edited by PeterJones

                So the above is really just a “demo”, but, as sometimes happens here, after writing a demo, I find a real use for it.

                When that happened this time, I noticed that if the script is run while a “view 0” tab is active, it won’t cause the every-other-line shading to happen for a tab in “view 1”.

                This can be avoided by changing the script code to influence both editor1 and editor2.

                For the marker-based coloring, the marker init code could be changed to:

                for e in (editor1, editor2):
                    e.markerDefine(self.marker_id, marker_symbol)
                    e.markerSetBack(self.marker_id, (0xB5, 0xB5, 0xB5))
                

                For the indicator-based coloring, the indicator init code could be changed to:

                for e in (editor1, editor2):
                    e.indicSetStyle(self.indicator_nbr, INDICATORSTYLE.FULLBOX)
                    e.indicSetFore(self.indicator_nbr, (0xB5, 0xB5, 0xB5))
                    e.indicSetAlpha(self.indicator_nbr, 100)
                    e.indicSetOutlineAlpha(self.indicator_nbr, e.indicGetAlpha(self.indicator_nbr))
                    e.indicSetUnder(self.indicator_nbr, True)
                

                –
                edit: fixed indicator vs marker to make descriptions match code snippets

                Alan KilbornA 1 Reply Last reply Reply Quote 3
                • Alan KilbornA
                  Alan Kilborn @Alan Kilborn
                  last edited by

                  So I noticed some weirdness with this script, specifically, when using it with the ChangedLines plugin, and I do a column insert of data, I expect ChangedLines to color each changed line orange (my set color for unsaved modifications), but I see this instead:

                  57c31a80-1d0b-4dea-9ad4-6762b935b6a3-image.png

                  The orange is there but only on lines not having a marker set by the code above. I thought maybe the plugin’s code and my code were using the same marker id, but I changed from using 0 to using 7 and the problem persisted. My thinking here was that even if the plugin uses a few marker ids, and 0 is seemingly used, it wouldn’t use eight marker ids and 7 would be available.

                  Notepad++ source says that 0 - 15 are available for plugins.

                  I think I’ve coded my script to use markers in the right way.

                  I was wondering if @dail or @michael-vincent could shed some light here?

                  Michael VincentM 1 Reply Last reply Reply Quote 1
                  • Michael VincentM
                    Michael Vincent @Alan Kilborn
                    last edited by

                    @alan-kilborn said in How to highlight lines with color one by one?:

                    I was wondering if @dail or @michael-vincent could shed some light here?

                    Changed Lines uses markers 10 (changes) and 11 (saves). I don’t think I leave that customizable - you can change the marker “type”, but not the ID. Markers I think are cumulative, that is the marker is basically a 32-bit binary number where I’m flipping bits 10 and 11 for ChangedLines and you’re flipping bit 0 or 7 (if I read your post correctly). The markers aren’t supposed to interfere with each other - seems you’re using SC_MARK_FULLRECT for ChangedLines and SC_MARK_BACKGROUND for your script.

                    Cheers.

                    Alan KilbornA 1 Reply Last reply Reply Quote 1
                    • Alan KilbornA
                      Alan Kilborn @Michael Vincent
                      last edited by Alan Kilborn

                      @michael-vincent said in How to highlight lines with color one by one?:

                      if I read your post correctly

                      I believe you did.

                      So what you’ve said and what I know indicates there should be no interference. Hmmm…

                      Maybe @dail will have some insight. Thanks for yours.

                      Free marker (and indicator) allocation could be handled better by N++. It seems like there should be a “pool” and N++ could hand them out when a plugin (or script) says “gimme a free one”. Maybe that’s asking too much.

                      seems you’re using SC_MARK_FULLRECT for ChangedLines and SC_MARK_BACKGROUND for your script.

                      And this wouldn’t be a point of possible interference anyway. The interference would be in reusing a marker id number, not how that marker manifests visually on screen.

                      Michael VincentM 1 Reply Last reply Reply Quote 1
                      • Michael VincentM
                        Michael Vincent @Alan Kilborn
                        last edited by

                        @alan-kilborn said in How to highlight lines with color one by one?:

                        And this wouldn’t be a point of possible interference anyway. The interference would be in reusing a marker id number, not how that marker manifests visually on screen.

                        Agree, but I allow changing a marker type in Changed Lines and if both were trying to use line background coloring, I’m not sure what would happen - a combination of both colors? Last one to execute wins? In any case, you’re right - different visuals so visual interference is not the answer in this case.

                        Cheers.

                        1 Reply Last reply Reply Quote 1
                        • dailD
                          dail
                          last edited by

                          @Alan-Kilborn My only suggestion would be maybe look at SCI_SETMARGINMASKN to see if changing what margins the markers are applied to can make a difference.

                          Alan KilbornA 1 Reply Last reply Reply Quote 2
                          • Alan KilbornA
                            Alan Kilborn @dail
                            last edited by

                            @dail

                            I tried some experimentation with that but I didn’t get a change in effect. My original use of marker 0 showed that it wasn’t assigned to any margin. I tried assigning it to some of the margins using the command you cited, but again it didn’t make a difference. Of course when the effect is seen visually NOT in any true margin, it is kind of hard to understand how it works.

                            Regardless, the slight downside of not being able to see change indications for lines that will be background-colored by my script is acceptable.

                            1 Reply Last reply Reply Quote 1
                            • T WT
                              T W @Alan Kilborn
                              last edited by

                              @Alan-Kilborn
                              If selected Word Wrap, the display as below,if possible,please modify the code to highlight lines with color one by one.
                              Best Regards

                              1ec3b1c1-a8d4-4f12-b7a6-407b96d3cf38-image.png

                              Alan KilbornA 1 Reply Last reply Reply Quote 0
                              • Alan KilbornA
                                Alan Kilborn @T W
                                last edited by

                                @T-W said:

                                If selected Word Wrap, the display as below,if possible,please modify the code to highlight lines with color one by one.

                                I don’t think what you’re asking for is possible.
                                But…when you really sit back and consider it, isn’t it better the way your example shows it anyway?
                                A line that is visually wrapped so it appears on 2+ lines is still only one line…

                                T WT 1 Reply Last reply Reply Quote 0
                                • T WT
                                  T W @Alan Kilborn
                                  last edited by

                                  @Alan-Kilborn said in How to highlight lines with color one by one?:

                                  @T-W said:

                                  If selected Word Wrap, the display as below,if possible,please modify the code to highlight lines with color one by one.

                                  I don’t think what you’re asking for is possible.
                                  But…when you really sit back and consider it, isn’t it better the way your example shows it anyway?
                                  A line that is visually wrapped so it appears on 2+ lines is still only one line…

                                  The interlaced brightening function increases the Angle of view of the eye by 3 times, reducing the load of the eye and improving the reading speed. I think it’s still necessary to focus on the visual line rather than the document line. I would like to try to change it based on yours. Can you give me some clues, such as the keywords you use, grammar and other background knowledge?

                                  Alan KilbornA 1 Reply Last reply Reply Quote 0
                                  • Alan KilbornA
                                    Alan Kilborn @T W
                                    last edited by

                                    @T-W

                                    I took a closer look at the script, and I think I’ve changed my mind about it not being possible. Let me see if I can put together a changed script that will do as you want…

                                    T WT 1 Reply Last reply Reply Quote 0
                                    • T WT
                                      T W @Alan Kilborn
                                      last edited by

                                      @Alan-Kilborn said in How to highlight lines with color one by one?:

                                      I took a closer look at the script, and I think I’ve changed my mind about it not being possible. Let me see if I can put together a changed script that will do as you want…

                                      thanks

                                      Alan KilbornA 1 Reply Last reply Reply Quote 0
                                      • Alan KilbornA
                                        Alan Kilborn @T W
                                        last edited by

                                        @T-W

                                        I’m going to waffle back to my original comment in that the new desire isn’t reasonably possible. In the original script, position is used heavily to decide where to put the “coloring”. While line information (both document and display) is easy to obtain, position data for wrapped lines (e.g. position of where each wrapping occurs) doesn’t seem to be available.

                                        Now I’m not going to say it is impossible, because software is amazing and can do extraordinary things, but I think it would be a bigger effort than I consider worth it to put in. Unless…someone sees it differently and there is a straightforward way to do it.

                                        Andi KiisselA CoisesC 2 Replies Last reply Reply Quote 0
                                        • Andi KiisselA
                                          Andi Kiissel @Alan Kilborn
                                          last edited by

                                          Something with Split Lines perhaps…?

                                          Alan KilbornA 1 Reply Last reply Reply Quote 0
                                          • Alan KilbornA
                                            Alan Kilborn @Andi Kiissel
                                            last edited by

                                            @Andi-Kiissel

                                            Not sure what good Split Lines would do here, at all!

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            The Community of users of the Notepad++ text editor.
                                            Powered by NodeBB | Contributors