Alfred Workflows für fortgeschrittene Benutzer

Nun, Sie haben es bis zum fortgeschrittenen Tutorial geschafft. Gut gemacht! Nun zur wirklichen Arbeit. Alfred kann verwendet werden, um einige komplizierte Dinge zu tun, einschließlich rekursiver Programmierung! Die Konzepte hier sind nicht einfach und nicht für den unerfahrenen Programmierer.

Skriptfilter

Skriptfilter ist der letzte zu besprechende Blocktyp. Wie Dateifilter, ein Skriptfilter gibt dem Benutzer eine Liste mit Optionen zur Auswahl. Der Unterschied ist, a Skriptfilter ermöglicht dem Programmierer, die Liste der Optionen mit einem Skript zu erstellen.

Eine einfache Auswahl zum Erstellen eines Projekts im Projektordner zeigt die Verwendung von a an Skriptfilter. Fügen Sie zuerst eine Skriptfilter zum Projektmanager-Workflow aus dem Zwischentutorial.


Skriptfilter: Konfigurationsbildschirm

Stellen Sie das ein Stichwort zu pm: erstellen, Überprüf den mit platz Setzen Sie das Kontrollkästchen auf den Argumenttyp Argument optional, das Platzhaltertitel zu Erstellen Sie ein Projekt, das Platzhalter-Subtext zu Projektmanager, das "Bitte warten" Subtext zu Optionen laden… . Die meisten dieser Optionen sind die gleichen wie in anderen Boxen.

Das mit platz Ankreuzfeld weist Alfred an, vor dem optionalen Argument ein Leerzeichen zu erwarten. Daher wird das führende Leerzeichen entfernt, bevor das Argument an das Skript übergeben wird. Ansonsten wird es einfach alles weitergeben Stichwort zum Skript für diesen Block.

Das Argumenttyp Selektor hat drei Werte: Argument erforderlich, Argument optional, und Kein Argument. Das Argument erforderlich akzeptiert keinen Wagenrücklauf, bis nach dem Schlüsselwort ein Argument angegeben wird. Es wird alles an das Skript übergeben, wenn der Benutzer es eingibt. Das Argument optional ermöglicht es dem Benutzer, die Eingabetaste ohne ein gegebenes Argument zu drücken. Das Kein Argument wechselt zum nächsten übereinstimmenden Schlüsselwort, wenn der Benutzer ein Argument angibt. Andernfalls wird eine Standardsuche ausgeführt.

Das "Bitte warten" Subtext Mit dieser Option können Sie dem Benutzer einen Subtext geben, während sich das Skript im befindet Skriptfilter wird ausgeführt. Dadurch kann der Benutzer des Skripts wissen, ob alle Auswahlmöglichkeiten verfügbar sind oder nicht.

Die Skriptbox ist wie eine Skript ausführen Block. Sie wählen die gewünschte Programmiersprache, die von Ihnen benötigten Optionen und das Skript selbst aus. Stellen Sie es auf / usr / bin / php, alle flüchten aus und das folgende Skript:

 Echo <<   Grundlegende HTML-Site Projektmanager icon.png   Backbone-HTML-Site Projektmanager icon.png   EOF;

Dieses PHP-Skript gibt das XML für die Ergebnisse des Skripts einfach aus. EIN Skriptfilter erwartet, dass das Skript eine gültige XML-Anweisung ausgibt, die ein Array von Elementen enthält: eine für jede Option, die dem Benutzer zur Verfügung steht.

Jeder Artikel hat eine uid, arg, gültig, und Autovervollständigung Optionen. Das uid ist eine eindeutige Nummer oder ein eindeutiger Name für diesen Artikel. Wenn es sich immer um den gleichen eindeutigen Namen für dieses Element handelt, wird der Benutzer umso mehr angezeigt, je mehr er ausgewählt wird. Das arg Dies ist, was der nächste Block erhält, wenn das Element ausgewählt wird. Das gültig Argument kann nur sein Ja oder Nein. Ob Nein, dann kann das Element nicht ausgewählt werden, sondern das Autovervollständigung Der Wert wird in der Alfred Prompt mit dem Schlüsselwort Ob Ja, dann wird eine Eingabe akzeptiert, um das Argument an den nächsten Block und an die zu senden Autovervollständigung Wert wird ignoriert.

Das Titel, Untertitel, und Symbol Durch untergeordnete Elemente jedes Elements kann das Skript den Titel, den Untertitel und das Symbol für die Anzeige der Ergebnisse für den Benutzer festlegen. Daher kann jedes Element ein anderes Symbol haben. Wenn Sie ein Unterverzeichnis in Ihrem Workflow-Bereich haben Symbole, du kannst den ... benutzen icons / day.png Pfad, um sich auf ein Bild zu beziehen day.png in diesem Unterordner. Auf diese Weise können Sie Ihre Ergebnisse für eine einfachere Auswahl personalisieren.


Skriptfilter: Anzeigen

Nun, wenn die Skriptfilter aktiviert ist, zeigen die obigen Bilder die Ergebnisse. Es führt immer noch nichts aus, außer die Auswahl an Alfred zu senden.


Skriptfilter: Hinzufügen eines Skript ausführen Block

Um auf Grundlage der Auswahl etwas zu tun, müssen Sie ein hinzufügen Skript ausführen block als nächstes und fülle es als Bash-Skript aus, ohne zu entkommen. Der Skriptbereich kann mit dem folgenden Skript gefüllt werden:

 ######################### # Contants. ######################### VPREFS = "$ HOME /Library/Caches/com.runningwithcrayons.Alfred-2/Workflow Data /" NVPREFS = "$ HOME / Library / Anwendungsunterstützung / Alfred 2 / Workflow-Daten /" ############################## ################################################ # Lesen das Bundleid aus der info.plist des Workflows ######################################## ################################### getBundleId () / usr / libexec / PlistBuddy -c " Druck: Bundleid "" info.plist " ###################################### ##################################### # # Liefert die Workflow-Daten dir ##### ################################################ getDataDir () local BUNDLEID = $ (getBundleId) echo "$ NVPREFS $ BUNDLEID" wenn [! -d "$ (getDataDir)"]; dann mkdir -p "$ (getDataDir)"; Berühren Sie "$ (getDataDir) /projectDir.txt"; fi projD = "cat" $ (getDataDir) /projectDir.txt ""; ob [ ! -d "$ projD"]; dann mkdir -p "$ projD"; fi cd "$ projD"; type = "Abfrage"; Fall "$ type" in basic) echo "Basic"; curl -o tmp.zip -L "https://codeload.github.com/h5bp/html5-boilerplate/zip/v4.3.0"; unzip tmp.zip >> / dev / null; mv html5-boilerplate-4.3.0 / *. ; rm -Rf "html5-boilerplate-4.3.0 /"; rm -Rf "tmp.zip"; echo "HTML5-Speicherplatine an Ort und Stelle."; ;; Backbone) Echo "BackBone"; curl -o tmp.zip -L "https://codeload.github.com/h5bp/html5-boilerplate/zip/v4.3.0"; unzip tmp.zip >> / dev / null; mv html5-boilerplate-4.3.0 / *. ; rm -Rf "html5-boilerplate-4.3.0 /"; rm -Rf "tmp.zip"; curl -o js / vendor / backbone-min.js -L "http://backbonejs.org/backbone-min.js"; echo "HTML5-Speicherplatine mit Backbone.js an Ort und Stelle."; ;; esac

Dieses Skript erstellt einfach den Projekttyp in dem Verzeichnis, das als Projektverzeichnis festgelegt wurde. Der erste Teil des Skripts ist genauso wie die Skripts, die im Zwischentutorial zum Zugreifen auf die beiden Stellen verwendet werden, an denen Daten gespeichert werden können. Das Datenverzeichnis und das Cache-Verzeichnis. Hier wird nur das Datenverzeichnis verwendet, um den Speicherort des Projektverzeichnisses abzurufen.

Der Rest des Skripts wechselt in das Projektverzeichnis und füllt es je nach ausgewähltem Projekttyp aus. Ein einfaches HTML-Projekt lädt die HTML5-Boilerplate-Vorlage herunter und installiert sie im Projektverzeichnis. Ein Backbone-Projekt installiert die HTML5-Boilerplate-Vorlage und die JavaScript-Bibliothek Backbone.js. Sie können dies leicht verbessern, indem Sie mit Yeoman die Projektkomponenten installieren. Dies würde jedoch den Rahmen dieses Tutorials sprengen.

Das Problem mit dem Weg dies Skriptfilter Es wurde geschrieben, dass es schwer zu erweitern und zu warten ist. Es wäre viel einfacher, eine Funktion aufzurufen, die das XML bei Bedarf erstellt. Durch Verwendung dieses Ansatzes für das Programm kann der Benutzer die Liste der möglichen Aktionen durch Eingeben nicht einschränken. Sie müssen nur die Liste nach unten verschieben oder einen Hotkey für diesen Eintrag drücken.

Da es bei Alfred darum geht, das Finden und Auswählen von Optionen zu vereinfachen, muss dies möglich sein. Dank der engagierten Programmierer, die Alfred helfen, gibt es einige Bibliotheken, die diesen Prozess wesentlich erleichtern werden.

Bibliotheken von Hilfsfunktionen

Ein Segen des Ökosystems Alfred ist, dass viele Leute Bibliotheken für ihre bevorzugte Skriptsprache entwerfen, um die Programmierung von Alfred zu erleichtern. Die vollständige Liste der Alfred-Bibliotheken finden Sie im Alfred-Forum. Es gibt Bibliotheken für Bash / Zsh (Teile, die ich in diesen Skripts verwendet habe), Python, PHP, Ruby, AppleScript und go (es wird als AppleScript-Bibliothek aufgeführt, ist jedoch für die Go-Programmiersprache von Google gedacht).!

Um die Bibliothek für PHP verwenden zu können, müssen Sie die Datei workflows.php von David Ferguson von dieser Site herunterladen. Legen Sie dies in den Workflow-Ordner. Jetzt muss dieses Skript in den PHP-Code für die geladen werden Skriptfilter. Ändern Sie diesen Code in:

 // // Laden Sie die PHP-Workflow-Bibliothek. // include_once ("workflows.php"); // // Das zu verwendende Workflow-Objekt erstellen. // $ wf = neue Workflows (); // // Holen Sie sich die unformatierte Abfrage und speichern Sie sie zur Verwendung. // $ clean = trim ("query"); // // Optionen einstellen. // $ wf-> result ("1PM", "basic", "Basic HTML Site", "Projektmanager", 'icon.png', "yes"); $ wf-> result ("2PM", "Backbone", "Backbone-HTML-Site", "Projektmanager", 'icon.png', "ja"); // // Echo der XML-Datei der Auswahlmöglichkeiten. // echo $ wf-> toxml ();

Dies ist viel einfacher zu lesen und zu verstehen. Kommentare können leicht hinzugefügt werden, um den Code für zukünftige Referenz zu erklären. Dadurch werden die gleichen Ergebnisse wie bei der bloßen XML-Liste erzielt. Jetzt ist es jedoch in einer Form, die die Erweiterung vereinfacht.

Dieses Skript wird jetzt in die Bibliothek geladen und initialisiert eine Klassenvariable, $ wf, des Arbeitsablauf() Klasse aus der Bibliothek. Das Ergebnis() Mit der Mitgliedsfunktion wird der XML-Code mit den Optionen erstellt. Die Optionen nach Reihenfolge sind: Anzahl, Argument, Titel, Untertitel, Symboldatei und gültig. Das toxml () Die Elementfunktion gibt einfach den endgültigen XML-Code zurück, der ausgegeben wird.

Nun, um das zu machen Skriptfilter Besser aussehen. Nehmen Sie die beiden Bilddateien aus der Download-Datei für dieses Lernprogramm und fügen Sie sie Ihrem Workflow-Verzeichnis hinzu. Dann ändern Sie die Stellen Sie die Optionen ein Abschnitt in der Skriptfilter Code an:

 // // Optionen einstellen. // $ wf-> result ("1PM", "basic", "Basic HTML Site", "Projektmanager", 'html5BP.jpeg', "yes"); $ wf-> result ("2PM", "Backbone", "Backbone-HTML-Site", "Projektmanager", "backbone.png", "yes");

Das für jede Auswahl verwendete Symbol steht jetzt für die Auswahl. Eine viel bessere Benutzeroberfläche. Alfred kann für die Symbole entweder JPEG- oder PNG-Grafikdateien verwenden. Die Symbole werden bei Bedarf auch neu skaliert. Die Ergebnisse sind unten gezeigt:


Projekt mit Symbolen erstellen

Wie zu sehen ist, wird zuerst die zweite Option angezeigt. Das liegt daran, dass ich es beim Testen am häufigsten verwendet habe. Alfred merkt sich, welche Auswahl am häufigsten verwendet wird, und versucht, die Liste entsprechend zu ordnen. Dies ist nützlich für Befehle, die häufiger verwendet werden.

Die Liste kann jedoch nicht eingegrenzt werden, indem Sie einen Teil des Namens eingeben. Das ist ein echtes Muss, wenn es viele Möglichkeiten gibt. Leider hat diese PHP-Bibliothek dafür keine Funktion. Daher muss eine neue Funktion definiert werden. Ändern Sie den Optionsbereich so:

 // // Optionen einstellen. // $ added = buildResult ($ wf, "$ clean", "1PM", "basic", "Basic HTML Site", "Projektmanager", 'html5BP.jpeg', "yes"); $ added + = buildResult ($ wf, "$ clean", "2PM", "Backbone", "Backbone-HTML-Site", "Projektmanager", "backbone.png", "yes"); if ($ added == 0) $ wf-> result ("999", "", "Kein Projekttyp entspricht $ clean!", "Projektmanager", 'icon.png', 'nein'); 

Das buildResult () Funktion übernimmt alles was die Ergebnis() Funktion tat, hat aber auch zwei neue Parameter: die Arbeitsablauf() Objektvariable und den zu dem Befehl passenden Text.

Fügen Sie nun die Definition der neuen Funktion direkt nach der Bibliothek hinzu:

 Funktion buildResult ($ wf, $ input, $ count, $ arg, $ title, $ Untertitel, $ icon, $ valid) $ result = 0; if (preg_match ("/.*$ Eingabe / i", "$ arg") === 1) $ wf-> Ergebnis ($ count, $ arg, $ title, $ Untertitel, $ icon, $ valid); $ result = 1;  return ($ result); 

Diese Funktion verwendet das preg_match () PHP-Funktion zum Ausführen eines regulären Ausdrucks der Zeichenfolge mit einem Platzhalter, der der Eingabezeichenfolge hinzugefügt wird. Wenn der Typ des Benutzers nicht übereinstimmt, wird das Ergebnis nicht hinzugefügt. Wenn ein Ergebnis hinzugefügt wurde, wird eine Eins zurückgegeben. Andernfalls wird eine 0 zurückgegeben.

Haben Sie den zusätzlichen Code bemerkt? Das war zu sehen, ob etwas zu den Ergebnissen hinzugefügt wurde. Wenn der Test durch nichts bestanden wurde, wurde ein Standardergebnis hinzugefügt, das besagt, dass er nichts finden konnte. Mit dem gültig Parametersatz auf Nein, Der Benutzer kann nicht die Rücktaste drücken. Dies hindert Ihren Workflow daran, den Benutzer in die Standardsuche mit allem, was im Internet gespeichert ist, auszulagern Alfred Prompt oder vom Senden von Junk zum nächsten Skript, um dies herauszufinden.


Projekttyp nicht gefunden Fehler

Bei dieser kleinen Fehlerprüfung teilt der Workflow dem Benutzer nun auf elegante Weise mit, dass ein Problem vorliegt, ohne dass ein Abbild der Standardsuche erstellt wird. Sie sollten immer über die Fehlerbehandlung in den Workflows nachdenken. Es ist wichtig für ein professionelles Aussehen und Gefühl.

Rekursives Programmieren in Alfred

Seit der Skriptfilter block ruft das Skript für jeden vom Benutzer eingegebenen Buchstaben ständig auf, es ist ein großartiger Ort für rekursive Programmierung. Am häufigsten wird die rekursive Programmierung erwähnt, wenn eine Routine sich selbst aufruft. Das ist eine direkte Rekursion. Was wird bei Alfred gemacht? Skriptfilter würde als indirekte Rekursion bezeichnet.

Zustandsmaschinen-Workflows

Die erste zu untersuchende Rekursionsart ist die Zustandsmaschine. Eine Zustandsmaschine ist ein Programm, das von einer Variablen gesteuert wird, die den Status oder die Ausführungsebene des Programms bestimmt.


Rekursion: Listen Sie das Skript-Skript für Projekte

Das Projektmanager-Workflow braucht eine Möglichkeit, Projekte zu verfolgen und bestimmte Aktionen an diesen Projekten durchzuführen. Um es zu starten, erstellen Sie eine Skriptfilter Block wie oben. Fügen Sie dieses Skript dann dem hinzu Skript Bereich:

 // // Laden Sie die PHP-Workflow-Bibliothek. // include_once ("workflows.php"); // // Funktion: buildResult // // Beschreibung: Erstellt das Ergebnis-XML bedingt, wenn die // Eingabe das Argument enthält. // Funktion buildResult ($ wf, $ input, $ count, $ arg, $ title, $ Untertitel, $ icon, $ valid, $ ret) $ result = 0; $ parts = explodieren ("|", $ arg); if (count ($ parts)> 0) $ arg = $ parts [0];  if (preg_match ("/.*$ Eingabe / i", "$ arg") === 1) $ wf-> Ergebnis ($ count, $ arg, $ title, $ Untertitel, $ icon, $ valid, $ ret); $ result = 1;  return ($ result);  // // Erstellen Sie das zu verwendende Workflow-Objekt. // $ wf = neue Workflows (); // // Holen Sie sich die unformatierte Abfrage und speichern Sie sie zur Verwendung. // $ clean = trim ("query"); // // Den Status anhand der Queue-Elemente ermitteln. // $ parts = explodieren ("|", $ clean); $ pcount = count ($ parts); $ returncount = 0; switch ($ pcount) Fall 1: // // Dies ist der Basiszustand. Hier wird eine Liste von Projekten und // die Möglichkeit zum Erstellen eines neuen Projekts aufgelistet. // // // Holen Sie sich die Projekte und listen Sie sie auf. // $ count = 0; $ dateiname = $ wf-> data (). "/projects.txt"; if (file_exists ($ filename)) $ projs = explode ("\ n", file_get_contents ($ filename)); foreach ($ projs als $ proj) $ projparts = explode (":", $ proj); if (strcmp ($ projparts [0], "")! = 0) $ returncount + = buildResult ($ wf, $ parts [0], $ count, "$ projparts [0] |", "Projekt: $ projparts [0] "," Projektmanager ", 'icon.png'," nein "," $ projparts [0] | "); $ count + = 1;  // // Geben Sie eine Option für ein neues Projekt an. // $ wf-> result ("999", "new |", "Add a new project", "Projektmanager", 'icon.png', 'no', "new |"); $ returncount + = 1; brechen; Fall 2: // // Zwei mögliche Bereiche: // Ein bestimmtes Projekt durchführen oder // ein neues Projekt erstellen. // if (strcmp ($ parts [0], "new") === 0) // // Ein neues Projekt erstellen. Hol dir den Namen. // $ wf-> result ("999", "neue | $ parts [1]"), "Projektname: $ parts [1]", "Projektmanager", 'icon.png', 'ja ', "neue | $ parts [1]"); $ returncount + = 1;  else // // Jetzt, um Aktionen für ein Projekt auszuführen. // $ count = 1; $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "entfernen | $ parts [0]", "Projekt entfernen: $ parts [0]" , "Projektmanager", "icon.png", "ja", ""); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "pow | $ parts [0]", "Add to Pow: $ parts [0] "," Projektmanager "," icon.png "," ja "," "); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "alfred | $ parts [0]", "Ansicht in Alfred: $ parts [0] "," Projektmanager "," icon.png "," ja "," "); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "current | $ parts [0]", "Aktuelles Projekt erstellen: $ parts [0] "," Projektmanager "," icon.png "," ja "," "); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "dienen | $ parts [0]", "Server in Project starten: $ parts [0]  "," Projektmanager ", 'icon.png'," ja "," ");  brechen;  If ($ returncount < 1)  $wf->Ergebnis ("999", "", "Ungültiger Status! Bitte fangen Sie von vorne an.", "Projektmanager", 'icon.png', 'nein', "");  // // Echo der XML-Datei der Auswahlmöglichkeiten. // echo $ wf-> toxml ();

Der Anfang des Skripts entspricht genau dem letzten Skript. Logik wurde hinzugefügt, um den ersten Teil eines mehrteiligen Teils beizubehalten $ arg (Mit anderen Worten, eine Zeichenfolge in der $ arg Parameter, der das hat | Symbol.) zum buildResult () Funktion.

Unmittelbar nach dem Reinigen der Eingabe von Alfred wird die Eingabe entsprechend der Aufteilung aufgeteilt | Charakter und die Anzahl der Teile ist herausgefunden. Diese Informationen geben den Status für die Statusmaschine an. Das Schaltergehäuse Anweisung wirkt auf die verschiedenen Zustände der Zustandsmaschine. In diesem Fall hat die Zustandsmaschine nur zwei Zustände.

Der erste Zustand listet die Projektnamen aus einer Liste von Projekten auf und gibt dem Benutzer die Möglichkeit, ein neues Projekt hinzuzufügen. Die Liste der Projekte wird aus der Datei erstellt projects.txt im Datenverzeichnis der Workflows. Beachten Sie, dass sehr sorgfältig darauf geachtet wird, ob die Datei vorhanden ist und ob Projekte in der Datei vorhanden sind. Ich wollte sicherstellen, dass der Workflow niemals auf die Standardsuche angewendet wird.

Der zweite Zustand prüft auf Neu Befehl in der Eingabezeile. Sie erwartet dann unabhängig von der Eingabe des Benutzers einen neuen Projektnamen. Wenn es nicht ein ist Neu Befehl, dann wird angenommen, dass es sich um den Namen eines Projekts handelt. Anschließend wird eine Liste von Aktionen erstellt, die für das Projekt ausgeführt werden können.


Rekursion: Listet Projekte in Aktion auf

Bei den so definierten Zuständen ist das obige Bild die Projektliste mit dem Hinzufügen eines neuen Projekts.


Rekursion: Projekte auflisten: Ein neues Projekt hinzufügen

Dieses Bild zeigt das neue Projekt mit einem neuen Namen.


Rekursion: Projekte auflisten: Aktionen für Projekte

Sobald die Projekte definiert sind, kann ein Projekt ausgewählt und eine Liste von Aktionen angezeigt werden, die für das Projekt ausgeführt werden können. Bei Auswahl sendet das Skript den Aktionsbefehl mit dem Namen des Projekts.

Workflows, die andere Workflows nutzen

Jetzt, da die Informationen in der Pipeline sind, müssen sie darauf reagiert werden. Füge hinzu ein Skript ausführen Block rechts die Skriptfilter Blockieren, um mit einer neuen Rekursionsform herumzuspielen: andere Workflows aufrufen!


Rekursion: Aktion für das Projekt

Diese Skript ausführen block ist ein PHP-Skript mit den oben gezeigten Parametern. Als nächstes müssen Sie dies in die Skript Bereich:

 // // Laden Sie die PHP-Workflow-Bibliothek. // include_once ("workflows.php"); // // Funktion: getProjDirectory // // Beschreibung: Diese Funktion wird verwendet, um das // bezogene Verzeichnis für das angegebene Projekt zu erhalten. // // Eingaben: // $ projname Der Name des Projekts. // function getProjDirectory ($ wf, $ projname) // // Ruft das Projektverzeichnis aus der Liste projects.txt der Projekte ab. // $ pdir = ""; $ projs = explodieren ("\ n", file_get_contents ($ wf-> data (). "/projects.txt")); foreach ($ projs als $ proj) $ projparts = explode (":", $ proj); if (strcmp ($ projparts [0], $ projname) === 0) // // Dies ist der Projektname, speichern Sie das Verzeichnis. // $ pdir = $ projparts [1];  return ($ pdir);  // // Erstellen Sie das zu verwendende Workflow-Objekt. // $ wf = neue Workflows (); // // Holen Sie sich die unformatierte Abfrage und speichern Sie sie zur Verwendung. // $ clean = trim ("query"); // // Ermitteln Sie den Status anhand der Abfrageelemente. // $ parts = explodieren ("|", $ clean); $ pcount = count ($ parts); switch ($ parts [0]) case "new": // // Eine neue Projektliste erstellen. // file_put_contents ($ wf-> data (). "/ projectName.txt", $ parts [1]); // // Rufen Sie das Verzeichnis ab, indem Sie Alfred aufrufen. // system ("osascript -e 'teilt der App \" Alfred 2.app \ "die Suche mit \) pm: setprojectdirectory \"' "); brechen; case "pow": // // Ruft das Projektverzeichnis aus der Liste projects.txt der Projekte ab. // $ pdir = getProjDirectory ($ wf, $ parts [1]); // // Erstelle den Softlink im Verzeichnis ~ / .pow. // $ home = getenv ("HOME"); if (symlink ($ pdir, "$ home / .pow / $ parts [1]")) // // Informieren Sie den Benutzer. // echo "Fügte $ parts [1] zum POW hinzu.";  else // // Etwas hat nicht funktioniert. // echo "Die symbolische Verknüpfung zu $ ​​pdir konnte nicht erstellt werden!";  brechen; case "remove": // // Liefert die Liste aller Projekte und überprüft jedes. // $ projs = explode ("\ n", file_get_contents ($ wf-> data (). "/projects.txt")); $ lines [] = ""; foreach ($ projs als $ proj) $ projparts = explode (":", $ proj); if (strcmp ($ projparts [0], $ parts [1])! = 0) // // Dies ist nicht das Projekt, das entfernt wird. Fügen Sie es zurück. // $ lines [] = $ proj;  // // Speichern Sie alle Projekte außer dem entfernten Projekt. // file_put_contents ($ wf-> data (). "/projects.txt",implode("\n",$lines))); // // Informieren Sie den Benutzer. // echo "Das Projekt $ parts [1] wurde entfernt."; brechen; case "serve": // // Rufen Sie den POW-Workflow auf, um zu sehen, dass er geliefert wird. // system ("osascript -e 'sage app \" Alfred 2.app \ "zum Suchen \" pow browse $ parts [1] \ "'"); brechen; case "alfred": // // Ruft das Projektverzeichnis aus der Liste projects.txt der Projekte ab. // $ pdir = getProjDirectory ($ wf, $ parts [1]); // // Rufen Sie das Verzeichnis ab, indem Sie Alfred aufrufen. // system ("osascript -e 'teilt der App \" Alfred 2.app \ "mit, um zu suchen \" $ pdir \ "'"); brechen; case "current": // // Ruft das Projektverzeichnis aus der projects.txt-Liste der Projekte ab. // $ pdir = getProjDirectory ($ wf, $ parts [1]); // // Setze das Verzeichnis durch Aufruf von Alfred. // file_put_contents ($ wf-> data (). "/projectDir.txt",$pdir); echo "$ parts [1] ist jetzt das aktuelle Projekt."; brechen; 

Gleich nach dem Laden der Alfred PHP Workflow-Bibliothek gibt es eine Definition für die Funktion getProjDirectory (). Diese Funktion übernimmt den Namen des Projekts und gibt das Verzeichnis für dieses Projekt zurück, wie es im gespeichert ist projects.txt Datei im Workflows-Datenverzeichnis. Da dieser Code häufig verwendet wird, lohnt es sich, ihn in eine Funktion einzufügen.

Der Rest des Codes folgt genau dem Skriptfilter, außer für den Inhalt der Schaltergehäuse Aussage. Dies ist immer noch eine Art Zustandsmaschine. Die Eingabezeile gibt den zu verarbeitenden Zustand an. Hier sind die verschiedenen Zustände: neu, pow, entfernen, dienen, alfred und aktuell. Jeder Zustand entspricht einer Aktion, die für ein Projekt ausgeführt werden soll, wie in gezeigt Skriptfilter.

Neuer Staat

Das neuer Staat dient zum Erstellen neuer Projekte in der Liste der Projekte. Es erstellt nichts, sondern setzt einen Link in das projects.txt Datei im Datenverzeichnis. Dies geschieht durch Speichern des Namens des Projekts in der Projektname.txt Datei im Datenverzeichnis und Aufruf der pm: setprojectverzeichnis in Alfred, um nach dem Verzeichnis zu suchen, das dem Projektnamen zugeordnet werden soll. Dies ist eine Art Statusrückmeldung, indem das Skript Alfred rekursiv in einem neuen Zustand aufruft (Suche nach einem neuen Token)..

Beachten Sie, wie Alfred aufgerufen wird: Der PHP-Code ruft das osascript-Programm zum Erzählen auf Alfred 2.app suchen nach pm: setprojectverzeichnis. Diese Technik ist der einfachste Weg, um etwas von Alfred anzufordern, und kann in jede Skriptsprache implementiert werden.

Das Ende des Skripts in Skript ausführen für die pm: setprojectverzeichnis Skript ausführen Block muss geändert werden in:

 if [-f "$ (getDataDir) /projectName.txt"]; dann currentName = "cat" $ (getDataDir) /projectName.txt ""; echo "$ currentName: query" >> "$ (getDataDir) /projects.txt"; rm "$ (getDataDir) /projectName.txt"; fi echo "query"> "$ (getDataDir) /projectDir.txt"; echo "Das Projektverzeichnis lautet: Abfrage";

Was dies jetzt tut, ist zu prüfen, ob der Projektname.txt Datei, wenn dieses Skript aufgerufen wird. Wenn es vorhanden ist, werden das angegebene Verzeichnis und der Projektname der Liste der Projekte in hinzugefügt projects.txt Datei und die Projektname.txt Datei wird entfernt. Wieder ist dies eine Art Zustandsmaschine, bei der die Existenz der Projektname.txt Datei definiert einen neuen Aktionsstatus für dieses Skript.

Pow-Zustand

Das pow State nutzt den POW Alfred Workflow zur Interaktion mit dem POW-Programm. Beide müssen auf dem System installiert werden, auf dem dieser Workflow ausgeführt wird. Dieser Zustand übernimmt einfach das Projektverzeichnis und den Projektnamen und erstellt einen symbolischen Link im ~ / .pow Verzeichnis. Mit dem dortigen symbolischen Link kann der POW-Workflow ihn durchsuchen und den Server danach erneut starten.

Zustand entfernen

Das Zustand entfernen übernimmt den Projektnamen und entfernt ihn aus der Liste der Projekte. Es ist dem Benutzer überlassen, das Verzeichnis zu entfernen.

Serve State

Das Staat dienen rekursiv ruft Alfred zur Verwendung der POW Alfred Workflow um den Server anzuzeigen. Das POW Das Programm prüft, ob der Server ordnungsgemäß ausgeführt wird, bevor der im Browser anzuzeigende Speicherort übergeben wird.

Alfred State

Das Alfred State rekursiv ruft Alfred das Verzeichnis des Projekts auf. Wenn Alfred mit einem absoluten Verzeichnispfad aufgerufen wird, wird dieses Verzeichnis im Alfred Browser angezeigt.

Aktuellen Zustand

Das aktuellen Zustand macht das Projektverzeichnis zum aktuellen Projekt für die Funktion zum Verschieben von Dateien, die im Zwischentutorial erstellt wurde.

Wenn alle Zustände auf diese Weise definiert sind, können Sie leicht neue Aktionen hinzufügen, um die Funktionalität dieses Workflows zu erweitern. Fügen Sie einfach den Bundesstaat hinzu Skriptfilter und die Aktion für den Staat in der Skript ausführen Block.

Fazit

Wow, das war viel zu berichten. Jetzt die Projektmanager Workflow ist nützlich und kann einfach erweitert werden. Ihre Hausaufgaben besteht darin, diese Basis zu übernehmen und weitere Funktionen hinzuzufügen! Wenn Sie zum Workflow beitragen, veröffentlichen Sie bitte Ihre Arbeit in den Kommentaren. Das Teilen von Workflows macht viel Spaß und hilft anderen dabei, von dem, was Sie getan haben, zu lernen.