¿Puede Org Babel enredar condicionalmente bloques de código basados ​​en el tipo de sistema?

10

Editar: Si bien todavía estoy aprendiendo las cuerdas de Babel, he leído acerca de los system-type, emacs-versiony window-systemvariables, que suenan como si contienen toda la información que necesito para obtener el comportamiento que he descrito aquí. De hecho, podría envolver el código específico del sistema operativo en condicionales cuando sea necesario en bloques de código. Sin embargo, me pregunto si esta es la mejor manera de hacerlo.


Estoy usando Babel para escribir archivos de configuración alfabetizados para Emacs. Me gustaría que mis archivos de configuración funcionen en todas las plataformas que uso con frecuencia (básicamente, varias distribuciones de Linux y Mac), y parte de esto implica tener configuraciones que dependen del sistema (por ejemplo, la fuente predeterminada que uso en mi Mac es diferente al que uso en Linux Mint).

Si bien estoy seguro de que he visto formas de reconocer si estoy o no en una Mac usando elisp (y, por lo tanto, podría envolver cualquier configuración específica del sistema en algún tipo de condicional basado en esto), me pregunto si Org / Babel tiene alguna forma de detectar el tipo de sistema en el que estoy, lo que me permitiría escribir diferentes bloques de código para diferentes sistemas. Mejor aún, ¿se puede hacer esto también para diferentes versiones de Emacs? Estoy imaginando un código que se parecería a lo siguiente (con ejemplos de plataforma y encabezados como ejemplos)

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

El gran pez para freír es la plataforma, ya que la versión de emacs y el emacsen que uso probablemente se pueden inferir de esto en la mayoría de las situaciones. Debo mencionar que la plataforma podría ser más gruesa de lo que sugiero anteriormente. (Realmente solo necesito saber si estoy en una distribución de Linux, Windows o Mac). Además, si estas no son características integradas, ¿cómo haría para crear encabezados de bloque de código como estos?

Editar: supongo que también podría ser más probable que se parezca a lo siguiente.

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

Me imagino que esto se puede encontrar en algún lugar de la documentación si existe, pero parece que no puedo encontrar una lista completa de encabezados para bloques de código. ¡Gracias por cualquier ayuda que usted nos pueda proporcionar!

Dan
fuente

Respuestas:

12

No estoy seguro de cómo podría extraerlos en los encabezados personalizados, pero puede colocar ELISP sin formato en los argumentos de su encabezado. Entonces, para enredar condicionalmente, simplemente puede poner un cheque en su :tangleargumento de la siguiente manera:

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

Cuando el archivo se enreda y la expresión ELISP " (eq system-type 'gnu/linux)" es verdadera, devolverá " "yes"", que se enredará con el nombre de archivo predeterminado para ese bloque de idioma. También puede poner un nombre de archivo allí si lo prefiere. Si la condición regresa nil, el bloque no se enreda.

Algunos otros tipos de sistemas con los que puede jugar son " windows-nt" para algunos sistemas operativos Windows y " darwin" para Mac OSX. Se puede obtener otra información del sistema (incluyendo " emacs-version" como usted mencionó) usando las variables descritas en esta página .

Si estos argumentos de encabezado se vuelven difíciles de manejar, es posible que tenga una sección en la .emacsque defina algunas funciones que solo devuelven un nombre de archivo para tipos de sistema específicos. De esa manera, simplemente necesita una llamada de función única en su :tangle.


Mientras todavía estoy aprendiendo las cuerdas de Babel, he leído sobre las variables de tipo de sistema, versión de emacs y sistema de ventanas, que parecen contener toda la información que necesito para obtener el comportamiento que describí aquí. . De hecho, podría envolver el código específico del sistema operativo en condicionales cuando sea necesario en bloques de código. Sin embargo, me pregunto si esta es la mejor manera de hacerlo.

Cuando se trata de su propio archivo de configuración, lo que sea más cómodo para usted es la mejor opción ... Pero hay otras formas de abordar su problema, por ejemplo, otra posibilidad es tener algo como:

(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 la parte superior de su .orgarchivo, y haga que cada bloque específico de la plataforma tenga un argumento enredado que apunte a su archivo respectivo ... Como " :tangle windows.el" para un fragmento de código específico de Windows.

Otra estrategia posible es crear múltiples .orgarchivos para diferentes sistemas, y para (org-babel-load-file ...)el sistema usando las variables anteriores en un (cond ...)bloque como el anterior. De esta manera, puede evitar cualquier lógica de enredo.

Otra posibilidad sería escribir solo código independiente de la plataforma en su configuración de Emacs y mantener ajustes específicos del sistema en su .emacs. (Esta es la forma en que lo hago).


Me imagino que esto se puede encontrar en algún lugar de la documentación si existe, pero parece que no puedo encontrar una lista completa de encabezados para bloques de código. ¡Gracias por cualquier ayuda que usted nos pueda proporcionar!

Hay argumentos de encabezado en los archivos de información de Emacs. Se puede llegar con " y después ". También está en línea aquí .C-h i"mOrg Mode""mSpecific header arguments"

También hay argumentos de encabezado específicos del idioma y otra información aquí. . (Que también está en los archivos de información).

Archenoth
fuente
1
Gracias por este fantástico artículo. Todavía soy muy nuevo en el uso de emacs (solo lo he usado como mi editor principal durante un año más o menos, y de manera muy activa desde enero). Este era exactamente el tipo de exploración de las diferentes opciones que estaba buscando. No tenía idea de que los encabezados aceptarían elisp así. Ahora solo necesito determinar cómo crear unos personalizados ... al menos a largo plazo. ¡Gracias de nuevo!
Dan
No hay problema. ^^ Dado que Emacs está bastante documentado en casi todos los aspectos, realmente puedes aprender mucho simplemente explorando la documentación al azar con los C-h <thing>cables cuando ves algo interesante o leyendo el código de otras personas. Buena suerte..!
Archenoth