Come modificare la selezione del testo in applescript in un servizio di automazione

2

Ho scritto un servizio di automazione (destinato all'uso su qualsiasi testo selezionato in qualsiasi applicazione) che modifica la lunghezza della selezione in base a un numero / lunghezza specificata dall'utente. Ecco uno snippet di codice rilevante che esclude tutte le altre funzionalità / sottigliezze del servizio:

--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

Il servizio funziona alla grande nella maggior parte delle applicazioni, tranne Terminal.app (poiché i tasti freccia vengono utilizzati per spostare il cursore sulla riga di comando e non le dimensioni della selezione attualmente attiva). Idealmente, questo funzionerebbe effettivamente in Terminal, perché di solito è dove devo usare questo servizio.

Quindi c'è un modo per modificare la lunghezza del testo selezionato su qualsiasi riga della cronologia in una finestra di Terminal.app (assumendo che il primo carattere selezionato sia la posizione 1) usando un servizio di automazione (e un codice all'interno di quel servizio) in un modo che non usa i tasti freccia? Per esempio. Seleziono l'output di un comando ed eseguo il servizio per regolare la lunghezza della selezione su una lunghezza che ho fornito.

Sfondo:

La ragione per cui sto facendo questo è perché il mio lavoro coinvolge manipolazione / modifica del DNA e, come parte del processo di debug per questi script, a volte ho bisogno di osservare brevemente cosa è successo in una posizione specifica in un output di stringa DNA su la linea di comando - rapidamente e sporadicamente - solo per confermare un cambiamento previsto aveva il risultato voluto. Quindi questo è solo un modo veloce per trovare visivamente una coordinata in una lunga stringa di DNA. Alla fine intendo modificare questo servizio in modo tale che solo determinati caratteri vengano conteggiati nella determinazione della lunghezza della selezione (ad esempio non contare numeri, spazi, nuove righe, ecc.)

    
posta hepcat72 21.02.2018 - 20:29
fonte

1 risposta

0

Quindi, come ho imparato, ci sono / c'erano solo 3 modi per manipolare la selezione in Terminale inserendo / usando un valore di lunghezza (o tramite una serie di tasti per la tastiera).

  1. Controllo accessibilità mostra che dovrebbe essere possibile manipolare la lunghezza della selezione in modo programmatico, perché puoi modificare una lunghezza di selezione esistente utilizzando il campo len in "Intervallo testo selezionato" nella sezione "Avanzate" facendo clic su modifica e inserendo un nuovo numero, come mostrato nella schermata: link

La proprietà / attributo "Intervallo di testo selezionato" (?) non sembra accessibile in AppleScript, ma se fosse accessibile, sarebbe qui: (text area of (scroll area 1 of (splitter group 1 of (front window)))) se hai abilitato UI elements in Applescript. Potrebbe essere possibile accedere a questi valori, come @CJK indicato nei commenti tramite Objective-C. Tuttavia, anche se Applescript potesse accedere alla variabile, probabilmente non avrebbe la possibilità di modificarlo.

Una funzione utile per vedere che cosa può manipolare o accedere a può è semplice return attributes o return properties . Ad esempio:

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. Questo metodo, a partire da OS X 10.8 non funziona più, ma facendo una selezione in Terminale usando la tastiera utilizzata, come descritto here . Tutto quello che dovevi fare era premere Comando-Opzione-Ritorna, navigare nella regione che vuoi selezionare con i tasti freccia, premere Invio, selezionare dalla posizione del cursore usando i tasti freccia e premere Invio. Ho cercato la possibilità di riattivare questa funzione, ma sono venuto a mancare.

  2. C'è un modo per selezionare il testo nel terminale usando la tastiera, ma è molto limitato. Puoi selezionare il testo tra "segni" usando Comando-Maiuscole-A (senza includere le linee su cui sono posizionati i segni). I segni vengono aggiunti per impostazione predefinita su ogni riga del prompt dei comandi. Tuttavia, puoi aggiungere contrassegni facendo clic con il pulsante destro del mouse su una selezione e digitando Command-U . I segni sono solo per linea, tuttavia, non specifici per la selezione inizio / fine su una linea. Se si fa clic con il pulsante destro del mouse su un testo non selezionato che è avvolto in modo morbido (cioè una stringa multi-linea) e si aggiunge un segno, viene aggiunto un segno separato per ogni linea con avvolgimento morbido. Non è possibile selezionare il testo tra più segni, né è possibile aggiungere contrassegni tramite applescript, quindi non è possibile utilizzarlo per regolare a livello di selezione una lunghezza di selezione. Puoi trovare maggiori informazioni sui marchi qui .

Avevo anche esplorato ciò che i tasti freccia dovevano essere in grado di fare, poiché shift- {left, right} -arrow for me entra nelle stringhe "; 2C" e "; 2D" con un bip sulla riga di comando per me. Quindi ho rimosso quelle voci dalla tabella in Terminal - > Preferenze - > Profili - > Tastiera per impedirlo. Speravo che mi avrebbe permesso di selezionare il testo (almeno sul prompt della riga corrente) usando la freccia Maiuscola, ma tutto ciò che ha fatto è stato spostare il cursore senza selezionare.

Tuttavia, dato l'obiettivo di questo sforzo (per vedere dove una coordinata si trova in una stringa selezionata), è possibile farlo tramite una finestra di dialogo dal servizio Automator usando un oggetto Applescript. Tutto quello che devi fare è presentare la selezione in una finestra di dialogo e se la lunghezza della destinazione è più lunga della selezione, devi riempire i caratteri rimanenti con un carattere fittizio ('N' per DNA).

È possibile eseguire questa strategia in modo condizionale, solo quando Terminal è l'applicazione in primo piano. Nota, questo non è l'intero script - solo un frammento, ma puoi vedere l'intero script qui , che contiene molte campane e amp; fischietti non correlati a questa domanda.

--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

Ciò realizzerà efficacemente l'obiettivo finale. Sfortunatamente, la posizione deve essere contrassegnata con un indicatore di testo in una faccia di tipo a larghezza variabile poiché le finestre di dialogo non consentono la formattazione o la selezione automatica del testo.

    
risposta data 27.02.2018 - 19:29
fonte

Leggi altre domande sui tag