Community

    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search

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

    Help wanted · · · – – – · · ·
    3
    44
    30844
    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.
    • Alguem Meugla
      Alguem Meugla @Claudia Frank last edited by Alguem Meugla

      .

      <!DOCTYPE html>
      <html>
      <head>       <!-- NPP_PLZ_COLLAPSE_THIS_LINE -->
          <script>
              function func_h1() {
                  document.getElementById("h1").innerHTML = "Should I be collapsed?";
              }
          </script>
      </head>
      <body>
      
          <h2>JavaScript Example</h2>
      
          <p id="h1">Head1</p>
          <p id="b1">Body1</p>
      
          <button type="button" onclick="func_h1()">Head1</button>
          <button type="button" onclick="func_b1()">Body1</button>
      
      
          <script>       // NPP_PLZ_COLLAPSE_THIS_LINE
              function func_b1() {
                  document.getElementById("b1").innerHTML = "Or Should I be collpased?";
              }
          </script>
          <script>
              function func_b1() {
                  document.getElementById("b1").innerHTML = "Or Should I be collpased?";
              }
          </script>
      </body>
      </html> 
      

      It would then “click” on the - that is on the right of the number of the lines that contains “NPP_PLZ_COLLAPSE_THIS_LINE” (btw when I said “+” above in a post I meant “-”).

      OR

      1.<!DOCTYPE html>
      2.<html>
      3.<head>       <!-- NPP_PLZ_COLLAPSE_THE_LINES(3,21) -->
      4.    <script>
      5.        function func_h1() {
      6.            document.getElementById("h1").innerHTML = "Should I be collapsed?";
      7.        }
      8.    </script>
      9.</head>
      10.<body>
      11.
      12.    <h2>JavaScript Example</h2>
      13. 
      14.    <p id="h1">Head1</p>
      15.    <p id="b1">Body1</p>
      16.
      17.    <button type="button" onclick="func_h1()">Head1</button>
      18.    <button type="button" onclick="func_b1()">Body1</button>
      19.
      20.
      21.    <script>
      22.        function func_b1() {
      23.            document.getElementById("b1").innerHTML = "Or Should I be collpased?";
      24.        }
      25.    </script>
      26.    <script>
      27.        function func_b1() {
      28.            document.getElementById("b1").innerHTML = "Or Should I be collpased?";
      29.        }
      30.    </script>
      31.</body>
      32.</html> 
      

      It would collapse the lines 3 and 21 because of “NPP_PLZ_COLLAPSE_THE_LINES(3,21)”.

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

        @Alguem-Meugla

        ok, let’s finalize it.
        The folding logic is the following

        Searching through the document to find either the identifier to collapse
        the fold header in this line or the identifier to collapse every root fold header starting
        from A to (including) Z.

        In the case of folding A to Z the identifier is immediately followed by the start and end line separated by a comma and encased by round parenthesis.

        In any case only this level will be folded so if clicking onto the plus sign
        the whole structure gets expanded again.

        Program logic is,
        whenever a file gets activated first it gets scanned about the identifiers and
        the parts get collapsed. If a file gets closed and reopened the logic will be applied again.
        If only the buffer is switch, meaning you switch from one tab to another one
        nothing happens.

        Do you agree?

        Cheers
        Claudia

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

          @Claudia-Frank said:

          Program logic is,
          whenever a file gets activated first it gets scanned about the identifiers and
          the parts get collapsed. If a file gets closed and reopened the logic will be applied again.
          If only the buffer is switch, meaning you switch from one tab to another one
          nothing happens.

          Do you agree?

          That’s it!

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

            @Alguem-Meugla

            ok - I don’t find the time today but I will provide a possible solution tomorrow.

            Cheers
            Claudia

            1 Reply Last reply Reply Quote 1
            • savage roar
              savage roar last edited by

              I have a similar problem.
              I wrote a script that solves it, but I can’t make it work properly in FILEOPENED callback.
              This works just fine.

              from Npp import *
              
              # Collapses all blocks annotated with "//!"
              def auto_collapse():
              	to_collapse = [];
              	for i in range(0, editor.getLineCount()-1):
              		line = editor.getLine(i).strip()
              		if line[:3] == "//!":
              			to_collapse.append(i+1)
              	for num in to_collapse:
              		editor.foldLine(num, 0)
              
              auto_collapse()
              

              But this script behaves buggy as hell (no errors, just incorrect folding). Why? Maybe there is another “FILEREADY” callback to hook on?

              from Npp import *
              
              def auto_collapse(args):
              	notepad.activateBufferID(args["bufferID"])
              	to_collapse = [];
              	for i in range(0, editor.getLineCount()-1):
              		line = editor.getLine(i).strip()
              		if line[:3] == "//!":
              			to_collapse.append(i+1)
              	for num in to_collapse:
              		editor.foldLine(num, 0)
              		
              notepad.callback(auto_collapse, [NOTIFICATION.FILEOPENED])
              
              1 Reply Last reply Reply Quote 0
              • savage roar
                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 Frank 1 Reply Last reply Reply Quote 0
                • Claudia Frank
                  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 Meugla 1 Reply Last reply Reply Quote 0
                  • Claudia Frank
                    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 Frank
                      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 Meugla
                        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 Frank 2 Replies Last reply Reply Quote 1
                        • Claudia Frank
                          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 Frank
                            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 Meugla 1 Reply Last reply Reply Quote 1
                            • Alguem Meugla
                              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 Frank 1 Reply Last reply Reply Quote 1
                              • Claudia Frank
                                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 Meugla 1 Reply Last reply Reply Quote 0
                                • Alguem Meugla
                                  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 Frank 1 Reply Last reply Reply Quote 0
                                  • Claudia Frank
                                    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 Meugla 1 Reply Last reply Reply Quote 0
                                    • Alguem Meugla
                                      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 Frank 1 Reply Last reply Reply Quote 0
                                      • Claudia Frank
                                        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 Meugla 1 Reply Last reply Reply Quote 0
                                        • Alguem Meugla
                                          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 Frank 1 Reply Last reply Reply Quote 0
                                          • Claudia Frank
                                            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 Meugla 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright © 2014 NodeBB Forums | Contributors