Community
    • Login

    Backspace Unindents

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    24 Posts 6 Posters 2.4k 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.
    • dinkumoilD
      dinkumoil @Ekopalypse
      last edited by

      @Ekopalypse

      OK, then it’s worth to try using Scintilla’s properties for a text buffer management. But as I have a working system I will not change it. But I’m interested in knowing how that approach works.

      EkopalypseE 1 Reply Last reply Reply Quote 2
      • EkopalypseE
        Ekopalypse
        last edited by

        Never change a running system!!! :-D

        1 Reply Last reply Reply Quote 3
        • EkopalypseE
          Ekopalypse @dinkumoil
          last edited by Ekopalypse

          @dinkumoil

          just a quick test

          from Npp import editor1, notepad
          
          def loop_files():
              for file in notepad.getFiles():
                  notepad.activateFile(file[0])
                  print(f'file: {file}')
                  print(f'  secret_text:{editor1.getProperty("secret_text")}')
          
          loop_files()
          notepad.activateFile('new 3')
          editor1.setProperty('secret_text', 'blablabla')
          loop_files()
          

          returned

          file: ('new 1', 44120304, 0, 0)
            secret_text:
          file: ('new 2', 112914256, 1, 0)
            secret_text:
          file: ('new 3', 112915984, 2, 0)
            secret_text:
          file: ('new 4', 112916416, 3, 0)
            secret_text:
          file: ('new 5', 112915552, 4, 0)
            secret_text:
          file: ('new 6', 112916848, 0, 1)
            secret_text:
          file: ('new 1', 44120304, 0, 0)
            secret_text:
          file: ('new 2', 112914256, 1, 0)
            secret_text:
          file: ('new 3', 112915984, 2, 0)
            secret_text:blablabla
          file: ('new 4', 112916416, 3, 0)
            secret_text:
          file: ('new 5', 112915552, 4, 0)
            secret_text:
          file: ('new 6', 112916848, 0, 1)
            secret_text:
          

          Btw. setting and reading the value takes about ~20 microseconds each for python.

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

            @Ekopalypse @dinkumoil

            FYI, SCI_GETPROPERTY and SCI_SETPROPERTY are put to good use by @Claudia-Frank in the File Specific word wrap (vs. global enable) discussion thread, specifically, THIS POSTING.

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

              @Michael-Vincent said in Backspace Unindents:

              In a previous thread I mentioned I started using backspace unindents

              THIS POSTING must be that reference to a previous thread.

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

                So for anybody interested, I turned the addition of the backspace-unindent capability into a PythonScript.

                I put it in a BackspaceUnindents.py file:

                from Npp import editor, notepad, NOTIFICATION
                
                class BackspaceUnindents(object):
                
                    def __init__(self):
                        self.activated = True
                        notepad.callback(self.callback_for_bufferactivated, [NOTIFICATION.BUFFERACTIVATED])
                        self.callback_for_bufferactivated(None)  # set it for the currently active document
                
                    def callback_for_bufferactivated(self, args):
                        # this document property won't automatically be applied to newly created tabs; adjust for that:
                        editor.setBackSpaceUnIndents(self.activated)
                
                    def is_activated(self): return self.activated
                
                    def set_activated(self, b):
                        self.activated = b
                        self.callback_for_bufferactivated(None)
                
                if __name__ == '__main__':
                
                    try:
                        backspace_unindents
                    except NameError:
                        backspace_unindents = BackspaceUnindents()
                        notepad.messageBox('BackspaceUnindents installed and activated')
                    else:
                        if backspace_unindents.is_activated():
                            backspace_unindents.set_activated(False)
                            notepad.messageBox('BackspaceUnindents deactivated')
                        else:
                            backspace_unindents.set_activated(True)
                            notepad.messageBox('BackspaceUnindents activated')
                

                I set mine to run from startup.py as follows:

                import BackspaceUnindents
                backspace_unindents = BackspaceUnindents.BackspaceUnindents()
                

                but it can be run manually with or without that. Run it once to turn it on, run again to turn off.

                1 Reply Last reply Reply Quote 3
                • guy038G
                  guy038
                  last edited by guy038

                  Hi, @alan-kilborn, @ekopalypse, @michael-vincent and All,

                  Alan, Just tried your BackspaceUnindents.py with no difference seen between the two states, although the script seems to work nice ?!

                  Did I clearly understand what’s for ? I mean, from the link below :

                  https://www.scintilla.org/ScintillaDoc.html#SCI_SETBACKSPACEUNINDENTS

                  I supposed that the Python script alternatively change the behaviour of the Backspace key :

                  • By default or when the BackspaceUnindents process is deactivated, a hit on the Backspace key deletes the previous indentation

                  • When the BackspaceUnindents process is activated, a hit on the Backspace key simply moves the caret to the previous indentation location

                  Am I right about it ? What I miss, there ?

                  Best Regards

                  guy038

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

                    @guy038

                    Hmmm, not sure.

                    For me, without the script or with it deactivated, on a line that contains only lots of space characters and the caret right before the line ending, pressing Backspace repeatedly will remove one space at a time.

                    With the script active, in the same situation, the Backspace key will remove 4 spaces with each press (I have my tabs setting to insert 4 spaces per tab), assuming I started with a number of spaces evenly divisible by 4.

                    I suppose, if one has tab set to insert tab characters, backspacing those out of existence will work the same either with the script of without it.

                    astrosofistaA 1 Reply Last reply Reply Quote 2
                    • astrosofistaA
                      astrosofista @Alan Kilborn
                      last edited by

                      @Alan-Kilborn, @guy038 and All

                      Haven’t read all this thread, but in case you want to make a comparation, the Extended Settings plugin provides a similar feature. Works fine, by the way.

                      Cheers.

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

                        @astrosofista

                        the Extended Settings plugin provides a similar feature

                        Sure; I’m actually quite surprised no one earlier in the thread mentioned that.
                        If I used Extended Settings plugin, I’d like to think I would have mentioned it.
                        At the time the plugin came out, I already had most of its functionality, thru scripts.

                        I even had a backspace-unindenter script (different from the one above); not realizing that Scintilla provided the function, my script did it manually and was tied to the Backspace key binding.
                        (In some ways I liked my earlier script better than Scintilla’s function!)

                        1 Reply Last reply Reply Quote 2
                        • guy038G
                          guy038
                          last edited by guy038

                          Hello @alan-kilborn and All,

                          OK ! When doing tests, the TAB key was set to write a four positions TAB character and I principally did tests with leading tab chars ! But never mind, now, I understood the whole thing :

                          First, from the Scintilla documentation, I saw that there a similar message to BackspaceUnindents, which is TabIndents. Note that, by default Notepad++ starts with the TabIndents message activated and with the BackspaceUnindents message deactivated !

                          So, I created an other python script, called TabIndents.py, in order to activate/deactivate the TabIndents message. I get absolutely no credit because it’s just a copy/paste of the Alan’s script !

                          from Npp import editor, notepad, NOTIFICATION
                          
                          class TabIndents(object):
                          
                              def __init__(self):
                                  self.activated = True
                                  notepad.callback(self.callback_for_bufferactivated, [NOTIFICATION.BUFFERACTIVATED])
                                  self.callback_for_bufferactivated(None)  # set it for the currently active document
                          
                              def callback_for_bufferactivated(self, args):
                                  # this document property won't automatically be applied to newly created tabs; adjust for that:
                                  editor.setTabIndents(self.activated)
                          
                              def is_activated(self): return self.activated
                          
                              def set_activated(self, b):
                                  self.activated = b
                                  self.callback_for_bufferactivated(None)
                          
                          if __name__ == '__main__':
                          
                              try:
                                  tab_indents
                              except NameError:
                                  tab_indents = TabIndents()
                                  notepad.messageBox('TabIndents installed and activated')
                              else:
                                  if tab_indents.is_activated():
                                      tab_indents.set_activated(False)
                                      notepad.messageBox('TabIndents deactivated')
                                  else:
                                      tab_indents.set_activated(True)
                                      notepad.messageBox('TabIndents activated')
                          

                          Then I played around, with a sample line of mixed TAB and SPACE chars, both, in the leading part and further on, between usual characters :

                          • Activating / deactivating the TabIndents.py and/or the BaskspaceUnindents.py messages

                          • Choosing, either, 1 TAB char of 4 positions long OR 4 SPACE chars, when you hit the TAB key, for language normal, in Preferences... > Language > Tab Settings > normal

                          • Moving caret within the leading blank chars OR in subsequents blanks ranges, further on, in current line

                          And, here is, below, a summary of my observations :


                          Regarding the BACKSPACE key behaviour :

                          • If caret within the leading blank range of chars AND BackspaceUnindents message activated [ NEW backspace behaviour ] :

                            • If setting TAB to 4 SPACE chars, a hit on the BACKSPACE key :

                              • Deletes previous char(s) to get the previous indentation level
                              • Normalizes all preceding blank chars, till beginning of line, to SPACE chars
                              • Moves the caret after the last leading SPACE char
                            • If setting TAB to 1 TABchar of 4 positions long, a hit on the BACKSPACE key :

                              • Deletes previous char(s) to get the previous indentation level
                              • Normalizes all preceding blank chars, till beginning of line, to TAB chars
                              • Moves the caret after the last leading TAB char
                          • If caret outside the leading blank range of chars OR BackspaceUnindents message deactivated OR by DEFAULT, a hit on the BACKSPACE key :

                            • Deletes previous char to get the correct or previous indentation level
                            • Leave the caret at current position

                          Regarding the TAB key behaviour :

                          • If caret outside the leading blank range of chars, whatever the status of the TabIndents message :

                            • When setting TAB to 4 SPACE chars, a hit on the TAB key :

                              • Adds up to 4 SPACE char(s) to get the next indentation level
                              • Leave the caret right after these added SPACE char(s)
                            • When setting TAB to a 1 TAB of 4 positions long , a hit on the TAB key :

                              • Adds a TAB char to get the next indentation level
                              • Leave the caret right after the added TAB char
                          • If caret within the leading blank range of chars :

                            • If the TabIndents message is activated OR by DEFAULT :

                              • When setting TAB to 4 SPACE chars, a hit on the TAB key :

                                • Adds up to 4 SPACE char(s) to get the next indentation level
                                • Normalizes all preceding blank chars, till beginning of line, to SPACE chars
                                • Moves the caret after the last leading SPACE char
                              • When setting TAB to a 1 TAB of 4 positions long , a hit on the TAB key :

                                • Adds a TAB char to get the next indentation level
                                • Normalizes all preceding blank chars, till beginning of line, to TAB chars
                                • Moves the caret after the last leading TAB char
                            • If the TabIndents message is deactivated [ NEW tab behaviour ] :

                              • When setting TAB to 4 SPACE chars, a hit on the TAB key :

                                • Adds up to 4 SPACE char(s) to get the next indentation level
                                • Leave the caret right after these added SPACE char(s)
                              • When setting TAB to a 1 TAB of 4 positions long , a hit on the TAB key :

                                • Adds a TAB char to get the next indentation level
                                • Leave the caret right after the added TAB char

                          Best Regards,

                          guy038

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

                            Based upon @guy038’s in-depth treatment just ABOVE, and some experimentation on my own based upon it, I decided that I think I don’t like how Scintilla’s backspace-unindents works. :-(

                            So I am getting rid of the script I posted above, and going back to the script I had previously (where I did things much more “manually”), which did more of what I want/expect. :-)

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