• Login
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.
  • M
    Michael Vincent
    last edited by Apr 25, 2020, 2:26 AM

    In a previous thread I mentioned I started using backspace unindents in my NppExec startup script. Through normal course of operations, I opened another Scintilla view (the second editor pane) and realized backspace unindents was disabled (the N++ default). I though maybe my NppExec script was maybe only setting it for the main Scintilla view.

    So I added it to a “PerlScript” startup which does some other stuff to both Scintilla views. I can confirm that the other settings (vertical and horizontal “slop” and mutli-paste options) from the “PerlScript” are set in both Scintilla views.

    Long story short, it seems when a new document is opened (Ctrl-N for example) in any Scintilla view backspace unindents are disabled regardless of having them set in a given editor tab. It seems this may be “tab”-specific instead of applying to all the tabs in a given view the way other settings do (like vertical edge for example).

    I wonder if anyone else can confirm this? I assume a PythonScript could probably address this by hooking “new document open” event.

    Cheers.

    E D A 3 Replies Last reply Apr 25, 2020, 11:05 AM Reply Quote 1
    • E
      Ekopalypse @Michael Vincent
      last edited by Apr 25, 2020, 11:05 AM

      @Michael-Vincent

      Yes, right - I can confirm the same behavior with PythonScript.
      The BUFFERACTIVATED callback would be the right way to set this in this case.

      As far as I understand it, this is a document attribute and is, currently, not used by Npp .

      M 1 Reply Last reply Apr 25, 2020, 12:29 PM Reply Quote 2
      • M
        Michael Vincent @Ekopalypse
        last edited by Apr 25, 2020, 12:29 PM

        @Ekopalypse
        Thanks, so I’m not losing my mind. I installed NppEventExec and matched on NPPN_FILEOPENED since I’m not sure enabling in blank"new 1" would be useful for just typing plain text. More useful with an indented programming language. And NppEventExec can filter on extension so maybe I’ll add that as I use more; currently enabled for any opening file.

        Cheers

        1 Reply Last reply Reply Quote 1
        • D
          dinkumoil @Michael Vincent
          last edited by Apr 25, 2020, 1:55 PM

          @Michael-Vincent

          Yeah, this is one of the oddities in Npp. To users, the program pretends most of its settings are global to all documents. But internally every document/text buffer has its own set of preferences. I’m fighting with this in all my plugins.

          I ended up with writing a buffer management, that remembers if a certain setting has been adopted by a text buffer. When a buffer is activated the first time, I do all configuration for this new buffer and store its id in a list. When a buffer is activated the next time, I will find it in the list and avoid doing any configuration. I do that mostly because of keeping Npp performant.

          During development of the text buffer management I discovered some Npp quirks that I had to deal with. For example when a user moves a buffer from one view to the other it may get another buffer id.

          You can have a look to the code of e.g. my AutoCodpage plugin to get some insights. The relevant code is in file Main.pas.

          E 1 Reply Last reply Apr 25, 2020, 1:59 PM Reply Quote 1
          • E
            Ekopalypse @dinkumoil
            last edited by Apr 25, 2020, 1:59 PM

            @dinkumoil said in Backspace Unindents:

            I ended up with writing a buffer management … I discovered some Npp quirks…

            In such a case we could also add a property to the document, can’t we?
            Should resolve these kind of quirks. Might be a bit slower but maybe
            more reliable.

            D 1 Reply Last reply Apr 25, 2020, 2:05 PM Reply Quote 2
            • D
              dinkumoil @Ekopalypse
              last edited by dinkumoil Apr 25, 2020, 2:06 PM Apr 25, 2020, 2:05 PM

              @Ekopalypse said in Backspace Unindents:

              In such a case we could also add a property to the document, can’t we?

              I’ve never tried this technique but it seems that a property is global for a certain Scintilla window, but one Scintilla windows hosts many text buffers (the document tabs). Thus I’m not sure if this feature can be used for a text buffer management.

              1 Reply Last reply Reply Quote 1
              • E
                Ekopalypse
                last edited by Apr 25, 2020, 2:07 PM

                as I understand it is a document property. Let me give it a quick try.

                1 Reply Last reply Reply Quote 1
                • E
                  Ekopalypse
                  last edited by Ekopalypse Apr 25, 2020, 2:11 PM Apr 25, 2020, 2:11 PM

                  @dinkumoil
                  Yes, should work as it is bind to the document.
                  Script used to test:

                  from Npp import editor
                  
                  editor.setProperty('secret_text','blablabla')
                  print(editor.getProperty('secret_text'))
                  
                  D 1 Reply Last reply Apr 25, 2020, 2:22 PM Reply Quote 1
                  • D
                    dinkumoil @Ekopalypse
                    last edited by Apr 25, 2020, 2:22 PM

                    @Ekopalypse

                    I don’t know the Python API for Npp. The editor object represents a single text buffer? Or an instance of Scintilla?

                    E 1 Reply Last reply Apr 25, 2020, 2:26 PM Reply Quote 1
                    • E
                      Ekopalypse @dinkumoil
                      last edited by Apr 25, 2020, 2:26 PM

                      @dinkumoil

                      editor is an scintilla instance but the property is set on document level.

                      D 1 Reply Last reply Apr 25, 2020, 2:27 PM Reply Quote 1
                      • D
                        dinkumoil @Ekopalypse
                        last edited by Apr 25, 2020, 2:27 PM

                        @Ekopalypse

                        Hmm, which document? The active one?

                        E 1 Reply Last reply Apr 25, 2020, 2:28 PM Reply Quote 0
                        • E
                          Ekopalypse @dinkumoil
                          last edited by Apr 25, 2020, 2:28 PM

                          @dinkumoil

                          yes if editor is used. And in case editor1 or 2 is used, then the
                          current viewable document.

                          D 1 Reply Last reply Apr 25, 2020, 2:30 PM Reply Quote 2
                          • D
                            dinkumoil @Ekopalypse
                            last edited by Apr 25, 2020, 2:30 PM

                            @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.

                            E 1 Reply Last reply Apr 25, 2020, 2:40 PM Reply Quote 2
                            • E
                              Ekopalypse
                              last edited by Apr 25, 2020, 2:31 PM

                              Never change a running system!!! :-D

                              1 Reply Last reply Reply Quote 3
                              • E
                                Ekopalypse @dinkumoil
                                last edited by Ekopalypse Apr 25, 2020, 2:42 PM Apr 25, 2020, 2:40 PM

                                @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
                                • A
                                  Alan Kilborn
                                  last edited by Apr 26, 2020, 1:07 AM

                                  @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
                                  • A
                                    Alan Kilborn @Michael Vincent
                                    last edited by Apr 26, 2020, 11:28 AM

                                    @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
                                    • A
                                      Alan Kilborn
                                      last edited by Apr 27, 2020, 7:27 PM

                                      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 Apr 27, 2020, 11:43 PM Apr 27, 2020, 11:35 PM

                                        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

                                        A 1 Reply Last reply Apr 28, 2020, 12:25 AM Reply Quote 0
                                        • A
                                          Alan Kilborn @guy038
                                          last edited by Apr 28, 2020, 12:25 AM

                                          @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 Apr 28, 2020, 4:31 AM Reply Quote 2
                                          1 out of 24
                                          • First post
                                            1/24
                                            Last post
                                          The Community of users of the Notepad++ text editor.
                                          Powered by NodeBB | Contributors