• Login
Community
  • Login

[New Plugin] LuaScript

Scheduled Pinned Locked Moved Notepad++ & Plugin Development
29 Posts 9 Posters 68.0k 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.
  • Y
    Yaron
    last edited by Feb 5, 2016, 4:52 PM

    Hello dail,

    Thanks for replying.

    I use Dave’s PythonScript and absolutely love it.
    Still, one can always learn and benefit from other good options.

    I’m glad you plan to continue developing “LuaScript”. I’ll be looking forward to the next versions.

    Thanks again for your great work.

    Best regards.

    1 Reply Last reply Reply Quote 0
    • D
      dail
      last edited by Feb 5, 2016, 5:21 PM

      I agree the PythonScript plugin is very useful. I plan on stealing borrowing lots of code from that :)

      1 Reply Last reply Reply Quote 1
      • Y
        Yaron
        last edited by Feb 5, 2016, 8:14 PM

        I’m sure Dave would approve the borrowing. :)
        That would be great.

        When you start working on displaying custom scripts in the menu, please consider the following point:
        As far as I know, you can’t assign a nested plugin command to NPP context-menu.
        So it would be nice to have an option to display scripts in the LuaScript’s main menu.

        Thanks again and best of luck.

        1 Reply Last reply Reply Quote 0
        • D
          dail
          last edited by dail Feb 6, 2016, 3:19 PM Feb 6, 2016, 3:17 PM

          Version 0.1.1 has been released to fix several important bugs.

          Thanks @Claudia-Frank for the testing!

          1 Reply Last reply Reply Quote 1
          • E
            Ethan Piliavin
            last edited by Feb 9, 2016, 11:22 PM

            Wow! Very exciting. I am looking forward to testing this as a lightweight replacement for PythonScript.

            I agree that we should have an easy/smart way to access the scripts from the menu/toolbar/context.

            Can you provide some explanation of how to store and access scripts? What folder do they go into? Is it possible to include other (external) lua libraries from ?

            D 1 Reply Last reply Feb 10, 2016, 12:00 AM Reply Quote 0
            • D
              dail @Ethan Piliavin
              last edited by Feb 10, 2016, 12:00 AM

              @Ethan-Piliavin said:

              Can you provide some explanation of how to store and access scripts? What folder do they go into? Is it possible to include other (external) lua libraries from ?

              Since this isn’t possible yet I haven’t really given it much thought at all. My knowledge is very lacking of the Win32 API to create menus dynamically, etc. More than likely I’m going to re-use code (like any good software engineer should do) from the PythonScript plugin. So most likely you will see a lot of similarities. That kind of capability might be a little while in the future since for now I’m focusing on just getting the Lua API working as I want.

              1 Reply Last reply Reply Quote 0
              • D
                dail
                last edited by Feb 26, 2016, 12:54 AM

                v0.2.0 has been released! Comments/questions/suggestions are welcome.

                Major updates include:

                • Upgraded Lua to 5.3
                • Ability to assign shortcut keys to Lua functions
                • Register callback functions for several events

                For example many editors support finding the next match and also selecting it so that multiple instances can be edited at the same time. Placing this code in the startup script adds that functionality to a shortcut.

                function SelectionAddNext()
                	-- From SciTEBase.cxx
                	local flags = 0 -- can use SCFIND_MATCHCASE
                	if not editor.SelectionEmpty and editor:IsRangeWord(editor.SelectionStart, editor.SelectionEnd) then
                		flags = flags | SCFIND_WHOLEWORD
                	end
                	editor:SetTargetRange(0, editor.TextLength)
                	editor.SearchFlags = flags
                	
                	-- From Editor.cxx
                	if editor.SelectionEmpty or not editor.MultipleSelection then
                		local startWord = editor:WordStartPosition(editor.CurrentPos, true)
                		local endWord = editor:WordEndPosition(startWord, true)
                		editor:SetSelection(startWord, endWord)
                	else
                		local i = editor.MainSelection
                		local s = editor:textrange(editor.SelectionNStart[i], editor.SelectionNEnd[i])
                		local searchRanges = {{editor.SelectionNEnd[i], editor.TargetEnd}, {editor.TargetStart, editor.SelectionNStart[i]}}
                		for _, range in pairs(searchRanges) do
                			editor:SetTargetRange(range[1], range[2])
                			if editor:SearchInTarget(s) ~= -1 then
                				editor:AddSelection(editor.TargetStart, editor.TargetEnd)
                				editor:ScrollRange(editor.TargetStart, editor.TargetEnd)
                				break
                			end
                		end
                	end
                end
                
                npp.AddShortcut("Selection Add Next", "Ctrl+Shift+D", SelectionAddNext)
                
                C 1 Reply Last reply Feb 26, 2016, 1:23 AM Reply Quote 1
                • C
                  Claudia Frank @dail
                  last edited by Feb 26, 2016, 1:23 AM

                  @dail

                  Comments/questions/suggestions are welcome.

                  You asked for ;-)

                  • make it theme aware
                  • make userdata visible so that reflection can be used to execute code
                  • possibility to clear console

                  BUT, regardless of my whises - GOOD JOB

                  Cheers
                  Claudia

                  1 Reply Last reply Reply Quote 0
                  • D
                    dail
                    last edited by dail Feb 26, 2016, 2:08 AM Feb 26, 2016, 1:51 AM

                    @Claudia-Frank

                    You asked for ;-)

                    Yep! Alot of this has been driven by my specific needs so the development can be kind of narrow. So it is always good to hear others’ ideas!

                    make it theme aware

                    Notepad++ doesn’t expose near enough API to make this possible without very ugly hacks. I tried a few hacks without much luck. However, there is a way partial way around this. There is a console object that you can use that is just like the editor object but it controls (no surprise) the console. In your startup script you can manually configure the styles for your theme doing something like this for each style Lua uses:

                    console.StyleFore[SCE_LUA_COMMENT] = 0x272822
                    

                    This is not dynamic in any way, but if you are desperate you can hard-code alot of values.

                    make userdata visible so that reflection can be used to execute code

                    Care to elaborate a bit?

                    possibility to clear console

                    Good idea. Until then you can use this code:

                    function clear()
                    	console.ReadOnly = false
                    	console:ClearAll()
                    	console.ReadOnly = true
                    end
                    

                    But agree a more user-friendly and intuitive option should also be added.

                    1 Reply Last reply Reply Quote 0
                    • C
                      Claudia Frank
                      last edited by Feb 26, 2016, 2:03 AM

                      In python script you could do

                      dir(editor)
                      

                      to get the list of editor functions.
                      With lua you could use getmetatable(editor) to get the same
                      but editor must have a metatable of course.

                      My idea behind is to use that kind of reflection to create automated test cases and
                      easily see if there are new functions. Another idea might be to enhance npp with
                      lua script for a dynamic intellisense and debugging functionality.

                      Cheers
                      Claudia

                      1 Reply Last reply Reply Quote 0
                      • D
                        dail
                        last edited by Feb 26, 2016, 2:44 AM

                        Alot of the internal code came directly from SciTE. Mainly because I had no idea what I was doing (and honestly still don’t understand alot of it) ;)

                        Since the editor object has >400 methods/properties (not including getters and setters) there isn’t a Lua table that holds all this kind of information. Methods and properties are looked up as they are used, which helps reduce memory, etc especially since only a hand full of them are probably going to be used on a regular basis. That being said I’m not opposed to exposing some way to get this data. I’m certainly open to suggestions and use-cases.

                        1 Reply Last reply Reply Quote 0
                        • C
                          Claudia Frank
                          last edited by Claudia Frank Feb 26, 2016, 2:52 AM Feb 26, 2016, 2:51 AM

                          To be honest, I just read about the possibility of having userdata exposing metable a few days ago. ;-)
                          Seems to be a new feature in lua 5.3 - I will try to get more details about it and if I feel I understood enough
                          I might open a feature request ;-)

                          Cheers
                          Claudia

                          1 Reply Last reply Reply Quote 1
                          • D
                            dail
                            last edited by Feb 26, 2016, 7:45 PM

                            @Yaron

                            In case you are curious, this is how you’d get Visual Studio-like copy and paste functionality:

                            -- Mimic Visual Studio's "Ctrl+C" that copies the entire line if nothing is selected
                            npp.AddShortcut("Copy Allow Line", "Ctrl+C", function()
                                editor:CopyAllowLine()
                            end)
                            
                            -- Mimic Visual Studio's "Ctrl+X" that cuts the line if nothing is selected
                            npp.AddShortcut("Cut Allow Line", "Ctrl+X", function()
                                if editor.SelectionEmpty then
                                    editor:CopyAllowLine()
                                    editor:LineDelete()
                                else
                                    editor:Cut()
                                end
                            end)
                            

                            Also shortcuts show up in the plugin’s main menu so in theory you can assign them to N++'s context menu.

                            1 Reply Last reply Reply Quote 0
                            • guy038G
                              guy038
                              last edited by guy038 Feb 26, 2016, 10:51 PM Feb 26, 2016, 10:45 PM

                              Hi All,

                              A simple method to mimic the Visual Studio’s shortcuts ( CTRL +C/X ) is to change the default shortcuts of the lines 91 and 92, of the Scintilla commands tab, in the Shortcut Mapper !

                              Just set the shortcut ALT + CTRL + X, in line 91 and the shortcut ALT + CTRL + C, in line 92

                              Of course, I need to use the additional ALT key. So, it’s not as neat as the Dail’s Lua script :-) But this may help, anyway !

                              REMARK : If I remember correctly, I think that :

                              • The ALT + CTRL + C shortcut is used, by default, to open the Color Picker plugin

                              • The ALT + CTRL + X shortcut performs, by default, the option Translate CamelCase/underscore_case of the Translate plugin

                              So, be aware of that, if you use the Color Picker and/or Translate plugins !

                              Cheers,

                              guy038

                              1 Reply Last reply Reply Quote 0
                              • D
                                dail
                                last edited by Feb 26, 2016, 10:58 PM

                                Just using SCI_LINECUT and SCI_LINECOPY doesn’t quite match Visual Studio’s behavior. ;)

                                1 Reply Last reply Reply Quote 0
                                • guy038G
                                  guy038
                                  last edited by Feb 26, 2016, 11:56 PM

                                  Hi Dail,

                                  I, first, based on your two comments, in your Lua script, below :

                                  – Mimic Visual Studio’s “Ctrl+C” that copies the entire line if nothing is selected

                                  – Mimic Visual Studio’s “Ctrl+X” that cuts the line if nothing is selected

                                  As you said that SCI_LINECUT and SCI_LINECOPY don’t have exactly the same behaviour :

                                  • I downloaded your last 0.2.0 version of your Lua plugin

                                  • After some searches, in your Lua documentation, I understood that the Notepad object npp.AddShortcut must be called, on startup only !

                                  • So, I put your lua script text, inside the StartUp script and save it. Then, I closed and restarted my 6.8.8 N++.

                                  => As expected, the new commands CTRL + C and CTRL + X do the job, nicely, even if no selection exists !

                                  Unfortunately, I couldn not see any difference with the Scintilla commands SCI_LINECUT and SCI_LINECOPY ( that I kept, with the ALT + CTRL + X/C shortcuts ), even after pasting the clipboard contents, in an other document !

                                  What I’m missing ?

                                  Cheers,

                                  guy038

                                  1 Reply Last reply Reply Quote 0
                                  • D
                                    dail
                                    last edited by dail Feb 27, 2016, 12:15 AM Feb 27, 2016, 12:13 AM

                                    With the two shortcuts I’ve posted they work to enhance the normal copy and cut functionality. If there is a selection they both work as normal copy/cut. If there is no selection then they behave by copying or cutting the line. However, SCI_LINECUT and SCI_LINECOPY doesn’t pay any attention the the selection.

                                    Secondly, to quote the documentation about SCI_COPYALLOWLINE

                                    On Windows, an extra “MSDEVLineSelect” marker is added to the clipboard which is then used in SCI_PASTE to paste the whole line before the current line.

                                    So the difference is when it is pasted it replaces the entire line instead of pasting the line directly at the cursor’s position.

                                    Similar effects can be achieved both ways but users that are use to Visual Studios will definitely notice a difference.

                                    1 Reply Last reply Reply Quote 0
                                    • Y
                                      Yaron
                                      last edited by Feb 27, 2016, 2:10 AM

                                      Hello all,

                                      @Claudia-Frank,
                                      Thank you for your contribution (and generosity…).

                                      @guy038,
                                      Thank you for your contribution. Nice to see an old friend. :)

                                      @dail,
                                      Thank you for further developing and improving this important plugin. Great work.

                                      And thanks also for referring to my Copy Line request. Really nice.

                                      It would be nice to have a function coping the current line regardless of any selection (like editor.lineCopy() in PythonScript).

                                      I actually meant an option to copy the entire line even if part of it is selected.
                                      In a future version. :)

                                      And, with your permission, two more requests:

                                      1. A context-menu in the Console Output field.
                                      2. An option to change text direction (LTR/RTL) in the Console Input field.
                                        (PythonScript uses the System Edit-Context-Menu which includes this functionality).

                                      Best regards.

                                      1 Reply Last reply Reply Quote 0
                                      • D
                                        dail
                                        last edited by Feb 27, 2016, 3:35 AM

                                        @Yaron

                                        I actually meant an option to copy the entire line even if part of it is selected.

                                        If I understand what you are wanting you can simply use editor:LineCopy()

                                        A context-menu in the Console Output field.

                                        Would be simple to add. If you want you can open a feature request on Github and we can discuss it more there.

                                        An option to change text direction (LTR/RTL) in the Console Input field.

                                        One of the change I made from PythonScript was replace the input field with a Scintilla control. So I’m not sure how easy this would be to change the text direction.

                                        1 Reply Last reply Reply Quote 0
                                        • guy038G
                                          guy038
                                          last edited by Feb 27, 2016, 11:02 AM

                                          Hello Dail,

                                          Thanks for your quick reply ! But, even before opening my laptop and seeing your post, this morning ( in France ! ), I had understood the differences between the two behaviours. Indeed, although I ran the copy and cut commands, with a previous selection, I did not see the differences, at first sight !

                                          Sorry. It would have saved you to reply me about this matter, as you, certainly, need time to develop your Lua plugin :-(

                                          Best Regards

                                          guy038

                                          BTW, it’s a chance that you give the Visual Studio’s method, about copy/cut text ! Because, the two commands editor:LineCopy() and editor:LineDelete() are absent, from your Lua Script documentation, at the address below :

                                          https://github.com/dail8859/LuaScript/blob/master/doc/editor.md

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