Kann Org Babel Codeblöcke basierend auf dem Systemtyp bedingt verwickeln?


10

Bearbeiten: Während ich noch die Seile von Babel lerne, habe ich über die system-type, emacs-versionund window-systemVariablen gelesen , die so klingen, als ob sie alle Informationen enthalten, die ich brauche, um das hier beschriebene Verhalten zu erhalten. Tatsächlich könnte ich OS-spezifischen Code bei Bedarf einfach in Codeblöcke einschließen. Ich frage mich jedoch, ob dies der beste Weg ist, dies zu tun.


Ich verwende Babel, um Konfigurationsdateien für Emacs zu schreiben. Ich möchte, dass meine Konfigurationsdateien auf allen Plattformen funktionieren, die ich häufig verwende (also im Grunde verschiedene Linux-Distributionen und Macs), und ein Teil davon beinhaltet Einstellungen, die vom System abhängen (z. B. die Standardschriftart, die ich auf meinem Mac verwende anders als die, die ich unter Linux Mint verwende).

Ich bin mir zwar sicher, dass ich Möglichkeiten gefunden habe, um zu erkennen, ob ich mit elisp auf einem Mac bin oder nicht (und daher systemspezifische Einstellungen in eine darauf basierende Bedingung einschließen könnte), aber ich frage mich, ob Org / Babel hat eine Möglichkeit, den Systemtyp zu erkennen, auf dem ich mich befinde, um verschiedene Codeblöcke für verschiedene Systeme zu schreiben. Besser noch, kann dies auch für verschiedene Versionen von Emacs durchgeführt werden? Ich stelle mir Code vor, der ungefähr so ​​aussehen würde (wobei Plattform- und Headernamen erfundene Beispiele sind).

#+Platform: LinuxMint
#+Emacs: GNU Emacs
#+EmacsVersion: 24+
#+BEGIN_SOURCE EMACS-LISP
    [Some configuration for Linux Mint and GNU Emacs 24+]
#+END_SOURCE

#+Platform: LinuxMint
#+Emacs: GNU Emacs
#+EmacsVersion: 22.1
#+BEGIN_SOURCE EMACS-LISP
    [Some other configuration for Linux Mint and GNU Emacs 22.1]
#+END_SOURCE

#+Platform: Mac
#+Emacs: Aquamacs
#+EmacsVersion: 24+
#+BEGIN_SOURCE EMACS-LISP
    [Some other configuration for Mac and Emacs 24+]
#+END_SOURCE

Der große Fisch zum Braten ist die Plattform, da die Version von Emacs und das von mir verwendete Emacsen wahrscheinlich in den meisten Situationen daraus abgeleitet werden können. Ich sollte erwähnen, dass die Plattform gröber sein könnte als das, was ich oben vorschlage. (Ich muss wirklich nur wissen, ob ich eine Linux-, Windows- oder Mac-Distribution verwende.) Wenn diese Funktionen nicht integriert sind, wie würde ich dann Codeblock-Header wie diese erstellen?

Bearbeiten: Ich nehme an, es könnte auch wahrscheinlicher sein, dass es ungefähr so ​​aussieht.

#+BEGIN_SOURCE EMACS-LISP :os Linux :emacs GNU :emacs-version 24+
    [Some configuration for Linux and GNU Emacs 24+]
#+END_SOURCE

Ich stelle mir vor, dass dies irgendwo in der Dokumentation zu finden ist, wenn es existiert, aber ich konnte anscheinend keine umfassende Liste von Headern für Codeblöcke finden. Vielen Dank für jede Hilfe, die Sie leisten können!


Antworten:


12

Ich bin nicht sicher, wie Sie diese in benutzerdefinierte Header extrahieren können, aber Sie können rohes ELISP in Ihre Header-Argumente einfügen. Um sich bedingt zu verheddern, können Sie Ihr :tangleArgument einfach wie folgt überprüfen :

#+BEGIN_SRC emacs-lisp :tangle (when (eq system-type 'gnu/linux) "yes")
 (princ "I DO THINGS! (But only on Linux.)")
#+END_SRC

Wenn sich die Datei verheddert und der ELISP-Ausdruck " (eq system-type 'gnu/linux)" wahr ist, wird " "yes"" zurückgegeben, wodurch der Standarddateiname für diesen Sprachblock verwirrt wird. Sie können dort auch einen Dateinamen eingeben, wenn Sie dies bevorzugen. Wenn die Bedingung zurückkehrt nil, verwickelt sich der Block nicht.

Einige andere Systemtypen, mit denen Sie windows-ntherumspielen können, sind " " für einige Windows-Betriebssysteme und " darwin" für Mac OS X. Andere Systeminformationen (einschließlich " emacs-version", wie Sie erwähnt haben) können mithilfe der auf dieser Seite beschriebenen Variablen abgerufen werden .

Wenn diese Header-Argumente unhandlich werden, können Sie möglicherweise einen Abschnitt in Ihrem haben, in .emacsdem Sie einige Funktionen definieren, die nur einen Dateinamen für bestimmte Systemtypen zurückgeben. Auf diese Weise benötigen Sie einfach einen einzelnen Funktionsaufruf in Ihrem :tangle.


Während ich noch die Seile von Babel lerne, habe ich etwas über die Variablen Systemtyp, Emacs-Version und Fenstersystem gelesen, die so klingen, als ob sie alle Informationen enthalten, die ich brauche, um das hier beschriebene Verhalten zu erhalten . Tatsächlich könnte ich OS-spezifischen Code bei Bedarf einfach in Codeblöcke einschließen. Ich frage mich jedoch, ob dies der beste Weg ist, dies zu tun.

Wenn es um Ihre eigene Konfigurationsdatei geht, ist das, was für Sie am bequemsten ist, die beste Option ... Es gibt jedoch auch andere Möglichkeiten, um Ihr Problem anzugehen. Eine andere Möglichkeit besteht darin, Folgendes zu haben:

(cond
 ((eq system-type 'gnu-linux)
  (load "linux.el"))
 ((eq system-type 'darwin)
  (load "mac.el"))
 ((eq system-type 'windows-nt)
  (load "windows.el")))

... oben in Ihrer .orgDatei und für jeden plattformspezifischen Block ein Tangle-Argument, das auf die jeweilige Datei verweist ... Wie " :tangle windows.el" für einen Windows-spezifischen Code.

Eine andere mögliche Strategie besteht darin, mehrere .orgDateien für verschiedene Systeme und (org-babel-load-file ...)für Ihr System unter Verwendung der oben genannten Variablen in einem (cond ...)Block wie dem oben genannten zu erstellen . Auf diese Weise können Sie jegliche Verwicklungslogik ganz vermeiden.

Eine weitere Möglichkeit wäre, nur plattformunabhängigen Code in Ihre Emacs-Konfiguration zu schreiben - und systemspezifische Optimierungen in Ihrer zu behalten .emacs. (So ​​mache ich das.)


Ich stelle mir vor, dass dies irgendwo in der Dokumentation zu finden ist, wenn es existiert, aber ich konnte anscheinend keine umfassende Liste von Headern für Codeblöcke finden. Vielen Dank für jede Hilfe, die Sie leisten können!

Die Emacs-Infodateien enthalten Header-Argumente. Man kann es mit „ und dann “. Es ist auch online hier .C-h i"mOrg Mode""mSpecific header arguments"

Hier finden Sie auch sprachspezifische Header-Argumente und andere Informationen . . (Welches ist auch in den Info-Dateien.)


1
Vielen Dank für dieses fantastische Schreiben. Ich bin noch sehr neu in der Verwendung von Emacs (benutze es erst seit ungefähr einem Jahr als Haupteditor und seit Januar sehr aktiv). Dies war genau die Art der Erkundung verschiedener Optionen, nach denen ich gesucht habe. Ich hatte keine Ahnung, dass Header solche Elisp akzeptieren würden. Jetzt muss ich nur noch festlegen, wie benutzerdefinierte erstellt werden sollen ... zumindest auf lange Sicht. Danke noch einmal!
Dan

Kein Problem. ^^ Da Emacs in fast allen Aspekten ziemlich stark dokumentiert ist, können Sie wirklich viel lernen, indem Sie entweder die Dokumentation zufällig mit den C-h <thing>Kabeln untersuchen, wenn Sie etwas Interessantes sehen, oder indem Sie den Code anderer Leute lesen. Viel Glück..!
Archenoth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.