Wenn ich richtig verstehe, gibt es zwei Arten von Inhalten, die in die globale (systemweite) Mac-Zwischenablage kopiert werden können:
text
oder
file
Obwohl es sich um zwei verschiedene, diskrete Datentypen handelt, teilen sie sich dieselbe Zwischenablage. Wenn Sie beispielsweise ein Bild file
in Ihrer Zwischenablage haben und dann einen text
Satz kopieren, überschreibt der Satz die Bilddatei und umgekehrt. Bitte korrigieren Sie mich, wenn ich falsch liege.
Meine Frage ist, wie kann ich mit AppleScript feststellen, ob die Zwischenablage keine enthält text
?
Der Kontext meiner Frage ist eine AppleScript-.scpt-Datei, die den ausgewählten Text in der Systemstimme mit einer bestimmten Lautstärke spricht. Der markierte Text wird in die Zwischenablage kopiert und dann über den Befehl gesprochen say
. Das Skript wird per Tastendruck über FastScripts.app ausgelöst.
Hin und wieder erhalte ich einen Fehlerdialog, der besagt: "Fehlernummer: -1728". Dieser Fehler tritt auf, wenn ich, anstatt text
hervorgehoben zu werden, eine tatsächliche hervorgehoben oder ausgewählt habe file
. Die Sprachfunktion von Mac kann kein file
; Sprache kann nur verbalisieren text
.
Ich möchte also eine if...then
Anweisung in meinem Skript erstellen, um diesen Fehler abzufangen. Idealerweise möchte ich dann die file
in konvertieren text
, wenn möglich so, wie es TextEdit tut.
Wenn die Zwischenablage ein Dateiobjekt enthält , clipboard info
enthält sie zB «class furl»
(eine Datei-URL) zusammen mit vielen anderen Klassen.
Der folgende Beispielcode überprüft das Vorhandensein von «class furl»
in clipboard info
:
if ((clipboard info) as string) contains "«class furl»" then
say "the clipboard contains a file named " & (the clipboard as string)
else
say "the clipboard does not contain a file"
end if
Aktualisieren:
Wie ich in einem meiner Kommentare erwähnt habe, gibt es andere Möglichkeiten, dies zu codieren, und dieser Ansatz gibt entweder eine leere Liste oder eine Liste mit einer Liste zurück , was schneller sein sollte als die 14, die das erste Beispiel zurückgibt, wenn es eine enthält Datei . Wenn die Zwischenablage keine Datei enthält , ist die zurückgegebene Liste leer und es tritt ein Fehler auf cbFile
, false
und wenn sie nicht leer ist, wird sie auf gesetzt true
, was dann im folgenden Beispiel getestet wird.
try
(item 1 of (clipboard info for «class furl»))
set cbFile to true
on error
set cbFile to false
end try
if cbFile then
say "the clipboard contains a file named " & (the clipboard as string)
else
say "the clipboard does not contain a file"
end if
Übrigens habe ich den purge
Befehl im Terminal zwischen dem Testen dieser beiden Beispiele ausgeführt, und es fühlte sich an, als wäre das zweite Beispiel etwas schneller, jedoch YMMV.
if ((clipboard info) as string) contains "«class furl»"
dann möchte ich mein Skript auf say
den Dateinamen der Zwischenablage-Datei setzen.clipboard info
nur 4 Klassen enthalten und wenn wahr, kann sie viel mehr, z. B. 14, Klassen enthalten. All dies muss aufgezählt werden, und bei einigen davon kann es länger dauern, sie aufzuzählen, als bei anderen, was die erwartete Verzögerung weiter erhöht. Damit allein startet die Verzögerung diff. Auch wenn wahr, wird die Zwischenablage nach dem Dateinamen als Zeichenfolge abgefragt, wodurch mehr zum Verzögerungsunterschied hinzugefügt wird. Ist das sinnvoll?osascript
einen time
Unterschied zwischen den 2 Versionen. Ich habe Terminal geschlossen/geöffnet und den purge
Befehl zwischen jedem Durchlauf verwendet, und als alles gesagt war, hatte eine erledigte ver1 einen Unterschied von 0,719 s zwischen dem T / F-Zweig und ver2 hatte einen Unterschied von 0,363 s zwischen dem T / F-Zweig im Vergleich zu einem 0,356 s Unterschied zwischen den einzelnen Versionen. Während ver2 technisch schneller war, ist der Unterschied vernachlässigbar.
klanomath
Big Mac
Rubiks Sphäre
Big Mac
Rubiks Sphäre
Rubiks Sphäre