5 votos

AppleScript: si la selección está vacía, selecciona todo

He creado muchos módulos de AppleScript para TextWrangler, pero esta vez me enfrento a un problema "estúpido": La idea: si no hay nada seleccionado en el texto, seleccionar todo el texto. He realizado muchas pruebas, sin éxito. Aquí está la última:

tell application "TextWrangler"
    set my_selection to (get selection)
    set nb_mot to count words of (my_selection)

    if nb_mot < 1 then
        tell application "System Events"
            keystroke "a" using command down
            display dialog "Seleccionar todo"
            delay 1
        end tell
        set my_selection to (get selection)

        delay 2
        set nb_new_mot to count words of (my_selection)
        display dialog "Después de seleccionar todo " & nb_new_mot
    end if

    set var_1 to (replace "(" usando "(" buscando en my_selection opciones {modo de búsqueda:literal, empezando por el principio:falso, buscar en círculos:falso, hacia atrás:falso, sensible a mayúsculas y minúsculas:falso, coincidir palabras:falso, extender selección:falso})
end tell

Cuando selecciono una parte del texto, todo está bien. Cuando no hay nada seleccionado, entro en el bloque if, pero esto me da una selección vacía.

¿Alguna idea de cómo puedo seleccionar solo el texto seleccionado cuando hay algo y realizar una selección de todo y copiar eso si no hay texto seleccionado?

2voto

user3439894 Puntos 5883

La razón por la que obtienes una selección vacía, es decir, cuando no se selecciona nada y set my_selection to (get selection) devuelve, por ejemplo, punto de inserción antes del carácter 1 del documento de texto 1, el bloque de if falla con el

tell application "System Events"
    keystroke "a" using command down

porción del código debido a que TextWrangler no tiene el enfoque.

El comando keystroke va a lo que tiene el foco, por lo que antes de tener System Events keystroke algo, activa primero el objetivo, por ejemplo:

tell application "TextWrangler"
    activate
    -- delay 1 -- # Descomenta y/o ajusta el valor del comando 'delay' según sea necesario.
    set my_selection to (get selection)
    set nb_mot to contar palabras de (my_selection)

    if nb_mot < 1 then
        tell application "System Events"
            keystroke "a" using command down
            display dialog "Seleccionar todo"
…

Dicho esto, puedes omitir el comando activate y utilizar el siguiente ejemplo de AppleScript código:

tell application "TextWrangler"
    set my_selection to selection
    set nb_mot to contar palabras de my_selection

    if nb_mot < 1 then
        set my_selection to characters 1 a -1 de documento de texto 1
        set nb_new_mot to contar palabras de my_selection
    end if

    set var_1 a (replace "(" utilizando "(" buscando en my_selection opciones {modo de búsqueda:literal, comenzando en la parte superior:falso, envolver:falso, atrás:falso, sensible a mayúsculas/minúsculas:falso, coincidir palabras:falso, ampliar selección:falso})
fin decir

Nota para claridad, he eliminado los comandos display dialog y delay junto con todo el código de System Events, y otro código innecesario, ya que la siguiente línea de código es todo lo que es necesario si el nb_mot es < 1:

set my_selection a characters 1 a -1 de documento de texto 1

El Registro de Eventos y el Resultado de este ejemplo de AppleScript código es:

tell application "TextWrangler"
    get selection
        --> punto de inserción antes del carácter 1 del documento de texto 1
    contar cada palabra de punto de inserción antes del carácter 1 del documento de texto 1
        --> 0
    get characters 1 a -1 de documento de texto 1
        --> caracteres 1 a 499 de documento de texto 1
    contar cada palabra de caracteres 1 a 499 de documento de texto 1
        --> 70
    replace "(" utilizando "(" buscando en caracteres 1 a 499 de documento de texto 1 opciones {modo de búsqueda:literal, comenzando en la parte superior:falso, envolver:falso, atrás:falso, sensible a mayúsculas/minúsculas:falso, coincidir palabras:falso, ampliar selección:falso}
        --> 3
end tell
Resultado:
3

Como puedes ver, reemplaza los tres ( en:

set var_1 a (replace "(" utilizando "(" buscando en my_selection opciones {modo de búsqueda:literal, comenzando en la parte superior:falso, envolver:falso, atrás:falso, sensible a mayúsculas/minúsculas:falso, coincidir palabras:falso, ampliar selección:falso})

0 votos

Lamentablemente, este cambio no cambia nada :(

0 votos

Otro punto: si presiono la tecla "a" con la tecla Command pulsada y luego presiono la tecla "c" con la tecla Command pulsada, esto cortará el texto al portapapeles. Pero aquí, el portapapeles permanece vacío. Significa que Cmd+A y Cmd+C no tienen efecto (y por lo tanto no puedo obtener la nueva selección). Extraño...

0 votos

@Pedro, difiero contigo, sí cambia las cosas, sin embargo actualicé mi respuesta porque realmente no hay necesidad de utilizar la interfaz de usuario cuando establecer mi_seleccion a los caracteres 1 al -1 del documento de texto 1 es todo lo que es necesario cuando si nb_mot < 1!

2voto

wch1zpink Puntos 11

Esto funciona para mí usando la última versión de Sierra

propiedad currentSelection : ""
propiedad selectAll : ""
propiedad oldClipboard : ""

copie (la clipboard) a oldClipboard

decir aplicación "TextWrangler"
    establecer currentSelection en contenido de la selección
    si currentSelection no es "" entonces
        establecer el clipboard en currentSelection
    else
        decir su documento 1 -- suponiendo que el documento en cuestión es el documento 1
            seleccionar todo el texto
        end tell
        establecer selectAll en contenido de la selección
        establecer el clipboard en selectAll
    end if
end tell

0 votos

El problema es que pierdes el contenido anterior del portapapeles mientras que con la respuesta de user3439894, conservas el contenido del portapapeles.

0 votos

Acabo de actualizar el código para copiar el contenido antiguo del portapapeles y guardarlo en una variable de propiedad a la que puedes acceder si es necesario.

0 votos

@Peter También puedes comentar las comandos de copia si no los necesitas

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X