Community
    • Login

    Copy Link in Caret /w Ctrl+P (LuaScript)

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    11 Posts 5 Posters 595 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.
    • alienfxfiendA
      alienfxfiend
      last edited by

      I need help /w a LuaScripting problem, I see that when you Right-Click a Link it lets you “Copy Link” I want a keyboard shortcut for it instead to speed up my Copy\ Pasta. Could someone help me, the codes from ChatGPT & Bard were buggy & didn’t work. For instance, when I click anywhere on a URL & press Ctrl+P I want the entire URL copied to the Clipboard. Thanks !

      PeterJonesP 1 Reply Last reply Reply Quote 0
      • PeterJonesP
        PeterJones @alienfxfiend
        last edited by PeterJones

        @alienfxfiend ,

        That command is macro-playable, even though it’s not macro-recordable:

                <Macro name="CopyLink" Ctrl="yes" Alt="no" Shift="no" Key="80">
                    <Action type="2" message="0" wParam="42082" lParam="0" sParam="" />
                </Macro>
        

        If you paste that into your <Macros> section of shortcuts.xml and restart Notepad++, Ctrl+P will run the Copy Link entry – er, well, it will if you use Settings > Preferences > Shortcut Mapper to turn off the Ctrl+P shortcut for File > Print. – No plugin required, this will work with a vanilla copy of Notepad++.

        I got the 42082 from the english.xml localization file, or equivalently from the menuCmdID.h

        I don’t use LuaScript, so I don’t know the syntax: I will use the kind of phraseology that I’d use to describe how to do it in PythonScript. But I assume LuaScript has a wrapper for the NPPM_MENUCOMMAND message, which you would pass in lParam="42082" (whatever syntax the LuaScript uses: they might even have a constant/enumeration for it, similar to IDM_EDIT_COPY_LINK). I assume that LuaScript mechanism to map a shortcut to a particular script, so if you used that, you’d have the mapping.

        alienfxfiendA 1 Reply Last reply Reply Quote 4
        • alienfxfiendA
          alienfxfiend @PeterJones
          last edited by alienfxfiend

          @PeterJones Thanks, that worked ! I will use it till someone musters the generosity of posting the LuaScript Startup code :D

          This is the code I got from ChatGPT, the first line was taken off another working LuaScript code I got from someone on Github (this code is broken, & doesn’t work):
          – Copy Link In Caret w/o Right-Click
          npp.AddShortcut(“Copy Link”, “Ctrl+P”, function()
          local editor = notepad.getCurrentBuffer()
          local currentPos = editor.currentPos
          local startPos = editor:wordStartPosition(currentPos, true)
          local endPos = editor:wordEndPosition(currentPos, true)
          local link = editor:getTextRange(startPos, endPos)
          if link ~= “” then
          editor:copyText(link)
          end
          end)

          Alan KilbornA mpheathM 2 Replies Last reply Reply Quote 0
          • Alan KilbornA
            Alan Kilborn @alienfxfiend
            last edited by Alan Kilborn

            @alienfxfiend said in Copy Link in Caret /w Ctrl+P (LuaScript):

            This is the code I got from ChatGPT…this code doesn’t work

            Not sure I see the value at all in posting non-working code that wasn’t even written by a human. :-(

            1 Reply Last reply Reply Quote 2
            • mpheathM
              mpheath @alienfxfiend
              last edited by

              @alienfxfiend said in Copy Link in Caret /w Ctrl+P (LuaScript):

              @PeterJones Thanks, that worked ! I will use it till someone musters the generosity of posting the LuaScript Startup code :D

              Here, freshly coded by a human as a gift to a human :)

              -- Topic: https://community.notepad-plus-plus.org/topic/24681/copy-link-in-caret-w-ctrl-p-luascript
              -- Valid url characters: https://stackoverflow.com/a/1547940
              -- ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
              -- Include % for url encoding
              
              npp.AddShortcut("Copy this link", "Ctrl+Alt+1", function()
                  local pos = editor.CurrentPos
                  local col = editor.Column[pos]
                  local line = editor:GetCurLine()
                  local urlpattern = "[%w%-%._~:/%?#%[%]@!%$&'%(%)*%+,;=%%]+"
              
                  for startpos, word, endpos in string.gmatch(line, '()(' .. urlpattern .. ')()') do
                      if col > startpos and col < endpos then
                          if not string.find(word, '://') then
                              print('Invalid link: ' .. word)
                          else
                              print('Copied link: ' .. word)
                              editor:CopyText(word)
                              return
                          end
                      end
                  end
              end)
              

              The print() lines can be removed once tested as working ok. Check the LuaScript console for the printed output to validate.

              Example:

              Invalid link: Topic:
              Copied link: https://community.notepad-plus-plus.org/topic/24681/copy-link-in-caret-w-ctrl-p-luascript
              

              A URL can be almost any character though usually has the substring of :// which is what string.find() searchs for to determine if is a URL and not some other word at the point of the caret.

              alienfxfiendA 1 Reply Last reply Reply Quote 3
              • mpheathM mpheath referenced this topic on
              • alienfxfiendA
                alienfxfiend @mpheath
                last edited by alienfxfiend

                @mpheath Wow, thanks a million ! This is exactly what I wanted. I’am so grateful to you for helping me out —this will 10x my research efforts !! Works like a charm. Amazing genius-level solution ;-) Also thank you PeterJones, your method is also flawless.

                1 Reply Last reply Reply Quote 2
                • guy038G
                  guy038
                  last edited by

                  Hello, @alienfxfiend, @peterjones, @alan-kilborn, @mpheath and All,

                  Hum… I’m really embarrassed, @mpheath ! Because the macro, provided by @peterjones works flawlessly but your lua script does not work as expected :-(

                  I’ve just did a first try on my old Win XP - 32 bits machine, with N++ v7.9.2 and LuaScript v10.1 and no chance ! ( Note that the recent LuaScript versions v11 and v12 do not work with N++ v7.9.2 )

                  I surely miss something obvious, but I can’t see why !

                  Best Regards,

                  guy038

                  mpheathM 1 Reply Last reply Reply Quote 0
                  • mpheathM
                    mpheath @guy038
                    last edited by

                    @guy038 Hello

                    Peter’s answer would be like the Copy Link already in the contextmenu source. So should be good. LuaScript can do the IDM_EDIT_COPY_LINK command though it needs to be assigned first before use. Easier than my initial code…

                    npp.AddShortcut("Copy this link", "Ctrl+Alt+1", function()
                    	local IDM_EDIT_COPY_LINK = 42082
                    	npp:MenuCommand(IDM_EDIT_COPY_LINK)
                    end)
                    

                    Still on Win XP, good for you. I am on Win 7 though it is 64 bit OS.

                    I just downloaded the N++ portable v7.9.2 32 bit and added LuaScript which states it is v0.10 32 bit, not v10.1 that you mention. It look like v0.10.1 was released 3 days after v0.10. The v0.10 archive on Github is missing the lua.dll file though Plugin Admin did download lua.dll so perhaps it is actual v0.10.1 though the about box says v0.10 .

                    I have added the posted lua code in the Lua startup script, restarted N++ and tested with the LuaScript console open so as to see the printed messages. I appears to be working just like in N++ v8.5.4 .

                    I swapped LuaScript v0.10 with v0.10.1 which I doubt is a difference as just a appveyor.yml script was updated, so the version downloaded from Plugin Admin should still be ok. Even the checksums for the dll files are the same. Started N++ again and tested. It is working. The checksums…

                        File: LuaScript\Lua.dll
                      CRC-32: 30670d6b
                         MD5: ca8e5c8431e0904dac146ee98eb492f5
                       SHA-1: 4e522b6f0acf554974d6321581b2d8a626f1fe6d
                    
                        File: LuaScript\LuaScript.dll
                      CRC-32: c0f063e1
                         MD5: 81a00ae7bb7a7de32cf429fb3b170035
                       SHA-1: 6c56da18147f2b41e576b5ec678d7010cbb3f11b
                    

                    Are these the same as your dll files? I doubt you have 64 dll files as I got a warning from N++ on startup as it could not load them, so that could not be causing the issue.

                    Perhaps the caret position is at the start of the URL string. Try changing this line

                    if col > startpos and col < endpos then
                    

                    to

                    if col >= startpos - 1 and col < endpos then
                    

                    which which gets the URL from the starting edge of it.

                    Finally, try restarting N++. Open the LuaScript console as it should print a result. Test with the URLs in the startup script as that is what I tested with. The shortcut in posted code is Ctrl+Alt+1 as in the number 1, not the letter L. Check the shortcut mapper in case a conflict is happening. Also try the link in the menu Plugins > LuaScript > Copy this link .

                    If you have further troubles, I could install Win XP into a Virtual Machine and try it there to see if I can make it fail.

                    1 Reply Last reply Reply Quote 1
                    • guy038G
                      guy038
                      last edited by guy038

                      Hi, @mpheath and All,

                      Many thanks for your reply and do not bother about installing Wn XP on a virtual machine !

                      Because, in addition to my old laptop, I’ve ALSO got, since July 2021, a decent Win-10 64 bits Pro machine where I installed the very last 0.12 - x64 version of LuaScript, as well as the last version of the PythonScript and NppExec plugins. Thus, here is my debug info :

                      Notepad++ v8.5.4   (64-bit)
                      Build time : Jun 17 2023 - 20:42:45
                      Path : E:\854_x64\notepad++.exe
                      Command Line : 
                      Admin mode : OFF
                      Local Conf mode : ON
                      Cloud Config : OFF
                      OS Name : Windows 10 Pro (64-bit)
                      OS Version : 22H2
                      OS Build : 19045.3086
                      Current ANSI codepage : 1252
                      Plugins : 
                          mimeTools (2.9)
                          NppConverter (4.5)
                          NppExport (0.4)
                          PythonScript (2)
                          LuaScript (0.12)
                          NppExec (0.8.4)
                      

                      And here are the checksums for the Lua.dll and LuaScript.dll plugins :

                      Nom: Lua.dll
                      Taille: 433152 octets (423 KiB)
                      CRC32: 39D70D83
                      SHA256: 55cbc36216bfcfbf44bb551ded40f8946389f4982fb096352455ec24e987367f
                      SHA1: bea0917a9159d9ab67e2c40f848efb12cd3d17eb
                      

                      And :

                      Nom: LuaScript.dll
                      Taille: 589824 octets (576 KiB)
                      CRC32: 7EC421AF
                      SHA256: 459f4aebe1f7843a82d092f6d899edb0fe651d89c3ee7d258dc1da26e78ea691
                      SHA1: 1985515dc102ef6112ae63816ab5393a33ef8ba4
                      

                      So, with N++ v8.5.4, I first verified that the macro :

                              <Macro name="Copy Link" Ctrl="no" Alt="no" Shift="no" Key="120">
                                  <Action type="2" message="0" wParam="42082" lParam="0" sParam="" />
                              </Macro>
                      

                      Placed in shortcuts.xml still works. Then, I noticed, as you said, that the Copy Link option is available in the Context Menu, as soon as current caret location is within the range of a link. BTW, I also, verified that this was ALREADY the case with N++ v7.9.2 on my old Win XP machine ! So, all the story could stop here !


                      However, I’m wondering why your previous and second version of your LuaScript, below, that I even shortened, still do not work, on my recent HP laptop !

                      npp.AddShortcut("Copy this link", "Ctrl+Alt+3", function()
                      	npp:MenuCommand(42082)
                      end)
                      

                      I’ve just changed the shortcut to Ctrl + Alt + 2 and Ctrl + Alt + 3 in your two scripts, as I noticed, on my Win XP machine, that the Ctrl + Alt + 1 shortcut is normally used by the ComparPlus plugin, by default, to set the first tab to compare !

                      I also tried your work-around :

                              if col > startpos and col < endpos then
                      

                      to

                              if col >= startpos - 1 and col < endpos then
                      

                      without any success ! So, why these simple Lua scripts are bugging ???

                      Normally, the process should be :

                      • Go to any tab containing a link

                      • Use the Ctrl + Alt + 2 or Ctrl + Alt + 3 shortcut to trigger the copy of current link contents in the clipboard

                      • Paste the clipboard contents anywhere else !


                      See you later,

                      guy038

                      P.S. : two additional points :

                      • Your two scripts Copy_Link.lua and Copy_Link_2.lua are installed in the same directory than my locale install ( E:\854_x64\... )

                      • I do not see the options Copy_Link.lua Ctrl+Alt+ 2 and Copy_Link.lua Ctrl+Alt+ 3 in the Lua menu ?


                      Last attempt :

                      I added the commands print “OK” and print “OK_2” at the end of the scripts and executed them from the Lua Console, with the commands dofile("Copy_Link.lua") and dofile("Copy_Link_2.lua")

                      => Correct execution but no result, too !

                      mpheathM 1 Reply Last reply Reply Quote 0
                      • mpheathM
                        mpheath @guy038
                        last edited by mpheath

                        @guy038 With your last attempts of using like dofile('path\\to\\copy_link.lua') is something that I cannot get to work. No errors, no reaction at all. I tried adding the lua file into a path within package.path and tried require('copy_link') and cannot get to work.

                        I can only get it to work in the startup script which is saved as startup.lua in the Config directory. Access the startup script from the menu Plugins > LuaScript > Edit Startup Script .

                        npp.AddShortcut() does not work in a separate lua file. Probably needs to be applied only at startup when the lua subsystem of LuaScript starts.

                        dofile() this code as test.lua and it prints the value of package.path and nothing else, no item named TestShortcut created in the menu.

                        print(package.path)
                        npp.AddShortcut('TestShortcut', '', function() print('test') end)
                        

                        npp.AddShortcut() does not want to work outside of startup.lua .

                        1 Reply Last reply Reply Quote 1
                        • guy038G
                          guy038
                          last edited by guy038

                          Hi, @mpheath and All,

                          I confirm that the command npp.AddShortcut(... works ONLY when appended to startup.lua and do not work in a separate Lua file !

                          And, this time, after restarting N++, the new options Copy this link Ctrl+Alt+2 and Copy this link Ctrl+Alt+3 were present in the Lua sub-menu and did the job, correctly

                          Finally, as this command is already included in the contextMenu.xml, I suppose that any script, whatever it is, that mimics the Copy link function, seems useless !

                          Again, thank you very much, @mpheath, for your support !

                          Best Regards,

                          guy038

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