Community
    • Login

    Is there a way/plugin that makes notepad++ run code on a file when we open it?

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    44 Posts 3 Posters 35.3k 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.
    • savage roarS
      savage roar
      last edited by

      Okay, now THIS works for me. It seems like that dirty hack with “new/close” forces N++ to repaint the folded document. Now I’m searching for the best way to launch this on N++ startup.

      from Npp import *
      
      def auto_collapse(args):
      	notepad.activateBufferID(args["bufferID"])
      	for i in range(0, editor.getLineCount()-1):
      		line = editor.getLine(i).strip()
      		if line[:3] == "//!":
      			editor.foldLine(i+1, 0)
      	notepad.new()
      	notepad.close()
      
      notepad.callback(auto_collapse, [NOTIFICATION.FILEOPENED])
      
      Claudia FrankC 1 Reply Last reply Reply Quote 0
      • Claudia FrankC
        Claudia Frank @Alguem Meugla
        last edited by

        @Alguem-Meugla

        Ok, this wasn’t as straightforward as I thought it is, basically because
        the folding flags get set after buffer has been activated, therefore
        I’m using now UPDATEUI callback, with some logic to prevent multiple scans, to do the folding

        Within the configuration area you can define which file extensions
        should be handled. COLLPASE_LINE_IDENTIFIER and COLLPASE_FROM_TO_IDENTIFIER
        can be changed as long as the changes do not break regex searches.
        In addition for COLLPASE_FROM_TO_IDENTIFIER matches need to be in form any_numberCOMMAany_number (like 3,4 or 14,25).

        In order to make this work automatically, meaning that the script gets called when npp starts,
        create a new script and name it startup.py (if you not already have a user startup.py - not to be confused with the standard startup.py python script automatically created)
        and copy the content into it. Restart npp and test it.

        If you do it like that then the logic is the following:
        When starting npp, the script gets executed and registers two callbacks.
        The BUFFERACTIVED callback gets called whenever you switch to another tab,
        then the function checks if this file should be folded and if so if it has been already done.
        If it hasn’t be done it set a global flag that it needs to be done.
        The second callback UPDATEUI is called whenever something changes within the current document,
        if the flag has been set that the document should be scanned, it will do so, collapses
        the found lines and set the global flag to false in order to prevent subsequent scans.

        import os
        
        # ---------------------------- configuration area -----------------------------
        
        FILE_EXTENSION_LIST = ['.html','.js']
        COLLPASE_LINE_IDENTIFIER = 'NPP_COLLAPSE_IT'
        COLLPASE_FROM_TO_IDENTIFIER = 'NPP_COLLAPSE\((\d+,\d+)\)'
        
        # -----------------------------------------------------------------------------
        
        
        def scan(number_of_lines):
            
            def find_line_identifiers(): # NPP_COLLAPSE_IT
                matches = []
                editor.research('\\b{0}\\b'.format(COLLPASE_LINE_IDENTIFIER), lambda m: matches.append(m.span()), 0)   
                return matches
            
            def find_from_to_line_identifiers(): # NPP_COLLAPSE(19,41)
                matches = []
                editor.research('{0}'.format(COLLPASE_FROM_TO_IDENTIFIER), lambda m: matches.append(m.span(1)), 0)   
                return matches
                    
            for match in find_line_identifiers():
                _line = editor.lineFromPosition(match[0])
                if editor.getFoldLevel(_line) & FOLDLEVEL.HEADERFLAG:
                    editor.foldLine(_line,0)
            
            for match in find_from_to_line_identifiers():
                start_line, end_line = list(map(lambda x: int(x)-1, editor.getTextRange(*match).split(',')))
                while True:
                    if start_line <= end_line:
                        if editor.getFoldLevel(start_line) & FOLDLEVEL.HEADERFLAG:
                            editor.foldLine(start_line,0)
                            start_line = editor.getLastChild(start_line,-1) + 1
                        else:
                            start_line += 1
                    else:
                        break 
        
        should_be_folded = False
        def callback_FOLD_BUFFERACTIVATED(args):
            global should_be_folded
            _state = editor.getProperty('AUTO_FOLDED')
            if _state == '':
                filename, extension = os.path.splitext(notepad.getBufferFilename(args['bufferID']))
                if extension in FILE_EXTENSION_LIST:
                    editor.setProperty('AUTO_FOLDED', '1')
                    should_be_folded = True
                else:
                    editor.setProperty('AUTO_FOLDED', '-1')
                    should_be_folded = False
            elif _state == '-1':
                should_be_folded = False
        
        def callback_FOLD_UPDATEUI(args):
            global should_be_folded
            if should_be_folded:
                scan(editor.getLineCount())
                should_be_folded = False
        
        notepad.callback(callback_FOLD_BUFFERACTIVATED, [NOTIFICATION.BUFFERACTIVATED])
        editor.callback(callback_FOLD_UPDATEUI, [SCINTILLANOTIFICATION.UPDATEUI])
        

        Did only some basic tests, but hope this is useful for you.

        Cheers
        Claudia

        Alguem MeuglaA 1 Reply Last reply Reply Quote 0
        • Claudia FrankC
          Claudia Frank @savage roar
          last edited by

          @savage-roar

          call the script from user startup.py or put your code into user startup.py.

          Cheers
          Claudia

          1 Reply Last reply Reply Quote 0
          • Claudia FrankC
            Claudia Frank
            last edited by

            Minor code cleanup

            import os
            
            # ---------------------------- configuration area -----------------------------
            
            FILE_EXTENSION_LIST = ['.html','.js']
            COLLPASE_LINE_IDENTIFIER = 'NPP_COLLAPSE_IT'
            COLLPASE_FROM_TO_IDENTIFIER = 'NPP_COLLAPSE\((\d+,\d+)\)'
            
            # -----------------------------------------------------------------------------
            
            
            def scan(number_of_lines):
                
                def find_line_identifiers(): # NPP_COLLAPSE_IT
                    matches = []
                    editor.research('\\b{0}\\b'.format(COLLPASE_LINE_IDENTIFIER), lambda m: matches.append(m.span()), 0)   
                    return matches
                
                def find_from_to_line_identifiers(): # NPP_COLLAPSE(19,41)
                    matches = []
                    editor.research(COLLPASE_FROM_TO_IDENTIFIER, lambda m: matches.append(m.span(1)), 0)   
                    return matches
                        
                for match in find_line_identifiers():
                    _line = editor.lineFromPosition(match[0])
                    if editor.getFoldLevel(_line) & FOLDLEVEL.HEADERFLAG:
                        editor.foldLine(_line,0)
                
                for match in find_from_to_line_identifiers():
                    start_line, end_line = map(lambda x: int(x)-1, editor.getTextRange(*match).split(','))
                    while True:
                        if start_line <= end_line:
                            if editor.getFoldLevel(start_line) & FOLDLEVEL.HEADERFLAG:
                                editor.foldLine(start_line,0)
                                start_line = editor.getLastChild(start_line,-1) + 1
                            else:
                                start_line += 1
                        else:
                            break 
            
            should_be_folded = False
            def callback_FOLD_BUFFERACTIVATED(args):
                global should_be_folded
                _state = editor.getProperty('AUTO_FOLDED')
                if _state == '':
                    filename, extension = os.path.splitext(notepad.getBufferFilename(args['bufferID']))
                    if extension in FILE_EXTENSION_LIST:
                        editor.setProperty('AUTO_FOLDED', '1')
                        should_be_folded = True
                    else:
                        editor.setProperty('AUTO_FOLDED', '-1')
                        should_be_folded = False
                else:
                    should_be_folded = False
            
            def callback_FOLD_UPDATEUI(args):
                global should_be_folded
                if should_be_folded:
                    scan(editor.getLineCount())
                    should_be_folded = False
            
            notepad.callback(callback_FOLD_BUFFERACTIVATED, [NOTIFICATION.BUFFERACTIVATED])
            editor.callback(callback_FOLD_UPDATEUI, [SCINTILLANOTIFICATION.UPDATEUI])
            

            Cheers
            Claudia

            1 Reply Last reply Reply Quote 0
            • Alguem MeuglaA
              Alguem Meugla @Claudia Frank
              last edited by

              @Claudia-Frank said:

              create a new script and name it startup.py (if you not already have a user startup.py - not to be confused with the standard startup.py python script automatically created)

              Where do I find/put that?

              Claudia FrankC 2 Replies Last reply Reply Quote 1
              • Claudia FrankC
                Claudia Frank @Alguem Meugla
                last edited by Claudia Frank

                @Alguem-Meugla

                either install python script plugin via plugin manager or by using the msi package.
                I would suggest to use the msi package as it has been reported that installation via plugin manager
                fails from time to time.

                Once installed, goto Plugins->Python Script->New Script and name it startup.py.
                and press Save button.
                Copy the posted script into the newly created document, save it and restart npp.

                Cheers
                Claudia

                1 Reply Last reply Reply Quote 1
                • Claudia FrankC
                  Claudia Frank @Alguem Meugla
                  last edited by

                  @Alguem-Meugla

                  sorry - I forgot one step.

                  before you restart npp, goto
                  Plugins->Python Script->Configuration
                  and instead of Initialisation: LAZY choose ATSTARTUP.

                  Cheers
                  Claudia

                  Alguem MeuglaA 1 Reply Last reply Reply Quote 1
                  • Alguem MeuglaA
                    Alguem Meugla @Claudia Frank
                    last edited by Alguem Meugla

                    @Claudia-Frank
                    I copied the script to Plugins>Python Script>Scripts>(Ctrl+)startup and saved as administrator.
                    I also did what you said on Configuration.
                    But it is doing nothing when I start my file with “NPP_COLLAPSE_IT” on a line with a -. I then changed the script and added a line “print(‘startup.py done!’)” on the end trying to see if Plugins>Python Script>Show Console showed it, but nothing appears there other than Ready (and some more things above it).

                    Claudia FrankC 1 Reply Last reply Reply Quote 1
                    • Claudia FrankC
                      Claudia Frank @Alguem Meugla
                      last edited by

                      @Alguem-Meugla

                      I don’t understand what you mean by

                      I copied the script to Plugins>Python Script>Scripts>(Ctrl+)startup and saved as administrator.

                      you should have done

                      goto Plugins->Python Script->New Script and name it startup.py
                      and press Save button.
                      Copy the posted script into the newly created document, save it and restart npp.

                      Depending on your installation, the script directory is different,
                      by using the way I mentioned you make sure that the correct directory is used.

                      Cheers
                      Claudia

                      Alguem MeuglaA 1 Reply Last reply Reply Quote 0
                      • Alguem MeuglaA
                        Alguem Meugla @Claudia Frank
                        last edited by

                        @Claudia-Frank said:

                        you should have done

                        goto Plugins->Python Script->New Script and name it startup.py
                        and press Save button.
                        Copy the posted script into the newly created document, save it and restart npp.

                        Depending on your installation, the script directory is different,
                        by using the way I mentioned you make sure that the correct directory is used.

                        When I go on New Script it puts me on Documents. Should I create the file there or in a place I want? I had created a folder there and put the new file named startup.py with the script inside it, but wasn’t working, so I replaced the standard startup.py with the new one. Didn’t work.

                        Claudia FrankC 1 Reply Last reply Reply Quote 0
                        • Claudia FrankC
                          Claudia Frank @Alguem Meugla
                          last edited by

                          @Alguem-Meugla

                          yes, you should save it in the default directory, the one which
                          get opened by using New Script.

                          The standard startup.py is used do the general setups and initialization.
                          I do not recommend to modify this file as long as you know what you do.
                          I hope you do have a copy of the old one and you can revert your changes.
                          If not, a reinstall of the python script plugin is needed I guess.

                          Cheers
                          Claudia

                          Alguem MeuglaA 1 Reply Last reply Reply Quote 0
                          • Alguem MeuglaA
                            Alguem Meugla @Claudia Frank
                            last edited by Alguem Meugla

                            @Claudia-Frank said:

                            yes, you should save it in the default directory, the one which
                            get opened by using New Script.

                            I think that there is not a place which any plugin/program can trust. When I use New Script it opens to me the directory I left the dialog on the last time, MyDocuments\Python Notepad++ (the folder I created).

                            After reinstalling the plugin and having the default startip.py back, I tried having a copy of the new startup.py on MyDocuments, another on MyDocuments\Python Notepad++, and another on %APPDATA%\Notepad++\plugins\config\PythonScript\scripts (the plugin’s Help said it was the User directory). All those copys should also print some words after your script. After restarting N++ it doesn’t print anything neither collapse the line it should (https://image.prntscr.com/image/Wa9pMODERIm7Kq7cnHhZAg.png).

                            I also tried having one copy on the same folder as the Samples folder and the default startup.py (inside a folder I created so it didn’t have problems with 2 startup.py’s). After restarting N++ nothing happened, but it was appearing on the Scripts list so I clicked it and: no collapse and the print worked (this means the script is not collapsing for some reason, maybe because it’s not happening at startup?).

                            Thank you for the help and time you are giving to this.

                            Claudia FrankC 1 Reply Last reply Reply Quote 0
                            • Claudia FrankC
                              Claudia Frank @Alguem Meugla
                              last edited by

                              @Alguem-Meugla

                              Can you post your debug->info (available under ? menu?

                              In addition, what do you see if you run the following code

                              notepad.getVersion()

                              in the python script console, like here

                              Cheers
                              Claudia

                              Alguem MeuglaA 1 Reply Last reply Reply Quote 0
                              • Alguem MeuglaA
                                Alguem Meugla @Claudia Frank
                                last edited by

                                @Claudia-Frank said:

                                Can you post your debug->info (available under ? menu?

                                Here it is:
                                Notepad++ v7.4.2 (32-bit)
                                Build time : Jun 18 2017 - 23:34:19
                                Path : C:\Program Files (x86)\Notepad++\notepad++.exe
                                Admin mode : OFF
                                Local Conf mode : OFF
                                OS : Windows 10 (64-bit)
                                Plugins : JSMinNPP.dll mimeTools.dll NppConverter.dll NppExec.dll NppExport.dll NppFTP.dll NppTextFX.dll PluginManager.dll PythonScript.dll ReloadButton.dll

                                In addition, what do you see if you run the following code

                                notepad.getVersion()

                                in the python script console, like here

                                It returns:
                                (7, 4, 2)

                                Definitely version 7.4.2.

                                Claudia FrankC 1 Reply Last reply Reply Quote 0
                                • Claudia FrankC
                                  Claudia Frank @Alguem Meugla
                                  last edited by Claudia Frank

                                  @Alguem-Meugla

                                  Ok, the command was to see if the python script plugin works in general and
                                  the debug info shows, that two directories are of interest in regards to automated startup.

                                  The standard startup.py, the one which is automatically created during installation
                                  should be located under C:\Program Files (x86)\Notepad++\plugins\PythonScript\scripts\

                                  The user startup.py, the one you should have created should be located under
                                  %APPDATA%\Notepad++\plugins\config\PythonScript\scripts

                                  Concerning the print statement - a standard python script installation has has the following
                                  entry in the standard startup.py

                                  sys.stdout = editor

                                  This means, that a print … will not be send to the console but to the currently active document.
                                  In order to change this behavior you need to modify it like this

                                  sys.stdout = console

                                  and restart npp. Now a print statement would be send to console.

                                  In addition, there should be a file %APPDATA%\Notepad++\plugins\config\PythonScriptStartup.cnf.

                                  Can you post its content?

                                  Cheers
                                  Claudia

                                  Alguem MeuglaA 1 Reply Last reply Reply Quote 0
                                  • Alguem MeuglaA
                                    Alguem Meugla @Claudia Frank
                                    last edited by Alguem Meugla

                                    @Claudia-Frank said:

                                    Concerning the print statement - a standard python script installation has has the following
                                    entry in the standard startup.py

                                    sys.stdout = editor

                                    This means, that a print … will not be send to the console but to the currently active document.
                                    In order to change this behavior you need to modify it like this

                                    sys.stdout = console

                                    and restart npp. Now a print statement would be send to console.

                                    I don’t know python (i only learnt the first lessons of it on codecademy), so I didn’t know if print was supposed to write on the console or in the file. First I thought it was on the console so I was always opening it to see if there was something. But when I tested the script on the same folder as the Samples and the default startup.py I found it was printing in the file. Not a problem. I have always checked in both places for the print output.

                                    In addition, there should be a file %APPDATA%\Notepad++\plugins\config\PythonScriptStartup.cnf.

                                    Can you post its content?

                                    SETTING/PREFERINSTALLEDPYTHON/0 and on the next line
SETTING/STARTUP/ATSTARTUP

                                    Claudia FrankC 1 Reply Last reply Reply Quote 0
                                    • Claudia FrankC
                                      Claudia Frank @Alguem Meugla
                                      last edited by Claudia Frank

                                      @Alguem-Meugla

                                      Looks ok - do you see two startup.py if you
                                      goto Plugins->Python Script->Scripts ?

                                      One should have the addition (User).

                                      If you press the CTRL key while clicking onto the user startup.py it should open as a document.

                                      If this is the case, add the following line under the bufferactivated callback.

                                      console.write('callback_FOLD_BUFFERACTIVATED\n')
                                      

                                      Should look like

                                      def callback_FOLD_BUFFERACTIVATED(args):
                                          console.write('callback_FOLD_BUFFERACTIVATED\n')
                                          global should_be_folded
                                          _state = editor.getProperty('AUTO_FOLDED')
                                          if _state == '':
                                              filename, extension = os.path.splitext(notepad.getBufferFilename(args['bufferID']))
                                              if extension in FILE_EXTENSION_LIST:
                                                  editor.setProperty('AUTO_FOLDED', '1')
                                                  should_be_folded = True
                                              else:
                                                  editor.setProperty('AUTO_FOLDED', '-1')
                                                  should_be_folded = False
                                          else:
                                              should_be_folded = False
                                      

                                      Restart npp.

                                      Now, every time you switch a tab you should see the line

                                      callback_FOLD_BUFFERACTIVATED
                                      

                                      written to the console - to prove if the script runs at all.

                                      Cheers
                                      Claudia

                                      Alguem MeuglaA 1 Reply Last reply Reply Quote 0
                                      • Alguem MeuglaA
                                        Alguem Meugla @Claudia Frank
                                        last edited by

                                        @Claudia-Frank said:

                                        Looks ok - do you see two startup.py if you
                                        goto Plugins->Python Script->Scripts ?

                                        There’s only one at Plugins->Python Script->Scripts, the default startup.py. I can only add the new startup.py if I create a new folder like Samples or I put it inside the Samples folder:
                                        image

                                        I also have one new startup.py at %APPDATA%\Notepad++\plugins\config\PythonScript\scripts\startup.py and more at MyDocuments…
                                        Should it appear there as a second startup.py because of this?

                                        Restart npp.

                                        Now, every time you switch a tab you should see the line

                                        callback_FOLD_BUFFERACTIVATED
                                        written to the console - to prove if the script runs at all.

                                        The console outputs nothing when I switch tab, neither when I click the script (the blue startup.py above in the image).

                                        Claudia FrankC 1 Reply Last reply Reply Quote 0
                                        • Claudia FrankC
                                          Claudia Frank @Alguem Meugla
                                          last edited by Claudia Frank

                                          @Alguem-Meugla

                                          Should it appear there as a second startup.py because of this?

                                          Yes, because your installation shows

                                          Local Conf mode : OFF

                                          this means, that notepad++ configuration files and plugin directories are located under

                                          %APPDATA%\Notepad++

                                          therefore, if you use Plugins->Python Script->New Script the script gets created in

                                          %APPDATA%\Notepad++\plugins\config\PythonScript\scripts

                                          As there is no startup.py in this directory per default you can create it and it should appear
                                          in the same level as the standard startup.py but with the addition of (User) (done by Python Script plugin).

                                          Please enter the following commands in the python console and post the ouput

                                          import sys
                                          print '\n'.join(sys.path)
                                          

                                          Cheers
                                          Claudia

                                          Alguem MeuglaA 1 Reply Last reply Reply Quote 0
                                          • Alguem MeuglaA
                                            Alguem Meugla @Claudia Frank
                                            last edited by

                                            @Claudia-Frank said:

                                            this means, that notepad++ configuration files and plugin directories are located under

                                            %APPDATA%\Notepad++

                                            therefore, if you use Plugins->Python Script->New Script the script gets created in

                                            %APPDATA%\Notepad++\plugins\config\PythonScript\scripts

                                            As there is no startup.py in this directory per default you can create it and it should appear
                                            in the same level as the standard startup.py but with the addition of (User) (done by Python Script plugin).

                                            New Script takes me to the last place I left the dialog on:
                                            gif not avaiable

                                            And I don’t have a startup.py (User) on the Scripts menu, while there’s one at %APPDATA%\Notepad++\plugins\config\PythonScript\scripts:
                                            image not avaiable

                                            Please enter the following commands in the python console and post the ouput

                                            import sys
                                            print '\n'.join(sys.path)
                                            

                                            C:\Program Files (x86)\Notepad++\plugins\PythonScript\lib
                                            C:\Users\Alguem\AppData\Roaming\Notepad++\plugins\Config\PythonScript\lib
                                            C:\Program Files (x86)\Notepad++\plugins\PythonScript\scripts
                                            C:\Users\Alguem\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts
                                            C:\Program Files (x86)\Notepad++\plugins\PythonScript\lib\lib-tk
                                            C:\Program Files (x86)\Notepad++\python27.zip
                                            C:\Program Files (x86)\Notepad++\DLLs
                                            C:\Program Files (x86)\Notepad++\lib
                                            C:\Program Files (x86)\Notepad++\lib\plat-win
                                            C:\Program Files (x86)\Notepad++\lib\lib-tk
                                            C:\Program Files (x86)\Notepad++

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