OS X: Festlegen eines benutzerdefinierten Befehlszeilenaufrufs des Programms als Anwendung zum Öffnen von Dateien per Doppelklick

Ich bin hauptsächlich ein Linux-Benutzer, der kürzlich ein MacBook Air erworben hat, und ich versuche derzeit verzweifelt herauszufinden, ob es ein Äquivalent für die Desktop-Definitionsdateien von Linux gibt, in denen Sie eine Anwendung durch ihren Befehlszeilenaufruf definieren können, mit einem optionalen Platzhalter für die Datei, die X11 an sie übergibt, wenn auf eine Datei des Dateityps, die dieser Anwendung zugeordnet ist, doppelgeklickt wird.

Unter Linux kann ich beispielsweise festlegen, .txtdass Dateien mit einem bestimmten Befehlszeilenaufruf wie emacsclientfolgt geöffnet werden:

emacsclient -c -a "" %f

wo %fist der Platzhalter, der durch den Pfad zu der eigentlichen Datei ersetzt wird, auf die Sie doppelklicken. (Im Allgemeinen erlauben Ihnen Linux-Dateimanager, diese Befehlszeile im Fenster „Dateiinfo“ anzugeben.)

Gibt es eine einfache Möglichkeit, dies unter OS X zu erreichen? Ich habe versucht, mit AppleScript und Google nach einer Lösung zu basteln, aber ohne Erfolg. Ich muss wahrscheinlich noch mein Wissen und mein Vokabular über Apple-Technologie aufbauen, um die richtigen Fragen mit den richtigen Worten stellen zu können -- also bitte haben Sie Geduld mit mir ...

Welchen Befehl möchten Sie auf die Datei anwenden?
Möchten Sie eine bestimmte Datei oder alle Dateien mit einem bestimmten Suffix bearbeiten ?
Wenn ich im Finder auf eine Datei doppelklicke, möchte ich, dass die angegebene Befehlszeile mit der doppelt angeklickten Datei als Argument ausgeführt wird. Wenn ich zB foo.txtin meinen Home-Ordner klicke, möchte ich emacsclient -c -a "" ~/foo.txtausgeführt werden. Aber ich glaube, ich habe eine Lösung gefunden, mit der ich zufrieden bin, Automator-Workflows zu verwenden (siehe meinen zweiten Kommentar zu Stephen S' Antwort) - abgesehen von diesem lästigen drehenden Zahnrad, das auf einen laufenden Workflow in der Ablage hinweist. Trotzdem danke!
Übrigens, wenn Sie ein Shell-Skript mit einem benutzerdefinierten URL-Schema verknüpfen möchten, werfen Sie einen Blick auf Lincastor

Antworten (2)

AppleScript ist dein Freund.

Erstellen Sie im  AppleScript-Editor ein neues Skript mit dem folgenden Quellcode:

(* This script is destined to be saved as an application droplet. It will process the items dropped onto it. *)

-- This routine processes the dropped item(s)
on open theDroppedItems
  repeat with i from 1 to the count of theDroppedItems
    set aDroppedItem to item i of theDroppedItems
    processItem(aDroppedItem)
  end repeat
end open

-- This routine processes an item
on processItem(anItemToProcess)
  set pathUnix to POSIX path of anItemToProcess
  set pathUnixQuoted to quoted form of pathUnix
  -- Here you make your shell command !
  set commandToRun to "cat " & pathUnixQuoted
  do shell script commandToRun
end processItem

Passen Sie für den Shell-Befehl die commandToRunIhren Wünschen an.

Speichern Sie das Skript. Im Speichern  -Dialog:

  • Benennen Sie das Skript  OpenItems .
  • Platzieren Sie das Skript an einer beliebigen Stelle ; Sie können das Skript beispielsweise in  /Applications platzieren .
  • Wählen Sie das Format:  Bewerbung .
  • Lassen Sie die beiden Kontrollkästchen deaktiviert.

Sehen Sie sich im Quellcode die Konstruktion an  on open theDroppedItems. Diese Art von AppleScript wird als Droplet bezeichnet . Sehen Sie sich das Symbol der Anwendung  OpenItems an , die Sie gespeichert haben. Der große Pfeil darauf zeigt, dass es sich um ein Tröpfchen handelt. Das bedeutet, dass die Anwendung darauf abgelegte Gegenstände akzeptiert.

Ziehen Sie nun die gewünschte Datei per Drag-and-Drop auf die Anwendung  OpenItems . Dadurch wird der Befehl mit Ihrer Datei gestartet.

Der nächste Schritt besteht darin, die Datei(en) mit dem Droplet zu verknüpfen. Wählen Sie die gewünschte Datei aus und drücken Sie  Apple I (   I ), um Informationen zu erhalten. Wählen Sie unter  Öffnen mit die Anwendung  OpenItems aus . Dadurch wird die Datei mit dem Droplet verknüpft. Wenn Sie also auf die Datei doppelklicken, wird die Datei mit dem Droplet  OpenItems geöffnet und der Shell-Befehl für die Datei wird ausgeführt. Wenn Sie dies für alle Dateien des gleichen Typs wünschen, klicken Sie auf die Schaltfläche  Alle ändern…

Ich habe diese Lösung auf Mavericks getestet. Es klappt.

Danke für das ausführlich ausgearbeitete Beispiel in AppleScript, es hat mir auf jeden Fall geholfen meinen Horizont zu erweitern (kannte vorher nichts von Droplets)! Ich habe bereits eine etwas andere Lösung mit Automator-Workflows, aber diese ist möglicherweise sauberer/einfacher, also werde ich sie auch untersuchen.

Meines Wissens gibt es nichts, um ein Skript automatisch mit Doppelskript auszuführen (ich liege höchstwahrscheinlich falsch). Die beste Lösung, die ich gefunden habe, ist Automator. Es ist vorinstalliert. Sie möchten einen Dienst erstellen, der Skripte in einem Kontextmenü platziert (Rechtsklick auf Datei). Für Ihre Aktionen möchten Sie die Aktion „Run Shell Script“ finden. Von dort aus können Sie Eingaben vom Finder erhalten, z. B. Dateipfade und Verzeichnispfade. Wenn Sie die Eingabe an übergeben stdin, ist die Variable, die Sie im Shell-Skript verwenden $@, .

if [[ ! -d "$@" ]]
then
    emacsclient -c -a "" $@;
    exit
fi

Ich weiß nicht, ob dieses Skript ganz korrekt ist, aber es sollte Sie auf die richtige Spur bringen.

Danke, das ist meilenweit näher, als ich je gekommen bin! Trotzdem werde ich etwas warten, bevor ich die Antwort als akzeptiert markiere, um zu sehen, ob jemand eine Lösung wie ursprünglich skizziert findet. Ich würde gerne upvoten, aber leider habe ich nicht genug Repräsentanten ... :(
Eigentlich warst du ganz nah dran! Ich habe es geschafft, eine Lösung mit Automator und Run Shell Script zusammenzuschustern, aber den Workflow als Anwendung mit der Option „Eingabe übergeben: Als Argumente“ zu speichern, wie in der Antwort auf diesen Beitrag beschrieben . Möchten Sie dies zu Ihrer Lösung hinzufügen, damit ich es als akzeptiert markieren kann? Wenn Sie dies nicht tun, werde ich eine eigene Antwort zusammen mit dem Link veröffentlichen.