Org Babel può aggrovigliare condizionalmente blocchi di codice in base al tipo di sistema?


10

Edit: Mentre sto ancora imparando le corde di Babel, ho letto sui system-type, emacs-versione window-systemvariabili, che suonano come essi contengono tutte le informazioni che mi servono per ottenere il comportamento che ho descritto qui. In effetti, potrei semplicemente racchiudere il codice specifico del sistema operativo in condizionali quando necessario in blocchi di codice. Mi chiedo se questo sia il modo migliore per farlo, comunque.


Sto usando Babel per scrivere file di configurazione per Emacs. Vorrei che i miei file di configurazione funzionassero su tutte le piattaforme che utilizzo frequentemente (quindi sostanzialmente varie distribuzioni Linux e Mac), e parte di ciò implica avere impostazioni che dipendono dal sistema (ad esempio, il carattere predefinito che uso sul mio Mac è diverso da quello che uso su Linux Mint).

Mentre sono sicuro di aver visto modi per riconoscere se sono su un Mac usando elisp (e quindi potrei avvolgere qualsiasi impostazione specifica del sistema in un qualche tipo di condizionale basato su questo), mi chiedo se Org / Babel ha un modo per rilevare il tipo di sistema su cui mi trovo che mi consentirebbe di scrivere blocchi di codice diversi per sistemi diversi. Meglio ancora, questo può essere fatto anche per diverse versioni di Emacs? Sto immaginando un codice che assomiglierebbe al seguente (con i nomi di piattaforma e intestazione che sono esempi inventati)

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

Il grande pesce da friggere è la piattaforma, dal momento che la versione di emacs e di emacsen che utilizzo possono probabilmente essere dedotte da questo nella maggior parte delle situazioni. Devo dire che la piattaforma potrebbe essere più grossolana di quanto suggerisco sopra. (Devo solo sapere se sono su una distribuzione Linux, Windows o Mac.) Inoltre, se queste non sono funzionalità integrate, come potrei fare per creare intestazioni a blocchi di codice come queste?

Modifica: suppongo che potrebbe anche essere più probabile che assomigli a qualcosa del seguente.

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

Immagino che questo possa essere trovato da qualche parte nella documentazione se esiste, ma non riesco a trovare un elenco completo di intestazioni per blocchi di codice. Grazie per tutto l'aiuto che potete fornire!


Risposte:


12

Non sono sicuro di come poterli estrarre nelle intestazioni personalizzate, ma puoi inserire ELISP non elaborato negli argomenti dell'intestazione. Quindi, per aggrovigliare condizionalmente, puoi semplicemente mettere un segno di spunta nel tuo :tangleargomento in questo modo:

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

Quando il file viene aggrovigliato e l'espressione ELISP " (eq system-type 'gnu/linux)" è vera, restituirà " "yes"", che si aggroviglia al nome file predefinito per quel blocco di lingue. Puoi anche inserire un nome file, se lo preferisci. Se la condizione ritorna nil, il blocco non si aggroviglia.

Alcuni altri tipi di sistema con cui puoi giocare sono " windows-nt" per alcuni sistemi operativi Windows e " darwin" per Mac OSX. Altre informazioni di sistema (incluso " emacs-version" come hai menzionato) possono essere recuperate utilizzando le variabili descritte in questa pagina .

Se questi argomenti dell'intestazione diventano ingombranti, è possibile avere una sezione nella .emacsquale definire alcune funzioni che restituiscono solo un nome file per tipi di sistema specifici. In questo modo hai semplicemente bisogno di una singola chiamata di funzione nel tuo :tangle.


Mentre sto ancora imparando le corde di Babele, ho letto delle variabili di tipo sistema, versione emacs e finestra-sistema, che sembrano contenere tutte le informazioni di cui ho bisogno per ottenere il comportamento che ho descritto qui . In effetti, potrei semplicemente racchiudere il codice specifico del sistema operativo in condizionali quando necessario in blocchi di codice. Mi chiedo se questo sia il modo migliore per farlo, comunque.

Quando si tratta del tuo file di configurazione, qualunque sia la cosa più comoda per te è l'opzione migliore ... Ma ci sono altri modi per affrontare il tuo problema, ad esempio un'altra possibilità è avere qualcosa come:

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

... nella parte superiore del tuo .orgfile e ogni blocco specifico della piattaforma ha un argomento groviglio che punta al rispettivo file ... Come " :tangle windows.el" per un pezzo di codice specifico di Windows.

Un'altra possibile strategia è quella di creare più .orgfile per sistemi diversi e (org-babel-load-file ...)quello per il tuo sistema usando le variabili sopra in un (cond ...)blocco come quello sopra. In questo modo puoi evitare qualsiasi logica aggrovigliata del tutto.

Un'altra possibilità sarebbe quella di scrivere solo codice indipendente dalla piattaforma nella tua configurazione di Emacs e mantenere delle modifiche specifiche del sistema nella tua .emacs. (Questo è il modo in cui lo faccio.)


Immagino che questo possa essere trovato da qualche parte nella documentazione se esiste, ma non riesco a trovare un elenco completo di intestazioni per blocchi di codice. Grazie per tutto l'aiuto che potete fornire!

Ci sono argomenti di intestazione nei file di informazioni di Emacs. Si può arrivare con " e poi ". È anche online qui .C-h i"mOrg Mode""mSpecific header arguments"

Ci sono anche argomenti di intestazione specifici della lingua e altre informazioni qui. . (Che è anche nei file di informazioni.)


1
Grazie per questo fantastico commento. Sono ancora molto nuovo nell'uso di emacs (lo uso come editor principale da circa un anno e molto attivamente da gennaio). Questo era esattamente il tipo di esplorazione delle diverse opzioni che stavo cercando. Non avevo idea che le intestazioni avrebbero accettato gli elisp in quel modo. Ora ho solo bisogno di determinare come crearne di personalizzati ... almeno nel lungo periodo. Grazie ancora!
Dan

Nessun problema. ^^ Dato che Emacs è abbastanza pesantemente documentato in quasi tutti gli aspetti, puoi davvero imparare molto semplicemente esplorando la documentazione a caso con i C-h <thing>cavi quando vedi qualcosa di interessante o leggendo il codice di altre persone. In bocca al lupo..!
Archenoth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.