Cómo modificar la selección de texto en applecript en un servicio de automatización

2

Escribí un Servicio de Automatización (destinado a usarse en cualquier texto seleccionado en cualquier aplicación) que modifique la longitud de la selección dado el número / longitud que el usuario especifica. Aquí hay un fragmento de código relevante que excluye todas las otras características / detalles del servicio:

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

El servicio funciona muy bien en la mayoría de las aplicaciones, excepto en Terminal.app (porque las teclas de flecha se usan para mover el cursor en la línea de comando y no en el tamaño de la selección actualmente activa). Idealmente, esto realmente funcionaría en Terminal, porque ahí es donde generalmente necesito usar este servicio.

Entonces, ¿hay una manera de modificar la longitud del texto seleccionado en cualquier línea en el historial en una ventana de Terminal.app (asumiendo que el primer carácter seleccionado es la posición 1) usando un servicio de automatización (y applecript dentro de ese servicio) en una ¿Cómo no usar las teclas de flecha? P.ej. Seleccioné la salida de un comando y ejecuté el servicio para ajustar la longitud de la selección a la longitud que he proporcionado.

Background:

La razón por la que hago esto es porque mi trabajo involucra manipulación / modificación de ADN y como parte del proceso de depuración de estos scripts, a veces necesito observar brevemente lo que sucedió en una posición específica en una salida de cadena de ADN en la línea de comando, rápida y directamente, solo para confirmar un cambio intencionado tuvo el resultado deseado. Así que esta es solo una forma rápida de encontrar visualmente una coordenada en una larga cadena de ADN. Finalmente, tengo la intención de modificar este servicio de tal manera que solo se cuenten ciertos caracteres en la determinación de la longitud de la selección (por ejemplo, no cuente números, espacios, nuevas líneas, etc.).

    
pregunta hepcat72 21.02.2018 - 20:29

1 respuesta

0

Así que, como he aprendido, hay solo 3 formas de manipular la selección en Terminal ingresando / usando un valor de longitud (o mediante una serie de pulsaciones de teclado).

  1. Accessibility Inspector muestra que debería ser posible manipular mediante programación la longitud de la selección, ya que puede editar una longitud de selección existente utilizando el campo len en el "Rango de texto seleccionado" en la sección "Avanzado" haciendo clic en editar e ingresando un nuevo número, como se ve en la captura de pantalla: enlace

La propiedad / atributo "Rango de texto seleccionado" (?) no parece ser accesible en AppleScript, aunque si estuviera disponible, estaría aquí: (text area of (scroll area 1 of (splitter group 1 of (front window)))) si ha habilitado UI elements en su Applescript. Podría ser posible acceder a estos valores, como @CJK se indica en los comentarios a través de Objective-C. Sin embargo, AppleScript, incluso si pudiera acceder a la variable, probablemente no tendría la capacidad de alterarla.

Una característica útil para ver lo que Applecript puede manipular o tiene acceso es simplemente return attributes o return properties . Por ejemplo:

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. Este método, a partir de OS X 10.8 ya no funciona, pero hacer una selección en Terminal usando el teclado que solía ser posible, como se describe aquí . Todo lo que tenía que hacer era presionar Comando-Opción-Retorno, navegar a la región que desea seleccionar con las teclas de flecha, presionar retorno, seleccionar desde la posición del cursor usando las teclas de flecha y presionar retorno. Busqué la capacidad de volver a habilitar esta función, pero surgió en seco.

  2. Hay una forma de seleccionar texto en la Terminal usando el teclado, pero es muy limitado. Puede seleccionar texto entre "marcas" usando Comando-Shift-A (sin incluir las líneas en las que están las marcas). Las marcas se agregan de forma predeterminada en cada línea de línea de comandos. Sin embargo, puede agregar marcas haciendo clic con el botón derecho en una selección y escribiendo Command-U . Las marcas son solo por línea, sin embargo, no son específicas del inicio / parada de selección en una línea. Si hace clic con el botón derecho en cualquier texto no seleccionado que esté envuelto en software (es decir, una cadena de varias líneas) y agrega una marca, se agrega una marca separada para cada línea envuelta en software. No puede seleccionar texto entre varias marcas, ni es posible agregar marcas a través de applecript, por lo que no es posible usar esto para ajustar la longitud de una selección mediante programación. Puede encontrar más información sobre las marcas en aquí .

También exploré lo que se supone que deben hacer las teclas de flecha, ya que shift- {left, right} -arrow para mí ingresa las cadenas "; 2C" y "; 2D" con un pitido en la línea de comando para mi. Así que eliminé esas entradas de la tabla en Terminal - > Preferencias - > Perfiles - > Teclado para evitar eso. Esperaba que me permitiera seleccionar texto (al menos en la línea actual) usando la flecha de desplazamiento, pero todo lo que hizo fue mover el cursor sin seleccionar.

Sin embargo, dado el objetivo de este esfuerzo (para ver dónde está una coordenada en una cadena seleccionada), puede lograr esto a través de un cuadro de diálogo del servicio Automator usando un Applescript. Todo lo que tiene que hacer es presentar la selección en un cuadro de diálogo y, si la longitud del objetivo es más larga que la selección, debe completar los caracteres restantes con un carácter ficticio ('N' para el ADN).

Puede realizar esta estrategia de forma condicional, solo cuando Terminal es la aplicación más avanzada. Tenga en cuenta que este no es el script completo, solo un fragmento, pero puede ver el script completo aquí , que contiene muchas campanas y amp; silbatos no relacionados con esta pregunta.

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

Eso logrará efectivamente el objetivo final. Desafortunadamente, la posición debe estar marcada con un marcador de texto en una cara de tipo de ancho variable ya que los cuadros de diálogo no permiten el formateo o la selección automática de texto.

    
respondido por el hepcat72 27.02.2018 - 19:29

Lea otras preguntas en las etiquetas