Community
    • 登入

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

    已排程 已置頂 已鎖定 已移動 Help wanted · · · – – – · · ·
    44 貼文 3 Posters 37.4k 瀏覽
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • Claudia FrankC
      Claudia Frank @Alguem Meugla
      最後由 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 條回覆 最後回覆 回覆 引用 0
      • Alguem MeuglaA
        Alguem Meugla @Claudia Frank
        最後由 編輯

        @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 條回覆 最後回覆 回覆 引用 0
        • Claudia FrankC
          Claudia Frank @Alguem Meugla
          最後由 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 條回覆 最後回覆 回覆 引用 0
          • Alguem MeuglaA
            Alguem Meugla @Claudia Frank
            最後由 編輯

            @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 條回覆 最後回覆 回覆 引用 0
            • Claudia FrankC
              Claudia Frank @Alguem Meugla
              最後由 編輯

              @Alguem-Meugla

              ok, so the reason why it doesn’t work is that python script plugin
              doesn’t find the startup.py but why…

              Another thing which is strange, whenever I use New Script
              it redirects to the user scripts directory, regardless if I created
              script in another subdirectory, totally different directory or not.
              Maybe this is a coincident because it can’t find the user script directory.

              In addition,

              C:\Users\Alguem\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts

              how could this be, mine is pointing to

              C:\users\linus\Application Data\Notepad++\plugins\Config\PythonScript\scripts

              Has this changed with windows 10??
              May I ask how you installed python script?
              Using plugin manager or the msi package I pointed to?
              Which python script version did you install?
              Did you somehow redirect your %APPDATA% environment variable?

              When you press CTRL+R, the windows run command should open, and type
              %APPDATA% and press enter, which directory gets opened and does it contain
              a subdirectory notepad++??

              Cheers
              Claudia

              1 條回覆 最後回覆 回覆 引用 0
              • Alguem MeuglaA
                Alguem Meugla
                最後由 編輯

                @Claudia-Frank said:

                In addition,

                C:\Users\Alguem\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts

                how could this be, mine is pointing to

                C:\users\linus\Application Data\Notepad++\plugins\Config\PythonScript\scripts

                Has this changed with windows 10??

                Isn’t Application Data the same as AppData?
                And %APPDATA% always redirected me to \AppData\Roaming.
                What’s your windows version?

                May I ask how you installed python script?
                Using plugin manager or the msi package I pointed to?

                I used Plugin Manager both times, before and after I replaced the default startup.py, when I had to reinstall it.
                I will try reinstalling it using that package. Plugin manager usually works right and is very simple for me.

                Which python script version did you install?

                It says 1.0.8.

                When you press CTRL+R, the windows run command should open, and type
                %APPDATA% and press enter, which directory gets opened and does it contain
                a subdirectory notepad++??

                CTRL+R reloads the page…
                I can use WINDOWSKEY+R instead, which opens the Run window, or I can use the search menu on Windows 10. Typing %APPDATA% both opens …\AppData\Roaming\.

                Claudia FrankC 1 條回覆 最後回覆 回覆 引用 0
                • Claudia FrankC
                  Claudia Frank @Alguem Meugla
                  最後由 編輯

                  @Alguem-Meugla

                  What’s your windows version?

                  Since a couple of month I use linux exclusively.
                  Npp is started via windows emulation software WINE.
                  But in the past I was using Windows XP and Windows 7 and I thought
                  %APPDATA% redirected to “Application Data” like within wine,
                  maybe I have false memory.

                  Yes, 1.0.8 is the version I use as well.
                  As mentioned earlier, don’t replace the default startup.py as it contains
                  needed code for plugin script itself.

                  If you can’t get a user startup.py to work, append the posted script
                  to the end of the default startup.py - then it has to work - I hope.

                  Cheers
                  Claudia

                  Alguem MeuglaA 2 條回覆 最後回覆 回覆 引用 0
                  • Alguem MeuglaA
                    Alguem Meugla @Claudia Frank
                    最後由 編輯

                    @Claudia-Frank
                    I tried to reinstall Python Script using the package you linked above, and New Script still opens the same folder and the script still doesn’t work at startup.
                    One thing to note is that when I go to Python Script configuration it shows startup.py as a User script:

                    Adding it to Menu items makes it show at Plugins>Python Script> startup.py.

                    1 條回覆 最後回覆 回覆 引用 0
                    • Alguem MeuglaA
                      Alguem Meugla @Claudia Frank
                      最後由 編輯

                      @Claudia-Frank
                      I appended the script (below) to the end of the default startup.py

                      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):
                          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
                      
                      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])
                      
                      console.write('hello'))
                      

                      Note the last line which I added. When I open my html file the console output is:

                      helloPython 2.7.6-notepad++ r2 (default, Apr 21 2014, 19:26:54) [MSC v.1600 32 bit (Intel)]
                      Initialisation took 204ms
                      Ready.

                      and the lines don’t collapse. When I open another html file, it ouputs callback_FOLD_BUFFERACTIVATED and its lines are collapsed. Switching back to the first file, the same happens (working!!!). But it still doesn’t work right at startup.

                      Claudia FrankC 1 條回覆 最後回覆 回覆 引用 0
                      • Claudia FrankC
                        Claudia Frank @Alguem Meugla
                        最後由 Claudia Frank 編輯

                        @Alguem-Meugla

                        ok, logic error, change the line

                        should_be_folded = False
                        

                        to

                        should_be_folded = True
                        

                        It is the line which is directly before

                        def callback_FOLD_BUFFERACTIVATED(args):
                        

                        But only this line.

                        But I’m still confused that your user startup.py doesn’t work but at least you
                        have it working now.

                        Cheers
                        Claudia

                        Alguem MeuglaA 1 條回覆 最後回覆 回覆 引用 1
                        • Alguem MeuglaA
                          Alguem Meugla @Claudia Frank
                          最後由 編輯

                          @Claudia-Frank
                          Thank you a lot for your help.
                          Could it also be possible to put inside the brackets NPP_COLLAPSE(19,41) how many numbers I ask it for? eg: NPP_COLLAPSE(19,22,28,35,43,54,60,67,89,139,220,…). It actually only works for 2 line numbers. It’s ok if you don’t want to do it, I can keep using NPP_COLLAPSE_IT everywhere. Thank you!

                          Claudia FrankC 1 條回覆 最後回覆 回覆 引用 0
                          • Claudia FrankC
                            Claudia Frank @Alguem Meugla
                            最後由 編輯

                            @Alguem-Meugla

                            Yes, slightly different regex and for loop can do this but we need to define the cases.

                            Is a list ALWAYS a pair of fold from line to line triggers?
                            Or is a list with more than two entries ALWAYS fold this line for each item
                            and a list with 2 entries a from … to …
                            Or …

                            Btw, may last post about logic error was not a logic issue.
                            Looks like the initial start of npp doesn’t trigger a bufferactivated callback
                            or python script hasn’t been started at that time to catch this notification.
                            I already changed that and will be included in next version.

                            Cheers
                            Claudia

                            Alguem MeuglaA 1 條回覆 最後回覆 回覆 引用 0
                            • Alguem MeuglaA
                              Alguem Meugla @Claudia Frank
                              最後由 編輯

                              @Claudia-Frank
                              Oh I though NPP_COLLAPSE(19,41) was going only to collapse lines 19 and 41, but instead it collapse lines 19 to 41… Thank you anyway. This script is very helpful.

                              Claudia FrankC 1 條回覆 最後回覆 回覆 引用 0
                              • Claudia FrankC
                                Claudia Frank @Alguem Meugla
                                最後由 編輯

                                @Alguem-Meugla

                                just for clarification, you are happy? No further modification needed?

                                Cheers
                                Claudia

                                Alguem MeuglaA 1 條回覆 最後回覆 回覆 引用 0
                                • Alguem MeuglaA
                                  Alguem Meugla @Claudia Frank
                                  最後由 編輯

                                  @Claudia-Frank said:

                                  just for clarification, you are happy? No further modification needed?

                                  Yeah, it looks good enough. Ty.

                                  1 條回覆 最後回覆 回覆 引用 1
                                  • 第一個貼文
                                    最後的貼文
                                  The Community of users of the Notepad++ text editor.
                                  Powered by NodeBB | Contributors