Clip() - Send and Retrieve Text using the Clipboard

Post your working scripts, libraries and tools
User avatar
Posts: 82
Joined: 14 Apr 2014, 03:20

Clip() - Send and Retrieve Text using the Clipboard

18 Feb 2019, 21:38

Clip() - Send and Retrieve Text using the Clipboard

This is an update to an old post in order to bring it to the new live version of the forums. The old post is here:

Using the windows clipboard with AutoHotkey is useful, but it can be confusing and annoying. You'll probably want to backup and restore the contents so that the previous data isn't erased. Usually it also requires a few sleeps to work correctly. This script helps to standardize some of those uses in a small package.

This script includes two of the most common uses of the clipboard: finding out what text is currently being selected, and sending large amounts of text via control-v. It also standardizes some features often needed with these operations, and improves performance through consolidation.

Download code from Github:

Clip(Text="", ReSelect=False)

Usage: Call it without any parameters to retrieve the text currently selected.

Code: Select all

Var := Clip() ; will store any selected text in %Var%
Or call it with some text in the first parameter to "send" that text via the clipboard and Control+V.

Code: Select all

; The two are analogous. Use of the clipboard is generally preferable for larger amounts of text
Clip("Some text")
SendInput {Raw}Some text ; {Raw} avoids sending keyboard combinations like ^v as ctrl+v
  • Text: If you put text in this parameter, the function will send the text via the clipboard. If you leave this parameter blank, the function will return the selected text instead.
  • ReSelect: (Optional parameter) Only use this parameter in send mode (i.e. if there is text in the first parameter.) If ReSelect is true (has a value of 1), the cursor will re-select the just-pasted text. This is convenient if you are going to make extra modifications to the text, for instance, if you want to bold it after you paste it. If ReSelect is empty or false (equal to 0), then it will not reselect the text. If ReSelect is any other value (such as 2 or a non-numeric string), it will only reselect the text if there are 3000 or fewer characters - more than this number may be lead to choppy re-selecting.
Why use Clip()?
  • Has the right amount of sleep based on many years of experience to work reliably. (Because of trickiness using the windows clipboard, it still might fail to copy or paste every once in a while.)
  • Can send and retrieve with one function
  • No delay while sending. Normally you have to wait 400ms or so after sending Control+V before restoring the clipboard's contents, or else sometimes it pastes the backup contents instead. Clip() tasks this to a timer so your script can continue executing.
  • Improves performance by only saving & restoring the clipboard's contents once in the case of rapid clipboard operations.
  • Can reselct pasted text.
Some working examples:

Simple examples:

Code: Select all

; Displays the selected text
MsgBox, % "The selected text is: " Clip()

; Sends "long text string" using ctrl-v
Clip("long text string")

; Sends "long text string" and then re-selects it
Clip("long text string", True)

; Puts quotes around the selected text.
; Despite calling Clip() twice, the clipboard is only backed up & restored once
Clip("""" Clip() """")
More involved examples: (from 2011, use at your own risk!)

Code: Select all

; The below hotkeys add some of the features of SciTE to notepad.

#IfWinActive ahk_class Notepad ; makes the hotkeys context-sensitive

; Duplicate the above line
	SendInput {End}+{Home}
	@ := Clip()
	SendInput {End}{Enter}

; Swap with the above line
	SendInput {End}+{Home}
	@ := Clip()
	SendInput {Del 2}{Up}{Enter}{Up}

; Indent a block of text. (This introduces a small delay for typing a normal tab; to avoid this you can use ^Tab / ^+Tab as a hotkey instead.)
	TabChar := A_Tab ; this could be something else, say, 4 spaces
	NewLine := "`r`n"
	If ("" <> Text := Clip()) {
		@ := ""
		Loop, Parse, Text, `n, `r
			@ .= NewLine (InStr(A_ThisHotkey, "+") ? SubStr(A_LoopField, (InStr(A_LoopField, TabChar) = 1) * StrLen(TabChar) + 1) : TabChar A_LoopField)
		Clip(SubStr(@, StrLen(NewLine) + 1), 2)
	} Else
		Send % (InStr(A_ThisHotkey, "+") ? "+" : "") "{Tab}"

  • With any large amount of text (more than 20 or so characters), it is usually much faster to send it via the clipboard, as opposed to with Send or SendInput.
  • Clip() waits only .15 seconds before its ClipWait times out and reports that no text is selected. I have done some testing and decided that this is an ample amount. However, on a slow machine it is possible you might have to increase this timeout.
  • The delayed restoration of the clipboard that occurs with Clip() can have unintended consequences. For instance, if you send some text with Clip() and then immediately exit the script, the clipboard will never be restored to its original state because the timer to restore it did not expire.
  • You cannot have another "Clip" label in your script. If this is problematic, you can easily enough change the name of the label.
Last edited by berban on 18 Feb 2019, 23:30, edited 2 times in total.
Posts: 288
Joined: 02 Oct 2013, 19:41
Location: New Zealand

Re: Clip() - Send and Retrieve Text using the Clipboard

18 Feb 2019, 22:13

BTW, the link to the old post at the beginning doesn’t seem to work.
My programs:-
ReClip - a Text Reformatting and Clip Management utility
XRef - Produces Cross Reference lists for scripts
User avatar
Posts: 82
Joined: 14 Apr 2014, 03:20

Re: Clip() - Send and Retrieve Text using the Clipboard

18 Feb 2019, 23:31

TAC109 wrote:
18 Feb 2019, 22:13
BTW, the link to the old post at the beginning doesn’t seem to work.
Thanks for catching that! Updated.
Posts: 959
Joined: 22 Jan 2017, 19:37

Re: Clip() - Send and Retrieve Text using the Clipboard

19 Feb 2019, 12:16

@berban, thanks very much. All examples are working fine on Win7 64-bit, AHK_L 64-bit.
Posts: 77
Joined: 22 Jan 2019, 13:12

Re: Clip() - Send and Retrieve Text using the Clipboard

23 Feb 2019, 00:36

Neat, i personally use these though, a bit more intuitive dare i say... Get(), Put(), to take care of most use cases & to get Selected or All Text Left/Right of caret...

Code: Select all

MsgBox % Get()
MsgBox % Get("L")
MsgBox % Get("R")
MsgBox % Get("L") "`n`n" Get("R",false)
Put("Hello World")

Put(string){		;as an alternative to send,to instantly place a string
	ClipSaved := ClipboardAll, clipboard := "", clipboard := string
	BlockInput, on
	Send ^v
	BlockInput, off
	Clipboard := ClipSaved

Get(whichSideOfCaret:="",deselect:=true){		;gets everything to left or right of cursor	---> set param to 'L' or 'R', blank param gets selection...
	ClipSaved := ClipboardAll, clipboard := ""
	BlockInput, on
	( whichSideOfCaret = "R" ? Send("{Shift down}{end}{Shift up}{Ctrl down}{c}{Ctrl up}") & (deselect?Send("{Left}")) : (whichSideOfCaret = "L" ? Send("{Shift down}{home}{Shift up}{Ctrl down}{c}{Ctrl up}") & (deselect?Send("{Right}"):"") : (!whichSideOfCaret ? Send("{Ctrl down}{c}{Ctrl up}") : "")) )
	BlockInput, off
	clipwait, 1
	string := clipboard, Clipboard := ClipSaved
	Return string

	Send % keys

Return to “Scripts and Functions”

Who is online

Users browsing this forum: sinbad and 43 guests