Zwischenablage für History füllen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
LuckyJoe
Posts: 255
Joined: 02 Oct 2013, 09:52

Zwischenablage für History füllen

01 Apr 2020, 13:22

Hallo zusammen,

ich arbeite mit einem Tool, das mir den Inhalt der Zwischenablage in Form einer History verwaltet. Damit kann ich auf die letzten Inhalte zugreifen, die ich in die Zwischenablage kopiert habe.
Nun möchte ich auf Tastendruck mehrere Wörter in die Zwischenablage kopieren, z.B. einen ganzen Satz. Anschließend soll die Zwischenablage Wort für Wort dieses Satzes in die Historie eintragen, damit ich dann auf einzelne Wörter zugreifen kann. Das bekomme ich auch mit folgendem Script hin:

Code: Select all

^#NumPadSub::														; {Hotkey} Strg-Win-NUM--	→ einzelne Wörter kopieren
	; Die aktuelle Markierung wird in die Zwischenablage kopiert	'
	; und dort wird jedes einzelne Wort einzeln in der				'
	; Zwischenablage abgelegt. Anschließend kann man mit der		'
	; Clipboard-Historie die einzelnen Wörter pasten (Excel!)		'
	ToolTip, Bitte warten ...
	SoundBeep, 850, 400
	AutoTrim, on													; bei Variablen vorne/hinten Leerzeichen entfernen
	clipboard =														; Clipboard löschen
	SendInput ^c													; Markierung ins Clipboard ...
	ClipWait, 2														; warten (max. 2 Sekunden), bis Clipboard gefüllt ist
	if ErrorLevel													; wenn nichts im Clipboard ...
	{
		ToolTip
		Return														; ... beenden
	}
	MyClip := ""
	MyClipboard = %clipboard%
	StringSplit, MyClip, MyClipboard, %A_Space%`r`n					; splitte bei " " und CRLF
	Loop, %MyClip0%													; enthält immer die Anzahl der Elemente
	{
		Wort := MyClip%a_index%
		If Wort <>
		{
			clipboard = %Wort%
			Sleep 275												; muss sein !
		}
	}
	ToolTip, Fertig!
	SoundBeep, 2250, 300
	Sleep 700
	ToolTip
Return

Allerdings muss ich innerhalb des Loops immer eine Pause (bei meinem Rechner "Sleep 275") machen, damit die Zwischenablage das einzelne Wort verarbeiten kann. Den Grund dafür kenne ich leider nicht.

Frage: Gibt es eine schnellere Möglichkeit für mein Script? Ich habe mir mal die "variadischen Funktionsaufrufe" angeschaut, aber nicht ganz verstanden.

Danke schon mal im Voraus.
HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
GEV
Posts: 844
Joined: 25 Feb 2014, 00:50

Re: Zwischenablage für History füllen

01 Apr 2020, 15:24

LuckyJoe wrote:
01 Apr 2020, 13:22
ich arbeite mit einem Tool, das mir den Inhalt der Zwischenablage in Form einer History verwaltet. Damit kann ich auf die letzten Inhalte zugreifen, die ich in die Zwischenablage kopiert habe.
Wenn das alles ist, was das Tool leistet, dann brauchst du IMHO dieses Tool nicht. Das kann nämlich auch ein relativ einfaches Skript bewältigen, das die einzelnen Wörter als Variablen oder in einer Datei speichert, ohne Verwendung der Zwischenanlage.
User avatar
LuckyJoe
Posts: 255
Joined: 02 Oct 2013, 09:52

Re: Zwischenablage für History füllen

02 Apr 2020, 06:45

... und genau dieses relativ einfache Skript suche ich, sofern es das leistet, was ich geschrieben habe.
Herzliche Grüße aus dem Rheinland
Lucky Joe
GEV
Posts: 844
Joined: 25 Feb 2014, 00:50

Re: Zwischenablage für History füllen

02 Apr 2020, 07:29

Anstatt von
clipboard = %Wort%
kannst du zB. FileAppend benutzen um die einzelnen Wörter in einer Datei zu speichern.
Einmal gespeichert, kannst du die Datei jederzeit direkt öffnen und verarbeiten, die Wörter mit FileRead in ein Menu oder GUI bringen, usw.
User avatar
LuckyJoe
Posts: 255
Joined: 02 Oct 2013, 09:52

Re: Zwischenablage für History füllen

02 Apr 2020, 08:39

Danke für den Hinweis. Das möchte ich aber nicht, bzw. halte den Vorschlag nicht für schneller oder kürzer.

Ich möchte eine Gruppe von Wörtern (z.B. einen Satz oder eine sonstige Aneinanderreihung) kopieren. Danach möchte ich diese Wörter einzeln in meiner Zwischenablage-Historie (mit der ich ohnehin arbeite) abgelegt haben, damit ich sie später (in einem anderen Programm, z.B. Excel) einzeln ausgeben kann. Ich möchte also vermeiden, ständig mit "markiere Wort" → Strg-c → Alt-Tab → Excel-Zelle auswählen → Strg-v → Alt-Tab" ... und dann wieder für das nächste Wort von vorne anfangen.

Das von mir dargestellte Script tut diesen Dienst, allerdings mit einer "Zwangspause" beim Verarbeiten jedes einzelnen Wortes - und genau das möchte ich verbessern/kürzen/schneller machen. Ich glaube daher nicht, dass eine Ausgabe der Zwischenablage in eine Datei und dem anschließenden Einlesen der einzelnen Wörter, die ja auch wieder "einzeln" verarbeitet werden müssen, schneller geht, als das, was mein Script jetzt schon macht.
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
haichen
Posts: 444
Joined: 09 Feb 2014, 08:24

Re: Zwischenablage für History füllen

03 Apr 2020, 01:47

Hallo LuckyJoe,
ich weiß leider nicht ob es eine schnellere Methode gibt, das Clipboard zu befüllen.
Vielleicht kennt ja jemand eine direkte Methode die Historie als ganzes zu befüllen..

Was nutzt du denn als Zwischenablage-Historie? WIN+V? Die Historie, die in Excel/Word etc angezeigt wird? oder ein eigenständiges Programm?
Wenn es ein anderes Programm als die Windows eigene Historie ist, kann man man dem vielleicht die Daten irgendwie anders unterschieben.

Ansonsten hätte ich noch die Idee ganz auf die Clipboardhistorie zu verzichten. Dann kannst den Text weiterhin mit STRG+C ins Clipboard nehmen, bearbeiten, anzeigen (eigenes GUI), und per Klick oder Hotkey irgendwo anders einfügen.

Es gibt hier ja auch einige Skripts für Autocomplete. Die könnte man mit deinen Wortlisten füttern.

Aber ich vermute mal, dass du die Historie meist, die man in den Officeprogrammen aufrufen kann.
Da wäre mein Tip, dass du deine Liste zuerst mal verkleinerst bevor du sie ins Clipboard schreibst.
Also Leerzeichen, Interpunktion, Wörter die kürzer als 4 Buchstaben sind und alles doppelte rausschmeissen und erst dann in einer Schleife alle restlichen Wörter ins Clipboard schreiben.
User avatar
haichen
Posts: 444
Joined: 09 Feb 2014, 08:24

Re: Zwischenablage für History füllen

03 Apr 2020, 03:28

Code: Select all

text=
(
	; Die aktuelle Markierung 456546 wird in die Zwischenablage kopiert	'
	; und dort wird jedes einzelne        Wort einzeln in der				'
	; Zwischenablage abgelegt. Anschließend kann man mit der		'
	; Clipboard-Historie die einzelnen Wörter pasten (Excel!)			tab tab 		12323234234234'
)
msgbox, % "|" wl(text,5) "|"
/* Resultat:
|12323234234234 456546 abgelegt aktuelle Anschließend Clipboard-Historie einzeln einzelne einzelnen kopiert Markierung pasten Wörter Zwischenablage|
*/
exitapp

wl(string,c){
	;nur das Nötigste an Zeichen
	loop, parse, string
		if A_LoopField in a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ß,ü,ö,%A_Space%,%A_Tab%,ä,-,1,2,3,4,5,6,7,8,9,0
		  s.=A_LoopField
		  
	;Wortlänge begrenzen und überflüssige Leerzeichen entfernen
	word_array := StrSplit(s, [A_Space,A_Tab])
	s:=""
	for key,val in word_array
	{ 
		if (strlen(trim(val)) > c)
			s.=val " "
	}
	
	;doppelte Worte entfernen
	sort, s, D UCL
return trim(s)
}
Edit: Zahlen werden auch als Worte aufgenommen
User avatar
LuckyJoe
Posts: 255
Joined: 02 Oct 2013, 09:52

Re: Zwischenablage für History füllen

03 Apr 2020, 07:06

Hallo Haichen,

Danke für deine Tipps. Ich arbeite mit der Zwischenablege-Historie von "PhraseExpress", habe aber gerade auch mal andere Clip-Manager getestet (z.B. ClipJump). Es sieht so aus, dass man der Zwischenablage wohl immer ein paar Millisekunden Zeit geben muss, bis ein neuer Eintrag hinzukommen darf. Immerhin konnte ich aber mein Script (übrigens nur ein kleiner Ausschnitt eines Riesen-Scriptes) dank deines Codes erheblich verkürzen:

aus:

Code: Select all

MyClip := ""
MyClipboard = %clipboard%
StringSplit, MyClip, MyClipboard, %A_Space%`r`n
Loop, %MyClip0%
{
	Wort := MyClip%a_index%
	If Wort <>
	{
		clipboard = %Wort%
		Sleep 275
	}
}
wurde:

Code: Select all

MyClipboard = %clipboard%
Loop, Parse, MyClipboard, " "`r`n
{
	clipboard := Trim(A_LoopField)
	Sleep 275
}
HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
haichen
Posts: 444
Joined: 09 Feb 2014, 08:24

Re: Zwischenablage für History füllen

03 Apr 2020, 07:48

Schön wenns dir gefällt. Ich hatte das ganze übrigens als Funktion umgeschrieben. Vielleicht kannst du das ja gebrauchen:

Code: Select all

^#NumPadSub::														; {Hotkey} Strg-Win-NUM--	→ einzelne Wörter kopieren
		; Die aktuelle Markierung wird in die Zwischenablage kopiert	'
	    ; und dort wird jedes einzelne Wort einzeln in der				'
		; Zwischenablage abgelegt. Anschließend kann man mit der		'
		; Clipboard-Historie die einzelnen Wörter pasten (Excel!)		'
ToolTip, Bitte warten ...
SoundBeep, 850, 400
ClipHistory()
return

ExitApp
Return


ClipHistory(){
	clipboard =														; Clipboard löschen
	SendInput ^c													; Markierung ins Clipboard ...
	ClipWait, 2														; warten (max. 2 Sekunden), bis Clipboard gefüllt ist
	if ErrorLevel													; wenn nichts im Clipboard ...
	{
		ToolTip
		Return														; ... beenden
	}
	
	MyClipboard := wl(Clipboard,5)
	word_array := StrSplit(MyClipboard, A_Space)
	for key, value in word_array
	{
		If (value !="")
		{
			clipboard := value
			Sleep, 275
		}
	}
	
	ToolTip, Fertig!
	SoundBeep, 2250, 300
	Sleep 700
	ToolTip
	
	return
}


wl(string,c){
	;nur das Nötigste an Zeichen
	loop, parse, string
		if A_LoopField in a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ß,ü,ö,%A_Space%,%A_Tab%,ä,-,1,2,3,4,5,6,7,8,9,0
			s.=A_LoopField
	
	;Wortlänge begrenzen und überflüssige Leerzeichen entfernen
	word_array := StrSplit(s, [A_Space,A_Tab])
	s:=""
	for key,val in word_array
	{
		if (strlen(trim(val)) > c)
			s.=val " "
	}
	
	;doppelte Worte entfernen
	sort, s, D UCL
	
	return trim(s)
}
User avatar
haichen
Posts: 444
Joined: 09 Feb 2014, 08:24

Re: Zwischenablage für History füllen

03 Apr 2020, 08:03

Zu PhraseExpress hätte ich mal eine Frage. Kennst du dich da mit den Zugriffsrechten aus? Wie kann man dort den Zugriff so einschränken das jeder Nutzer (oder mindestens einer) nur seine eigenen Abkürzungen sieht und nutzt? Oder vielleicht einen eigenen Ordner nur für ihn?
User avatar
LuckyJoe
Posts: 255
Joined: 02 Oct 2013, 09:52

Re: Zwischenablage für History füllen

03 Apr 2020, 08:35

Hi,

[offtopic on]
ich nutze PhraseExpress nur alleine, aber du kannst einzelne, lokale Dateien einbinden. Von daher kann jeder User "seine" Textbausteidatei in "seinem" User-Ordner ablegen/verwalten. Ansonsten gibt es auch noch eine Server-Version. Vgl: https://www.phraseexpress.com/de/docs/14/gemeinsam-nutzen/
[offtopic off]

HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
haichen
Posts: 444
Joined: 09 Feb 2014, 08:24

Re: Zwischenablage für History füllen

03 Apr 2020, 09:02

[offtopic on]
Danke für die Antwort!! Ich hatte das nur mal in einer Firma gesehen, da haben sich alle eigene Ordner angelegt, und trotzdem sind die Bausteine ALLE global für jeden sichtbar gewesen. Ich schätze die haben sich da irgendwo vertan.
[offtopic off]
User avatar
LuckyJoe
Posts: 255
Joined: 02 Oct 2013, 09:52

Re: Zwischenablage für History füllen

03 Apr 2020, 10:20

[offtopic on]
Es gibt auch Textbausteindateien, die du global für alle gemeinsam zur Verfügung stellen kannst. Weil du mehrere Textbausteindateien auf einmal in PhraseExpress einlesen kannst, kann man das daher kombinieren.
[offtopic off]
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
haichen
Posts: 444
Joined: 09 Feb 2014, 08:24

Re: Zwischenablage für History füllen

03 Apr 2020, 11:16

Super!! Habe ich jetzt auch in den Docs gesehen. Habe ich damals nicht gefunden.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 24 guests