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

5

He creado muchos módulos AppleScript para TextWrangler pero esta vez me enfrento a un problema "estúpido": La idea: si no se selecciona nada en el texto, establezca la selección en todo el texto. He hecho muchas pruebas, sin éxito. Aquí está el último:

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 "Select all"
            delay 1
        end tell
        set my_selection to (get selection)

        delay 2
        set nb_new_mot to count words of (my_selection)
        display dialog "After select all " & nb_new_mot
    end if

    set var_1 to (replace "(" using "(" searching in my_selection options {search mode:literal, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false})
end tell

Cuando selecciono una parte del texto, está bien. Cuando no se selecciona nada, ingreso al bloque if , pero esto me da una selección vacía.

¿Alguna idea de cómo puedo capturar solo el texto seleccionado cuando hay algo y realizar una selección de todos y copiarlo si no hay texto seleccionado?

    
pregunta Peter 17.12.2017 - 23:31

2 respuestas

2

El motivo por el que obtiene una selección vacía, es decir, cuando no se selecciona nada y set my_selection to (get selection) devuelve , por ejemplo, insertion point before character 1 of text document 1 , el bloque if statement falla con el

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

parte del código porque TextWrangler no tiene el foco.

El comando keystroke va a lo que tenga el foco, así que antes de tener Eventos del sistema keystroke algo, activate el objetivo primero, por ejemplo:

tell application "TextWrangler"
    activate
    -- delay 1 -- # Uncomment and or adjust the value of the 'delay' command as/if necessary.
    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 "Select all"
...

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

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

    if nb_mot < 1 then
        set my_selection to characters 1 thru -1 of text document 1
        set nb_new_mot to count words of my_selection
    end if

    set var_1 to (replace "(" using "(" searching in my_selection options {search mode:literal, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false})
end tell

Para mayor claridad, he eliminado los comandos display dialog y delay junto con todos los Eventos del sistema código , y otro código innecesario, ya que la siguiente línea de código es todo lo que es necesario si nb_mot is < 1 :

set my_selection to characters 1 thru -1 of text document 1

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

tell application "TextWrangler"
    get selection
        --> insertion point before character 1 of text document 1
    count every word of insertion point before character 1 of text document 1
        --> 0
    get characters 1 thru -1 of text document 1
        --> characters 1 thru 499 of text document 1
    count every word of characters 1 thru 499 of text document 1
        --> 70
    replace "(" using "(" searching in characters 1 thru 499 of text document 1 options {search mode:literal, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
        --> 3
end tell
Result:
3

Como puede ver, reemplaza los tres ( en:

set var_1 to (replace "(" using "(" searching in my_selection options {search mode:literal, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false})
    
respondido por el user3439894 18.12.2017 - 00:17
2

Esto me funciona con la última versión de Sierra

property currentSelection : ""
property selectAll : ""
property oldClipboard : ""

copy (the clipboard) to oldClipboard

tell application "TextWrangler"
    set currentSelection to contents of selection
    if currentSelection is not "" then
        set the clipboard to currentSelection
    else
        tell its document 1 -- assuming the document in question is document 1
            select every text
        end tell
        set selectAll to contents of selection
        set the clipboard to selectAll
    end if
end tell
    
respondido por el wch1zpink 18.12.2017 - 01:19

Lea otras preguntas en las etiquetas