So ändern Sie die Textauswahl in Applescript in einem Automator-Dienst

Ich habe einen Automator-Dienst geschrieben (der für jeden ausgewählten Text in jeder Anwendung verwendet werden soll), der die Länge der Auswahl ändert, wenn eine Zahl/Länge angegeben wird, die der Benutzer angibt. Hier ist ein Ausschnitt aus relevantem Code, der alle anderen Funktionen/Feinheiten des Dienstes ausschließt:

--Figure out whether the selection must be lengthened or shrunk
set lengthen to false
set mod_length to 0
if character_count is equal to 0 or n is greater than character_count then
    set lengthen to true
    set mod_length to n - character_count
else
    set mod_length to character_count - n
    --This is a trick to make sure arrowing affects the right side of the selection
    key code 124 using {shift down}
    key code 123 using {shift down}
end if

repeat mod_length times
    if lengthen is true then
        --arrow to the right
        key code 124 using {shift down}
    else
        --arrow to the left
        key code 123 using {shift down}
    end if
end repeat

Der Dienst funktioniert in den meisten Anwendungen hervorragend, mit Ausnahme von Terminal.app (da die Pfeiltasten verwendet werden, um den Cursor auf der Befehlszeile zu bewegen und nicht die Größe der derzeit aktiven Auswahl). Im Idealfall würde dies tatsächlich im Terminal funktionieren, da ich diesen Dienst normalerweise dort verwenden muss.

Gibt es also eine Möglichkeit, die Länge des ausgewählten Textes in einer beliebigen Zeile im Verlauf in einem Terminal.app-Fenster (vorausgesetzt, das erste ausgewählte Zeichen ist Position 1) mithilfe eines Automator-Dienstes (und Applescript innerhalb dieses Dienstes) so zu ändern, dass dies der Fall ist Verwenden Sie die Pfeiltasten nicht? ZB wähle ich die Ausgabe eines Befehls aus und führe den Dienst aus, um die Länge der Auswahl an eine von mir angegebene Länge anzupassen.

Hintergrund:

Der Grund, warum ich dies tue, ist, dass meine Arbeit DNA-Manipulation/-Modifikation umfasst und ich als Teil des Debug-Prozesses für diese Skripte manchmal kurz beobachten muss, was an einer bestimmten Position in einer DNA-String-Ausgabe auf der Befehlszeile passiert ist - schnell und schmutzig - nur um zu bestätigen, dass eine beabsichtigte Änderung das beabsichtigte Ergebnis hatte. Dies ist also nur ein schneller Weg, um visuell eine Koordinate in einer langen DNA-Kette zu finden. Ich beabsichtige, diesen Dienst eventuell so zu modifizieren, dass nur bestimmte Zeichen bei der Bestimmung der Länge der Auswahl berücksichtigt werden (z. B. Zahlen, Leerzeichen, Zeilenumbrüche usw. nicht zählen).

Der von Ihnen gepostete Code lässt sich nicht kompilieren und ist außerdem character_countnicht ndefiniert. Selbst wenn der von Ihnen gepostete Code kompiliert wäre, würde er dennoch unverändert fehlschlagen. Das heißt, ich habe Ihre andere Frage gelesen, die Sie vor ungefähr einer Stunde gelöscht haben, und unter dem Strich ist das, was Sie im Terminal erreichen können, nicht möglich.
Ich möchte Sie zu der überarbeiteten Frage loben. Das ist unermesslich besser als das, was Sie zuvor gepostet haben, und es ist leicht zu verstehen, was Sie jetzt tun möchten. Es tut mir leid, dass alles umsonst sein könnte, da es, wie @user3439894 sagte, auf diese Weise nicht erreichbar ist. Aber nach dem, was Sie unter Hintergrund geschrieben haben , klingt es so, als würden Sie im Wesentlichen den DNA-Text vor und nach der Änderung vergleichen, ist das richtig? Wenn das Ihr eigentliches Ziel ist, haben Sie darüber nachgedacht, dies ohne Textauswahl zu tun, sondern durch Musterabgleich oder Befehlszeilen-Tools ( diffzum Beispiel)?
Hmmm... Bist du sicher, dass das nicht möglich ist? Ich kann die Länge des ausgewählten Textes ändern, indem ich das Attribut „len“ von „Ausgewählter Textbereich“ im Accessibility Inspector bearbeite. Ich habe die Auswahllänge in diesem Testfall von 29 auf 31 geändert: dropbox.com/s/bn2z6ewmdj4mfai/…
Entschuldigung für die Verzögerung. Du hast mich in deiner Antwort nicht markiert, also wurde ich nicht benachrichtigt. Accessibility Inspector kann das Attribut möglicherweise sehr gut anpassen, aber AppleScript kann dies nicht, da die Klasse dieses Attributs eine Klasse ist, die in AppleScript einfach nicht existiert. Wenn Sie ein Skript in AppleScript-ObjC oder Cocoa schreiben, könnten Sie es wahrscheinlich tun, weil Sie Zugriff auf ihre Datentypen hätten. Aber das erfordert das Erlernen von Objective-C, das auf meiner To-Do-Liste steht, aber noch nicht etwas, was ich getan habe. Warum genau müssen Sie die Auswahllängen anpassen?
@CJK - Ich schreibe Code und verwende verschiedene Befehlszeilentools für die DNA-Manipulation. Ich muss häufig eine Position in einem DNA-String finden, der sich auf der Befehlszeile inmitten von Tonnen anderer Debug-Ausgaben befindet, um entweder eine Änderung zu bestätigen oder zu sehen, was an einer Position passiert ist. Normalerweise mache ich das per Kopieren / Einfügen in etwas, das mir die DNA mit Schnüren zeigen kann, und dann muss ich normalerweise <40 Zeichen visuell bis zu der Stelle zählen, nach der ich suche. Es ist auch nicht immer eine einfache Zeichenzählung. Einige Zeichenfolgen enthalten Leerzeichen. Einige sind mit Lücken ausgerichtet. Das Auswählen der Zeichenfolge und das anschließende Verwenden des Dienstes ist viel schneller.
@CJK - keine Sorge übrigens. Wie auch immer, ich weiß, dass es unzählige Möglichkeiten gibt, das zu erreichen, was ich tun möchte. Ich habe den Dienst gerade in der Textbearbeitung verwendet und finde ihn sehr effizient. Ich habe einen anderen Dienst, um das Gegenteil zu tun. Ich markiere einen DNA-String und er sagt mir nicht nur die Sequenzposition, sondern auch die Ausrichtungsposition, die Anzahl der einzelnen Nukleotide, die Anzahl der mehrdeutigen Nukleotide, die Anzahl der Lücken usw. Auch sehr nützlich. Ich habe mit der UI-Elementbibliothek herumgespielt. Ich kann das AppleScript auf die Variable "Ausgewählter Textbereich" bringen, konnte es aber aufgrund von Klassenfehlern nicht dazu bringen, den Wert anzuzeigen.

Antworten (1)

Wie ich gelernt habe, gibt / gab es nur drei Möglichkeiten, die Auswahl im Terminal durch Eingabe / Verwendung eines Längenwerts (oder über eine Reihe von Tastaturdrücken) zu manipulieren.

  1. Accessibility Inspector zeigt, dass es möglich sein sollte, die Auswahllänge programmgesteuert zu manipulieren, da Sie eine vorhandene Auswahllänge mit dem Feld len im Abschnitt „Ausgewählter Textbereich“ im Abschnitt „Erweitert“ bearbeiten können, indem Sie auf Bearbeiten klicken und eine neue Zahl eingeben, wie in der Bildschirmabdeckung zu sehen: https://www.dropbox.com/s/bn2z6ewmdj4mfai/Accessibility_Inspector-s selected_text_len.png?dl=0

Die Eigenschaft/das Attribut "Ausgewählter Textbereich" (?) scheint in AppleScript nicht zugänglich zu sein, obwohl sie, wenn sie zugänglich wäre, hier wäre: wenn Sie sie in Ihrem Applescript (text area of (scroll area 1 of (splitter group 1 of (front window))))aktiviert haben . UI elementsEs ist möglicherweise möglich, auf diese Werte zuzugreifen, wie @CJK in den Kommentaren über Objective-C angegeben hat. Applescript hätte jedoch, selbst wenn es auf die Variable zugreifen könnte, wahrscheinlich nicht die Möglichkeit, sie zu ändern.

Eine nützliche Funktion, um zu sehen, was Applescript manipulieren kann oder worauf es Zugriff hat, ist einfach return attributesoder return properties. Zum Beispiel:

tell application "System Events"
    if UI elements enabled is false then
        set UI elements enabled to true
        if UI elements enabled is false then error "Can't do it"
    end if
    tell application process "Terminal"
        tell window 1
            tell splitter group 1
                tell scroll area 1
                    --return properties
                    return attributes
                end tell
            end tell
        end tell
    end tell
end tell
  1. Diese Methode funktioniert ab OS X 10.8 nicht mehr, aber eine Auswahl im Terminal über die Tastatur war früher wie hier beschrieben möglich . Alles, was Sie tun mussten, war Befehl-Option-Return zu drücken, mit den Pfeiltasten zu der Region zu navigieren, die Sie auswählen möchten, Return zu drücken, mit den Pfeiltasten an der Cursorposition auszuwählen und Return zu drücken. Ich suchte nach der Möglichkeit, diese Funktion wieder zu aktivieren, kam aber trocken.

  2. Es gibt eine Möglichkeit, Text im Terminal mit der Tastatur auszuwählen, aber es ist sehr begrenzt. Sie können Text zwischen „Markierungen“ mit Befehlstaste-Umschalttaste-A auswählen (ohne die Zeilen, auf denen sich die Markierungen befinden). Markierungen werden standardmäßig in jeder Eingabeaufforderungszeile hinzugefügt. Sie können jedoch Markierungen hinzufügen, indem Sie mit der rechten Maustaste auf eine Auswahl klicken und eingeben Command-U. Markierungen gelten jedoch nur pro Zeile, nicht spezifisch für den Start/Stopp der Auswahl in einer Zeile. Wenn Sie mit der rechten Maustaste auf einen nicht ausgewählten Text klicken, der weich umbrochen ist (dh eine mehrzeilige Zeichenfolge) und eine Markierung hinzufügen, wird für jede weich umbrochene Zeile eine separate Markierung hinzugefügt. Sie können keinen Text zwischen mehreren Markierungen auswählen, noch ist es möglich, Markierungen über Applescript hinzuzufügen, daher ist es nicht möglich, dies zu verwenden, um eine Auswahllänge programmgesteuert anzupassen. Weitere Informationen zu Marken finden Sie hier .

Was die Pfeiltasten können, hatte ich auch schon erkundet, da Shift-{Links,Rechts}-Pfeil bei mir die Strings ";2C" und ";2D" mit Piepton auf der Kommandozeile eingibt. Also habe ich diese Einträge aus der Tabelle in Terminal -> Einstellungen -> Profile -> Tastatur entfernt, um das zu verhindern. Ich hatte gehofft, es würde mir erlauben, Text (zumindest in der Eingabeaufforderung der aktuellen Zeile) mit Umschalt-Pfeil auszuwählen, aber alles, was es tat, war, den Cursor zu bewegen, ohne auszuwählen.

Angesichts des Ziels dieses Unterfangens (zu sehen, wo sich eine Koordinate in einer ausgewählten Zeichenfolge befindet) können Sie dies jedoch über ein Dialogfeld des Automator-Dienstes mit einem Applescript erreichen. Sie müssen lediglich die Auswahl in einem Dialogfenster präsentieren und falls die Ziellänge länger als die Auswahl ist, müssen Sie die verbleibenden Zeichen mit einem Dummy-Zeichen ('N' für DNA) auffüllen.

Sie können diese Strategie nur bedingt anwenden, wenn Terminal die vorderste Anwendung ist. Beachten Sie, dass dies nicht das gesamte Skript ist - nur ein Ausschnitt, aber Sie können das gesamte Skript hier sehen , das viele Schnickschnack enthält, die nichts mit dieser Frage zu tun haben.

--Check the length of the selected text passed in
set character_count to count characters of ((input as string) as string)

set lengthen to false
set mod_length to character_count - n
--Figure out whether the selection must be lengthened or shrunk
if character_count is equal to 0 or n is greater than character_count then
    set lengthen to true
    set mod_length to n - character_count
end if

--See if we're in Terminal
set isTerminal to ((name of first process where it is frontmost) as string) is equal to "Terminal"

if isTerminal is true then
    if lengthen is true then
        set substr to (input as string)
        repeat mod_length times
            set substr to substr & "N"
        end repeat
    else
        set substr to text 1 thru n of (input as string)
        set substr to substr & (text (n + 1) thru character_count of (input as string))
    end if
    ignoring application responses
        display dialog "Length " & n & " is selected below:" default answer substr buttons {"OK"} default button 1 with title "Selected Character Position"
    end ignoring
end if

--Trick to make sure arrow presses affect the right side of the selection instead of the left
if not (character_count is equal to 0 or n is greater than character_count) then
    key code 124 using {shift down}
    key code 123 using {shift down}
    key code 124 using {shift down}
end if

repeat mod_length times
    if lengthen is true then
        key code 124 using {shift down}
    else
        key code 123 using {shift down}
    end if
end repeat
delay 1

Das wird das Endziel effektiv erreichen. Leider muss die Position mit einem Textmarker in einer Schriftart mit variabler Breite markiert werden, da Dialogfelder keine Formatierung oder automatische Textauswahl zulassen.

Ich habe die Lösung verbessert. Beachten Sie, dass ich verwenden musste, ignoring application responsesdamit die Pfeiltasten die Auswahl im Dialog bedienen konnten. Die Verzögerung am Ende verhindert, dass der Dialog sofort verschwindet.
Übrigens habe ich diese Strategie verwendet, um die in diesem Kern beschriebenen Dienste zu erstellen: gist.github.com/hepcat72/3319f03f3b9e75ad2fa6e7f3d63c690b