AppleScript: jeśli wybór jest pusty, zaznacz wszystko

5

Zrobiłem wiele modułów AppleScript dla TextWranglera, ale tym razem mam problem z „głupim”: Idea: jeśli nic nie jest zaznaczone w tekście, ustaw zaznaczenie na cały tekst. Zrobiłem wiele testów, bez żadnych sukcesów. Oto ostatni:

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

Kiedy wybieram część tekstu, jest w porządku. Gdy nic nie jest zaznaczone, wpisuję if blok, ale to daje mi pusty wybór.

Każdy pomysł, w jaki sposób mogę pobrać tylko wybrany tekst, gdy jest coś i wykonać zaznaczenie wszystkiego i skopiować to, jeśli nie zaznaczono żadnego tekstu?

Peter
źródło
1
Zobacz aktualizację mojej oryginalnej odpowiedzi, dzięki.
user3439894

Odpowiedzi:

2

Powód, dla którego otrzymujesz pusty wybór, tj. Kiedy nic nie jest wybrane i set my_selection to (get selection) zwraca , np. insertion point before character 1 of text document 1, the if komunikat blok kończy się niepowodzeniem

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

część kod bo TextWrangler nie ma ostrości.

The keystroke dowództwo idzie do wszystkiego, co się skupia, więc zanim to zrobisz Zdarzenia systemowe keystroke coś, activate najpierw cel, np .:

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

To powiedziawszy, możesz pominąć activate dowództwo i użyj następujących przykład AppleScript kod :

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

Zauważ, że dla jasności usunąłem display dialog i delay polecenia wraz ze wszystkimi Zdarzenia systemowe kod i inne niepotrzebne kod , jak w poniższym wierszu kod to wszystko, co jest konieczne, jeśli nb_mot is < 1:

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

The Dziennik zdarzeń i Wynik tego przykład AppleScript kod jest:

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

Jak widać, zastępuje trzy ( w:

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})
user3439894
źródło
Niestety to nic nie zmienia :(
Peter
Inny punkt: jeśli wykonam naciśnięcie klawisza „a” za pomocą polecenia w dół, a następnie naciśnięcie klawisza „c” za pomocą polecenia w dół, spowoduje to odcięcie tekstu do schowka. Ale tutaj schowek pozostaje pusty. Oznacza to, że cmd + A i Cmd + C nie działają (a więc nie mogę uzyskać nowego wyboru). Dziwne...
Peter
@Peter, chciałbym się z tobą różnić, to zmienia rzeczy, jednak zaktualizowałem swoją odpowiedź, ponieważ nie ma absolutnie żadnej potrzeby używania skryptów interfejsu użytkownika, gdy set my_selection to characters 1 thru -1 of text document 1 to wszystko, co jest konieczne if nb_mot < 1!
user3439894
Dzięki nowej odpowiedzi działa. Tylko przy aktywacji nic więcej nie robi, ale z ustawieniem „my_selection na znaki od 1 do -1 dokumentu tekstowego 1” jest OK. Dzięki!
Peter
1
@Peter, The ⌘A ⌘C działa dla mnie, ponieważ używam obsługiwanej wersji TextWrangler na obsługiwanej wersji OS X. TextWrangler , TextWrangler to nie kompatybilne z macOS 10.13 (High Sierra) i najprawdopodobniej dlatego nie działa dla Ciebie. Możesz przełączyć się na BBEdit. W każdym razie mój komentarz na temat skryptów UI stoi i cieszę się, że mogłem zaoferować ci jeden z innych sposobów, aby sprawić, że wszystko będzie działało.
user3439894
2

To działa dla mnie przy użyciu najnowszej wersji 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
wch1zpink
źródło
Problem polega na tym, że tracisz poprzednią zawartość schowka, podczas gdy z odpowiedzią użytkownika 3439894 zachowujesz zawartość schowka.
Peter
Właśnie zaktualizowałem kod, aby skopiować starą zawartość schowka. Aby być przechowywanym w zmiennej właściwości, do której można uzyskać dostęp w razie potrzeby
wch1zpink
@Peter Możesz również komentować polecenia kopiowania, jeśli ich nie potrzebujesz
wch1zpink
Twój kod jest w porządku, dlaczego wprowadzono małą zmianę: w innym, zamiast powiedzieć swojemu dokumentowi1 ... i tak dalej, po prostu wstaw 2 linie: „zaznacz każdy tekst dokumentu tekstowego 1” i „ustaw moją_selekcję na (uzyskaj wybór)”. Co dziwne, w OSX 10.13.2, „zaznacz każdy tekst” po „powiedz”, daj wiadomość, że tekst jest nieznany. Ale może to jest problem TextWranglera, ponieważ nie jest zbyt „stabilny” w High Sierra. Dzięki!
Peter