Org Babel peut-il enchevêtrer conditionnellement des blocs de code en fonction du type de système?

10

Edit: Même si je suis encore à apprendre les ficelles du métier de Babel, je l' ai lu sur les system-type, emacs-versionet les window-systemvariables qui sonnent comme si elles contiennent toutes les informations dont j'ai besoin pour obtenir le comportement que je viens de décrire. En fait, je pouvais simplement envelopper le code spécifique au système d'exploitation dans des conditions lorsque cela était nécessaire dans des blocs de code. Je me demande cependant si c'est la meilleure façon de procéder.


J'utilise Babel pour écrire des fichiers de configuration lettrés pour Emacs. Je voudrais que mes fichiers de configuration fonctionnent sur toutes les plates-formes que j'utilise fréquemment (donc essentiellement différentes distributions Linux et Mac), et une partie de cela implique d'avoir des paramètres qui dépendent du système (par exemple, la police par défaut que j'utilise sur mon Mac est différent de celui que j'utilise sous Linux Mint).

Bien que je sois sûr d'avoir vu des moyens de reconnaître si je suis sur un Mac en utilisant elisp (et que je pourrais donc envelopper tous les paramètres spécifiques au système dans une sorte de conditionnel basé sur cela), je me demande si Org / Babel a un moyen de détecter le type de système sur lequel je suis, ce qui me permettrait d'écrire différents blocs de code pour différents systèmes. Mieux encore, cela peut-il également être fait pour différentes versions d'Emacs? J'imagine du code qui ressemblerait à quelque chose comme ceci (avec des noms de plate-forme et d'en-tête étant des exemples artificiels)

#+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

Le gros poisson à faire frire est la plate-forme, car la version d'emacs et de l'emacsen que j'utilise peut probablement en être déduite dans la plupart des situations. Je dois mentionner que la plate-forme pourrait être plus grossière que ce que je suggère ci-dessus. (J'ai vraiment juste besoin de savoir si je suis sur une distribution Linux, Windows ou Mac.) De plus, si ce ne sont pas des fonctionnalités intégrées, comment pourrais-je créer des en-têtes de bloc de code comme ceux-ci?

Edit: Je suppose qu'il pourrait également être plus susceptible de ressembler à ce qui suit.

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

J'imagine que cela peut être trouvé quelque part dans la documentation s'il existe mais je n'arrive pas à trouver une liste complète des en-têtes pour les blocs de code. Merci pour toute l'aide que vous pourrez fournir!

Dan
la source
Voir les articles liés: emacs.stackexchange.com/questions/58149/…
mankoff

Réponses:

12

Je ne sais pas comment vous pouvez les extraire vers des en-têtes personnalisés, mais vous pouvez mettre ELISP brut dans vos arguments d'en-tête. Donc, pour enchevêtrer conditionnellement, vous pouvez simplement mettre un chèque dans votre :tangleargument comme ceci:

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

Lorsque le fichier s'emmêle et que l'expression ELISP " (eq system-type 'gnu/linux)" est vraie, il renvoie " "yes"", qui s'emmêlera au nom de fichier par défaut pour ce bloc de langue. Vous pouvez également y mettre un nom de fichier si vous le préférez. Si la condition revient nil, le bloc ne s'emmêle pas.

Certains autres types de systèmes avec lesquels vous pouvez jouer sont " windows-nt" pour certains systèmes d'exploitation Windows et " darwin" pour Mac OSX. D'autres informations système (y compris " emacs-version" comme vous l'avez mentionné) peuvent être récupérées à l'aide des variables décrites sur cette page .

Si ces arguments d'en-tête deviennent peu maniables, vous pouvez éventuellement avoir une section dans votre .emacsoù vous définissez quelques fonctions qui renvoient uniquement un nom de fichier pour des types de système spécifiques. De cette façon, vous avez simplement besoin d'un seul appel de fonction dans votre :tangle.


Pendant que j'apprends encore les ficelles de Babel, j'ai lu des informations sur les variables de type système, de version emacs et de système fenêtre, qui semblent contenir toutes les informations dont j'ai besoin pour obtenir le comportement que j'ai décrit ici . En fait, je pouvais simplement envelopper le code spécifique au système d'exploitation dans des conditions lorsque cela était nécessaire dans des blocs de code. Je me demande cependant si c'est la meilleure façon de procéder.

En ce qui concerne votre propre fichier de configuration, ce qui vous convient le mieux est la meilleure option ... Mais il existe d'autres façons d'aborder votre problème, par exemple, une autre possibilité est d'avoir quelque chose comme:

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

... en haut de votre .orgfichier, et que chaque bloc spécifique à la plate-forme ait un argument enchevêtrement qui pointe vers son fichier respectif ... Comme " :tangle windows.el" pour un morceau de code spécifique à Windows.

Une autre stratégie possible consiste à créer plusieurs .orgfichiers pour différents systèmes, et à (org-babel-load-file ...)celui de votre système en utilisant les variables ci-dessus dans un (cond ...)bloc comme celui ci-dessus. De cette façon, vous pouvez éviter toute logique d'enchevêtrement.

Une autre possibilité serait d'écrire uniquement du code indépendant de la plate-forme dans votre configuration Emacs - et de conserver des réglages spécifiques au système dans votre .emacs. (C'est comme ça que je le fais.)


J'imagine que cela peut être trouvé quelque part dans la documentation s'il existe mais je n'arrive pas à trouver une liste complète des en-têtes pour les blocs de code. Merci pour toute l'aide que vous pourrez fournir!

Il y a des arguments d'en-tête dans les fichiers d'informations Emacs. Vous pouvez y accéder avec " C-h i, "mOrg Mode"puis "mSpecific header arguments"". Il est également en ligne ici .

Il existe également des arguments d'en-tête spécifiques à la langue et d'autres informations ici. . (Qui se trouve également dans les fichiers Info.)

Archenoth
la source
1
Merci pour cette fantastique écriture. Je suis encore très nouveau dans l'utilisation d'emacs (je ne l'utilise comme éditeur principal que depuis environ un an, et très activement depuis janvier). C'était exactement le type d'exploration des différentes options que je cherchais. Je ne savais pas que les en-têtes accepteraient des élisp comme ça. Maintenant, je dois juste déterminer comment en créer des personnalisés ... au moins à long terme. Merci encore!
Dan
Pas de problème. ^^ Comme Emacs est assez largement documenté dans presque tous les aspects, vous pouvez vraiment apprendre beaucoup en explorant simplement la documentation au hasard avec les C-h <thing>cordons lorsque vous voyez quelque chose d'intéressant, ou en lisant le code d'autres personnes. Bonne chance..!
Archenoth