Editar: Si bien todavía estoy aprendiendo las cuerdas de Babel, he leído acerca de los system-type
, emacs-version
y window-system
variables, 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!
Respuestas:
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
:tangle
argumento de la siguiente manera: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 regresanil
, 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
.emacs
que 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
.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:
... en la parte superior de su
.org
archivo, 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
.org
archivos 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).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).
fuente
C-h <thing>
cables cuando ves algo interesante o leyendo el código de otras personas. Buena suerte..!