Mastodon
Zdjęcie okładkowe wpisu Alfred dla zaawansowanych

Alfred dla zaawansowanych

3
Dodane: 8 lat temu

Jedną z miłych niespodzianek, jakie pojawiły się w najnowszej, trzeciej odsłonie Alfreda, są zmienne. I to właśnie one będą przedmiotem tego tekstu.

W poprzednich wersjach Alfreda mieliśmy w zasadzie do wykorzystania ograniczoną liczbę zmiennych. Chodzi tu przede wszystkim o {query}, czyli wartość, jaką wprowadzaliśmy do workflow lub która była wynikiem poprzedniej akcji. Pozostałe trzy zmienne używane były wyłącznie w elemencie wyjściowym Copy to Clipboard, a chodzi tu o {time}, {date} oraz {clipboard}, których nazwy chyba nie wymagają objaśnienia. W każdym razie {query} była tą główną zmienną i jeśli chcieliśmy przekazać więcej niż jeden argument, trzeba było kombinować. Ja na przykład łączyłem kilka argumentów w jeden ciąg przedzielony jakimś specyficznym znakiem. Ten z kolei ułatwiał rozdzielanie ciągu w kolejnych elementach.

Alfred 3 niesamowicie ułatwia tę oraz inne operacje, które wymagają działania na wielu argumentach. Zobaczmy zatem, jak konfigurować i korzystać ze zmiennych.

Workflow Environment Variables

Pierwszy sposób na dodanie zmiennych znajduje się u góry okna edycji workflow jako przycisk [x]. W tym miejscu dodamy zmienne środowiskowe, czyli te, w których będziemy przechowywać wartości stałe, jak choćby ścieżka do jakiegoś folderu lub klucz API dla jakiejś usługi. Warto zauważyć, że w ostatnim przykładzie wykorzystania (jako API) można dodatkowo zaznaczyć pole w kolumnie Don’t Export. Spowoduje to, że w czasie eksportowania całego workflow w celu udostępnienia go innym osobom wartość zmiennej przechowującej klucz API będzie wyzerowana, nowy użytkownik musi tam więc wprowadzić swój klucz, oczywiście, jeśli tego wymaga sytuacja.

Tak na marginesie w tym samym oknie, po lewej stronie można zawrzeć informacje na temat workflow, niezbędne instrukcje oraz numer wersji.

Narzędzie Arg and Vars

Drugim sposobem na dodanie zmiennych jest element dodawany bezpośrednio w workflow. Znajdziemy go w kategorii Utilities pod nazwą Arg and Vars. Tam możemy skonfigurować dwie rzeczy. Po pierwsze, w polu Argument zmodyfikujemy wartość wejściową {query} poprzez dodanie jakiegoś ciągu, innej zmiennej lub całkowitą podmianę wartości. Po drugie, w polu Variables dodamy nowe zmienne lub zmienimy istniejące (nawet te środowiskowe), nadając im nowe wartości.

Ręcznie

Powyższe dwa sposoby dodawania zmiennych, choć w miarę wygodne i bardzo łatwe, mają swoje ograniczenia. Jednym z nich jest choćby brak możliwości dynamicznej zmiany zmiennej. W takiej sytuacji mamy do wyboru jeszcze trzecie rozwiązanie – ręczne tworzenie zmiennych. Wiąże się ono z zastosowaniem na wyjściu elementu Run Script lub Script Filter odpowiedniego kawałka skryptu JSON. Zacznijmy od tego pierwszego (Run Script). Aby przekazać dane dalej, normalnie stosujemy polecenia odpowiedzialne za wyświetlenie informacji, na przykład print "To jest tekst" w Pythonie lub echo "To jest tekst" w Bashu. Jeśli jednak chcielibyśmy przekazać więcej niż jedną zmienną, musimy posłużyć się odpowiednią składnią, która wygląda tak:

{"alfredworkflow": {
    "arg": "argument główny",
    "variables": {"zmienna1": "argument poboczny zapisany pod nazwą zmienna"}}}

Oczywiście wartości "arg" oraz zmiennych w tablicy danych "variables" (w powyższym przypadku to jedna zmienna o nazwie "zmienna1") mogą mieć wartości dynamiczne.

Jeśli chodzi o element Script Filter, to również tam możemy utworzyć kilka zmiennych dla pojedynczego elementu. Wymaga to jednak JSON-cepcji, czyli użycia kodu JSON wewnątrz kodu JSON z odpowiednim kodowaniu. Najpierw przyjrzyjmy się normalnemu elementowi (item) w Script Filter:

{"items": [
    {"title": "Jakiś tytuł",
     "arg": "argument przekazywany dalej"}
]}

Jeśli jednak chcemy przekazać więcej niż jeden argument, musimy do wartości "arg" dodać wcześniej pokazaną składnię JSON w ten sposób:

{"items": [
    {
     "title": "Jakiś tytuł",
     "arg": "{\"alfredworkflow\": {\"arg\": \"argument przekazywany dalej\", \"variables\": {\"zmienna1\": \"dodatkowy argument\"}}}"
     }
]}

Zwróćcie szczególną uwagę na to, że tym razem przed każdym cudzysłowem w tablicy alfredworkflow znajdują się znaki \ (escape character).

Pojawia się pytanie, jak odwołać się do tych wartości w kolejnym elemencie? Bardzo łatwo. Zmienna "arg" to po prostu nasze {query} w następnym elemencie. Z kolei zmienne w tablicy danych wywołujemy tak, jak każdą inną zmienną w danym języku programowania.

Dla Bash będzie to:

$zmienna1

Dla Pythona:

import os
zmienna1 = os.environ['zmienna1']

# lub też
zmienna1 = os.getenv['zmienna1']

I tak dalej…

Tak utworzone zmienne będą przechowywać swoje wartości tylko na czas działania workflow. Jeśli jednak mamy zamiar zapisać ich wartości na stałe, również i na to jest metoda. Polega ona na zapisaniu zmiennej w pliku info.plist danego workflow. Można to zrobić przy pomocy narzędzia PlistBuddy. Aby więc zapisać zmienną o nazwie ZOSTAW, posłużymy się takim poleceniem:

/usr/libexec/PlistBuddy -c "Set :variables:ZOSTAW \"wartość zmiennej\"" info.plist

W przypadku, gdy chcemy usunąć taką zmienną, należy posłużyć się takim poleceniem:

/usr/libexec/PlistBuddy -c "Delete :variables:ZOSTAW" info.plist

Tak przedstawia się korzystanie ze zmiennych w Alfredzie 3. Otwiera to zupełnie nowe możliwości wykorzystywania workflows, a także ułatwia pracę z wieloma wartościami.

Maciej Skrzypczak

Użytkownik sprzętu z nadgryzionym jabłkiem, grafik komputerowy, Redaktor iMagazine.pl. Mastodon: mcskrzypczak@c.im

Zapraszamy do dalszej dyskusji na Mastodonie lub Twitterze .

Komentarze: 3

Jeśli chodzi o Alfreda i App Store:
– mam 2 workflow, którymi wyszukujesz aplikacje dla iOS i macOS – w wynikach wyświetla nazwę, producenta, cenę, urządzenie (w przypadku iOS: iPhone, iPad, Universal) – jako wynik otrzymujesz URL do appki (w moim przypadku w postaci affiliate link)
– mam workflow do pobierania ikony aplikacji z App Store i MAS. W pierwszym przypadku, po pobraniu, dorabia od razu zaokrąglone rogi (choć wymaga to doinstalowania dodatkowej biblioteki w Pythonie).

Manipulacją tekstem co prawda również zajmuje się u mnie KM, ale z nowymi narzędziami w Alfredzie 3 też powinno się udać podziałać.

Nie lubię się uzależniać od aplikacji trzecich za bardzo, bo te lubią czasami nie działać, ale chyba będę musiał spróbować…