I tried to write the shortest and easiest to maintain script. Any suggestions for improvements?
; Deluxe Clipboard
; AutoHotkey Version: 1.0.30+
; Language: English
; Platform: Win2000/XP
; Author: Laszlo Hars <www.Hars.US>
;
; Script Function:
; Provides unlimited number of private, named clipboards to
; Copy, Cut, Paste, Append or CutAppend of selected text
; Private clipboard names can consist of numbers, letters, # _ @ $ ? [ ]
; OK: 01, Greetings, gut_und_schlecht, $5
; BAD: 1.1, You&Me, Mon Amis
; The already used names are listed in a sorted drop down list with
; incremental search (beginning of a name and Up or Down arrow)
; The last-used name is pre-selected, Enter accepts
; Repeated hotkeys provide their original functions (auto exit)
; Esc, Click on Cancel or [x]: escapes out
; Enter, Alt-underlined, Click: performs action with typed/selected name
;
; Limitations:
; ClipBoardAll was not used, because
; it interferes with MS Word (adds bookmarks)
; non-text clipboards cannot be merged (appended)
; Removing the Append and CutAppend functions and
; using ClipBoardAll at the indicated places
; makes Copy, Cut and Paste of general clipboards possible
;
; Version 1.0: 2005.03.05 Initial creation
names = ; | after each name, || after last used (default)
$^!c:: ; Ctrl-Alt-C hotkey = copy to private clipboard
HKey = c
Actn = &Copy
GoTo WINDOW ; return from there
$^!v:: ; Ctrl-Alt-V hotkey = paste from private clipboard
HKey = v
Actn = &Paste
GoTo WINDOW
$^!x:: ; Ctrl-Alt-X hotkey = cut to private clipboard
HKey = x
Actn = &Cut
GoTo WINDOW
$^!a:: ; Ctrl-Alt-A hotkey = append to private clipboard
HKey = a
Actn = &Append
GoTo WINDOW
$^!y:: ; Ctrl-Alt-Y hotkey = cut+append to private clipboard
HKey = y
Actn = Cut&Append
GoTo WINDOW
WINDOW:
WinGetActiveTitle WinTitle ; where was the hotkey pressed?
if WinTitle = Deluxe Clipboard
{ ; hotkey pressed the second time
Gui Destroy
WinActivate ahk_id %CallerID%
Send ^!%HKey% ; if you change: MATCH hotkey modifiers here and at GUI Text!
return
}
WinGet CallerID, ID, A ; save caller's ID at first press of HotKey
Gui Font, s10, MS Sans Serif ; ADJUST BELOW FOR YOUR SCREEN RESOLUTION
Gui Add, ComboBox,x026 y064 w220 h20 r5 Sort vName, %names% ; 1st Gui Add = active
Gui Add, Button, x146 y104 w100 h30, Cancel
Gui Add, Button, x026 y104 w100 h30 Default, %Actn%
Gui Add, Text, x028 y014 w220 h40, For Ctrl-Alt-%HKey% repeat, or`nName your private clipboard
Gui Show, h163 w271 Center, Deluxe Clipboard
return
GuiClose:
GuiEscape:
ButtonCancel:
Gui Destroy
return
ButtonCopy:
Gosub GoBack
ClipBoard0 = %ClipBoard% ; save original clipboard (ClipBoardAll)
Send ^c ; copy data to clipboard
CB_%Name% = %ClipBoard% ; transfer new clipboard to variable (ClipBoardAll)
ClipBoard = %ClipBoard0% ; restore original clipboard
return
ButtonPaste:
Gosub GoBack
ClipBoard0 = %ClipBoard% ; save original clipboard (ClipBoardAll)
Clipboard := CB_%Name% ; set clipboard from variable
Send ^v ; paste data to window
ClipBoard = %ClipBoard0% ; restore original clipboard
return
ButtonCut:
Gosub GoBack
ClipBoard0 = %ClipBoard% ; save original clipboard (ClipBoardAll)
Send ^x ; cut data to clipboard
CB_%Name% = %ClipBoard% ; transfer new clipboard to variable (ClipBoardAll)
ClipBoard = %ClipBoard0% ; restore original clipboard
return
ButtonAppend: ; only works with *text* clipboards
Gosub GoBack
ClipBoard0 = %ClipBoard% ; save original clipboard (ClipBoardAll)
Send ^c ; copy new data to clipboard
cb := CB_%Name% ; get private clipboard
CB_%Name% = %cb%%ClipBoard% ; append new clipboard to variable
ClipBoard = %ClipBoard0% ; restore original clipboard
return
ButtonCutAppend: ; only works with *text* clipboards
Gosub GoBack
ClipBoard0= %ClipBoard% ; save original clipboard (ClipBoardAll)
Send ^x ; cut data to clipboard
cb := CB_%Name% ; get private clipboard
CB_%Name% = %cb%%ClipBoard% ; append new clipboard to variable
ClipBoard = %ClipBoard0% ; restore original clipboard
return
GoBack:
Gui Submit ; assign gui variables
Gui Destroy ; GUI's done its task
WinActivate ahk_id %CallerID% ; get back to caller window
StringReplace names,names,||,| ; remove last-used marker
StringGetPos Pos, names,%Name%| ; was this clipboard name used?
if Pos < 0 ; new name appended
names = %names%%Name%||
else ; old name marked as last used
StringReplace names,names,%Name%|,%Name%||
returnHere is the latest version:
; Deluxe Clipboard
; AutoHotkey Version: 1.0.35+
; Language: English
; Platform: Win2000/XP
; Author: Laszlo Hars <www.Hars.US>
;
; Script Function:
; Provides unlimited number of private, named clipboards
; Hotkeys = CapsLock & …
; c: Copy, x: Cut, v: Paste, a: Append and y: CutAppend any selections
; In applications using ^c, ^x, ^v for copy, cut, paste to/from the Windows clipboard
; Private clipboard names consist of any ANSI characters except "|"
; The already used names are shown in a sorted drop down list with
; incremental search (beginning of a name and Up or Down arrow)
; The last-used name is pre-selected, Enter accepts
; New hotkey replaces function
;
; Version history:
; 1.0: 2005.03.05 Initial creation
; 1.1: 2005.03.07 Error check added for clipboard names
; Legible version of A_ThisHotKey in Gui 3:text
; 2nd hotkey while 1st is active replaces function
; Repeated hotkey is detected from saved current hotkey
; 1.2: 2005.03.12 Append: by arrays of private clipboards, $ separated
; Paste: each entry of the array one-by-one
; ClipBoardAll is used
; 1.3: 2005.05.01 ClipWait up to 2s added for handling large clipboards
; Sleep between setup the clipboard and pasting it
; ClipBoardAll is used at Append and CutAppend
; 2.0: 2005.10.03 CapsLock & … hotkeys
; Use functions, Simplified code
; ClipBoard Name -> hex, avoiding naming restrictions, except "|"
#SingleInstance Force
AutoTrim Off
names = ; | after each name, || after last used (default)
CapsLock & c::WINDOW("&Copy") ; COPY to private clipboard
CapsLock & v::WINDOW("&Paste") ; PASTE from private clipboard
CapsLock & x::WINDOW("&Cut") ; CUT to private clipboard
CapsLock & a::WINDOW("&Append") ; APPEND to private clipboard
CapsLock & y::WINDOW("Cut&Append") ; CUT+APPEND to private clipboard
WINDOW(Actn)
{
Global
Gui 3:Destroy ; needed for 2nd hotkey while 1st is active
WinGet CallerID, ID, A ; save caller's ID as the window to return to
Gui 3:Font, s10, Arial ; ADJUST BELOW FOR YOUR SCREEN RESOLUTION
Gui 3:Add, Text, x028 y14 w220 h40, Private clipboard name:
Gui 3:Add, ComboBox,x026 y44 w220 h20 r5 Sort vName, %names%
Gui 3:Add, Button, x146 y84 w100 h30, Cancel
Gui 3:Add, Button, x026 y84 w100 h30 Default, %Actn%
Gui 3:Show, h133 w271 Center, Deluxe Clipboard
}
3GuiClose:
3GuiEscape:
3ButtonCancel:
Gui 3:Destroy
Return
3ButtonCopy:
Gosub GoBack
IfEqual NameError,1, Return ; Gui remains after wrong name
Loop % %HexName%_0
%HexName%_%A_Index% = ; clear memory used by the array, if any
%HexName%_0 = 1 ; chain length = 1
ClipBoard0 = %ClipBoardAll% ; save original clipboard
ClipBoard =
Send ^c ; copy new data to clipboard
ClipWait 2, 1 ; wait up to 2 seconds or until clipboard contains data
%HexName%_1 = %ClipBoardAll% ; transfer new clipboard to array
ClipBoard = %ClipBoard0% ; restore original clipboard
Return
3ButtonPaste:
Gosub GoBack
IfEqual NameError,1, Return ; Gui remains after wrong name
ClipBoard0 = %ClipBoardAll% ; save original clipboard (ClipBoardAll)
Loop % %HexName%_0
{ ; load clipboard from array
Clipboard =
Clipboard := %HexName%_%A_Index%
ClipWait 3 ; wait for new ClipBoard content
Send ^v ; paste data to window
}
ClipBoard = %ClipBoard0% ; restore original clipboard
return
3ButtonCut:
Gosub GoBack
IfEqual NameError,1, Return ; Gui remains after wrong name
Loop % %HexName%_0
%HexName%_%A_Index% = ; clear memory used by the array, if any
%HexName%_0 = 1 ; chain length = 1
ClipBoard0 = %ClipBoardAll% ; save original clipboard
ClipBoard =
Send ^x ; copy new data to clipboard
ClipWait 2, 1 ; wait up to 2 seconds or until clipboard contains data
%HexName%_1 = %ClipBoardAll% ; transfer new clipboard to array
ClipBoard = %ClipBoard0% ; restore original clipboard
Return
3ButtonAppend: ; Problems with MS Office
Gosub GoBack
IfEqual NameError,1, Return ; Gui remains after wrong name
ClipBoard0 = %ClipBoardAll% ; save original clipboard
ClipBoard =
Send ^c ; copy new data to clipboard
ClipWait 2, 1 ; wait up to 2 seconds or until clipboard contains data
%HexName%_0++ ; increment number of clipboards in the chain
idx := %HexName%_0
%HexName%_%idx%=%ClipBoardAll% ; store new clipboard at the next array location
ClipBoard = %ClipBoard0% ; restore original clipboard
Return
3ButtonCutAppend: ; Problems with MS Office
Gosub GoBack
IfEqual NameError,1, Return ; Gui remains after wrong name
ClipBoard0= %ClipBoardAll% ; save original clipboard
ClipBoard =
Send ^x ; copy new data to clipboard
ClipWait 2, 1 ; wait up to 2 seconds or until clipboard contains data
%HexName%_0++ ; increment number of clipboards in the chain, init = 1
idx := %HexName%_0
%HexName%_%idx%= %ClipBoardAll% ; store new clipboard at the next array location
ClipBoard = %ClipBoard0% ; restore original clipboard
Return
GoBack:
Gui 3:Submit, NoHide ; assign Gui variables
NameError =
IfEqual Name,, SetEnv NameError,1
If Name contains |
NameError = 1
IfEqual NameError, 1, {
WinGet GuiID, ID, A ; save Gui ID as the window to return to
MsgBox,,,Please provide a valid`nClipboard Name!,2
WinActivate ahk_id %GuiID% ; get back to GUI
return
}
Gui 3:Destroy ; GUI's done its task
WinActivate ahk_id %CallerID% ; get back to caller window
StringReplace names,names,||,| ; remove marker of last-used name
StringGetPos Pos, names,%Name%| ; was this clipboard name used?
if Pos < 0 ; new name appended
names = %names%%Name%||
else ; old name marked as last used
StringReplace names,names,%Name%|,%Name%||
HexName := String2Hex(Name)
return
String2Hex(x) ; Convert a string to hex digits
{
format = %A_FormatInteger%
SetFormat Integer, H
hex = X
Loop Parse, x
{
y := ASC(A_LoopField) ; 2 digit ASCII code of chars of x, 15 < y < 256
StringTrimLeft y, y, 2 ; Remove leading 0x
hex = %hex%%y%
}
SetFormat Integer, %format%
Return hex
}




