• Login
Community
  • Login

Paste text without jumping to cursor

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
8 Posts 4 Posters 626 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.
  • T
    Thomas Zito
    last edited by Oct 15, 2024, 8:28 PM

    I just want to paste a 1000char line (probably HTML or JSON) and move on to the next line without my view getting jolted. (Where I continue the process). Does Notepad++ support that feature?

    A related question would be how to put the cursor off screen without scrolling to the cursor.

    P 1 Reply Last reply Oct 15, 2024, 8:45 PM Reply Quote 0
    • P
      PeterJones @Thomas Zito
      last edited by Oct 15, 2024, 8:45 PM

      @Thomas-Zito said in Paste text without jumping to cursor:

      I just want to paste a 1000char line (probably HTML or JSON) and move on to the next line without my view getting jolted. (Where I continue the process). Does Notepad++ support that feature?

      What do you mean by “view getting jolted”?

      If you paste 1000 characters that don’t end in a newline sequence, and your screen width only handles 120 characters, then Notepad++ will either scroll to the end of the line (if you don’t have word-wrap enabled), or will just visually wrap it to fit on screen (if you have word-wrap enabled from the View menu or the toolbar toggle).
      If you don’t want word-wrap on, but don’t want Notepad++ to scroll to the end of your paste, then you might consider doing the copy before the paste to include the newline sequence, so that way when you paste, Notepad++ puts the caret on the next line already.

      A related question would be how to put the cursor off screen without scrolling to the cursor.

      The typing caret for Notepad++ is always onscreen, unless you move it then intentionally scroll away from the caret. With a scripting plugin, you could automate moving the caret then scrolling in such a way that it probably goes off-screen (it would be a similar concept to my script shown in the “Is there a way to keep a blank “working space” as I’m logging information?” conversation

      A 1 Reply Last reply Oct 16, 2024, 12:28 AM Reply Quote 3
      • A
        Alan Kilborn @PeterJones
        last edited by Oct 16, 2024, 12:28 AM

        What do you mean by “view getting jolted”?

        I think what is meant here is that the OP wants to be able to paste and have the new data not shift any existing data on screen. As a normal paste leaves the caret at the end of the pasted data, if the data is of great length, this is not possible.

        Some scripting might help, but I don’t believe it is possible to guarantee with certainty that a shift/jolt will not happen.

        Experiment with the follow PythonScript, as a substitute operation for “stock” paste:

        p = editor.getCurrentPos()
        editor.paste()
        editor.setSel(p, p)
        
        T 1 Reply Last reply Oct 16, 2024, 1:25 AM Reply Quote 1
        • T
          Thomas Zito @Alan Kilborn
          last edited by Thomas Zito Oct 16, 2024, 1:26 AM Oct 16, 2024, 1:25 AM

          @Alan-Kilborn Yes, that is what I mean.

          Unfortunately that scripting would not guarantee. I guess it’s not something anyone besides me would consider a feature in the first place.

          Thanks though. Maybe I’ll look at the source code one day… like a year in the future lol

          A 1 Reply Last reply Oct 16, 2024, 10:09 AM Reply Quote 0
          • A
            Alan Kilborn @Thomas Zito
            last edited by Oct 16, 2024, 10:09 AM

            @Thomas-Zito said in Paste text without jumping to cursor:

            Maybe I’ll look at the source code one day

            If you do that, you’ll probably have to look at non-Notepad++ source code. Notepad++ uses an entirely different project for its editing functions, and where the caret moves after pasting is likely something that belongs to the editing component called “Scintilla”.

            C 1 Reply Last reply Oct 16, 2024, 4:34 PM Reply Quote 0
            • C
              Coises @Alan Kilborn
              last edited by Oct 16, 2024, 4:34 PM

              @Alan-Kilborn said in Paste text without jumping to cursor:

              @Thomas-Zito said in Paste text without jumping to cursor:

              Maybe I’ll look at the source code one day

              If you do that, you’ll probably have to look at non-Notepad++ source code. Notepad++ uses an entirely different project for its editing functions, and where the caret moves after pasting is likely something that belongs to the editing component called “Scintilla”.

              The necessary function already exists: SCI_INSERTTEXT . If Python scripting can retrieve the contents of the clipboard and can call that Scintilla function, it should be possible to script it.

              P 1 Reply Last reply Oct 16, 2024, 5:23 PM Reply Quote 3
              • P
                PeterJones @Coises
                last edited by PeterJones Oct 16, 2024, 5:24 PM Oct 16, 2024, 5:23 PM

                @Coises ,

                Confirmed.

                @Thomas-Zito ,

                The following script grabs the contents of the clipboard and inserts them at the current typing caret, instead of pasting them at the current typing caret, so this will leave the caret where it was.

                # encoding=utf-8
                """in response to https://community.notepad-plus-plus.org/topic/26203/
                
                Running this script will _insert_ the clipboard instead of _pasting_ the clipboard, so the typing caret won't move
                """
                from Npp import editor
                import ctypes
                
                def get_clipboard_text():
                    """https://stackoverflow.com/a/23285159/5508606"""
                    CF_TEXT = 1
                
                    kernel32 = ctypes.windll.kernel32
                    kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
                    kernel32.GlobalLock.restype = ctypes.c_void_p
                    kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
                    user32 = ctypes.windll.user32
                    user32.GetClipboardData.restype = ctypes.c_void_p
                
                    user32.OpenClipboard(0)
                    try:
                        if user32.IsClipboardFormatAvailable(CF_TEXT):
                            data = user32.GetClipboardData(CF_TEXT)
                            data_locked = kernel32.GlobalLock(data)
                            text = ctypes.c_char_p(data_locked)
                            value = text.value
                            kernel32.GlobalUnlock(data_locked)
                            return value
                    finally:
                        user32.CloseClipboard()
                
                editor.insertText(editor.getCurrentPos(), get_clipboard_text())
                

                If you don’t have PythonScript plugin yet, or don’t know how to install and run a script using that plugin, this FAQ explains how to do it, including how to set a keyboard shortcut

                A 1 Reply Last reply Oct 16, 2024, 5:30 PM Reply Quote 3
                • P PeterJones referenced this topic on Oct 16, 2024, 5:23 PM
                • A
                  Alan Kilborn @PeterJones
                  last edited by Alan Kilborn Oct 16, 2024, 5:39 PM Oct 16, 2024, 5:30 PM

                  @Coises said:

                  The necessary function already exists: SCI_INSERTTEXT

                  Good eye.
                  I would have thought that function also does things to “jolt the screen”, but apparently not.


                  @PeterJones

                  Very similar, but simpler and less “raw”:

                  from Npp import *
                  
                  try:
                      editor3h  # third editor, hidden
                  except NameError:
                      editor3h = notepad.createScintilla()
                  
                  def get_stream_text_from_clipboard():
                      retval = ''
                      editor3h.clearAll()
                      editor3h.paste()
                      if editor3h.getLength() > 0: retval = editor3h.getText()
                      return retval
                  
                  editor.insertText(editor.getCurrentPos(), get_stream_text_from_clipboard())
                  

                  Note that the extra effort to get the clipboard text is because PythonScript doesn’t support a way to get current clipboard contents. It can paste the contents with editor.paste(), but if you want to avoid side effects from paste (as we do here) or you want to modify the clipboard text before inserting it, there’s no super simple (i.e. function call way to do it).

                  Note also that my get_stream_text_from_clipboard() function only works with non-column block data (as its name implies).

                  BTW, there was a PythonScript request that such a function be created, see HERE , but it seems to be an issue that isn’t going anywhere.

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