V2 VERSION OF THIS FUNCTION HERE
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: https://autohotkey.com/board/topic/70404-clip-send-and-retrieve-text-using-the-clipboard/
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: https://github.com/berban/Clip/blob/master/Clip.ahk
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%
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.
- 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.
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() """")
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
^d::
SendInput {End}+{Home}
@ := Clip()
SendInput {End}{Enter}
Clip(@)
Return
; Swap with the above line
^t::
SendInput {End}+{Home}
@ := Clip()
SendInput {Del 2}{Up}{Enter}{Up}
Clip(@)
Return
; 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.)
$Tab::
$+Tab::
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}"
Return
#IfWinActive
- 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.