Bisakah Org Babel mengkondisikan blok kode secara kondisional berdasarkan tipe sistem?

10

Edit: Sementara aku masih belajar tali dari Babel, saya sudah membaca tentang system-type, emacs-versiondan window-systemvariabel, yang terdengar seperti mereka berisi semua informasi yang saya butuhkan untuk mendapatkan perilaku saya sudah dijelaskan di sini. Bahkan, saya hanya bisa membungkus kode khusus OS dalam kondisi ketika diperlukan dalam blok kode. Saya bertanya-tanya apakah ini cara terbaik untuk melakukan ini, namun.


Saya menggunakan Babel untuk menulis file konfigurasi melek untuk Emacs. Saya ingin file konfigurasi saya berfungsi pada semua platform yang sering saya gunakan (jadi pada dasarnya berbagai distro Linux dan Mac), dan bagian dari ini melibatkan pengaturan yang bergantung pada sistem (mis., Font default yang saya gunakan pada Mac saya adalah berbeda dari yang saya gunakan di Linux Mint).

Sementara saya yakin saya telah melihat cara untuk mengenali apakah saya menggunakan Mac menggunakan elisp atau tidak (dan karenanya dapat membungkus pengaturan spesifik sistem dalam beberapa jenis kondisi berdasarkan ini), saya bertanya-tanya apakah Org / Babel memiliki beberapa cara untuk mendeteksi jenis sistem yang saya gunakan yang memungkinkan saya untuk menulis blok kode yang berbeda untuk sistem yang berbeda. Lebih baik lagi, dapatkah ini dilakukan untuk versi Emacs yang berbeda? Saya membayangkan kode yang akan terlihat seperti berikut ini (dengan contoh platform dan header dibuat-buat)

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

Ikan besar untuk digoreng adalah platform, karena versi emacs dan emacsen yang saya gunakan mungkin dapat disimpulkan dari ini dalam kebanyakan situasi. Saya harus menyebutkan bahwa platform bisa lebih kasar daripada yang saya sarankan di atas. (Saya benar-benar hanya perlu tahu apakah saya menggunakan Linux, Windows, atau distribusi Mac.) Juga, jika ini bukan fitur bawaan, bagaimana saya bisa membuat header kode-blok seperti ini?

Sunting: Saya kira itu juga lebih cenderung terlihat seperti berikut ini.

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

Saya membayangkan ini dapat ditemukan di suatu tempat di dokumentasi jika ada tetapi saya tidak bisa menemukan daftar header yang komprehensif untuk blok kode. Terima kasih atas bantuan yang Anda berikan!

Dan
sumber
Lihat yang terkait: emacs.stackexchange.com/questions/58149/…
mankoff

Jawaban:

12

Saya tidak yakin bagaimana Anda bisa mengekstrak ini ke header kustom, tetapi Anda dapat memasukkan ELISP mentah dalam argumen header Anda. Jadi, untuk kusut secara kondisional, Anda cukup memberi tanda centang pada :tangleargumen Anda seperti:

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

Ketika file menjadi kusut dan ekspresi ELISP " (eq system-type 'gnu/linux)" benar, itu akan mengembalikan " "yes"", yang akan kusut ke nama file default untuk blok bahasa itu. Anda dapat meletakkan nama file di sana juga jika Anda menginginkannya. Jika kondisinya kembali nil, blok tidak kusut.

Beberapa tipe sistem lain yang dapat Anda mainkan adalah " windows-nt" untuk beberapa OS Windows dan " darwin" untuk Mac OSX. Informasi sistem lainnya (Termasuk " emacs-version" seperti yang Anda sebutkan) dapat diambil menggunakan variabel yang dijelaskan di halaman ini .

Jika argumen header ini menjadi berat, Anda mungkin dapat memiliki bagian di .emacsmana Anda mendefinisikan beberapa fungsi yang hanya mengembalikan nama file untuk tipe sistem tertentu. Dengan begitu Anda hanya perlu satu panggilan fungsi di ponsel Anda :tangle.


Sementara saya masih mempelajari tali-tali Babel, saya sudah membaca tentang tipe sistem, versi emacs, dan variabel sistem jendela, yang kedengarannya mengandung semua informasi yang saya butuhkan untuk mendapatkan perilaku yang saya jelaskan di sini . Bahkan, saya hanya bisa membungkus kode khusus OS dalam kondisi ketika diperlukan dalam blok kode. Saya bertanya-tanya apakah ini cara terbaik untuk melakukan ini, namun.

Ketika datang ke file konfigurasi Anda sendiri, apa pun yang paling nyaman bagi Anda adalah pilihan terbaik ... Tapi ada cara lain untuk mendekati masalah Anda, misalnya, kemungkinan lain adalah memiliki sesuatu seperti:

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

... di bagian atas .orgfile Anda , dan minta setiap blok spesifik platform memiliki argumen kusut yang menunjuk ke file masing-masing ... Seperti " :tangle windows.el" untuk sepotong kode khusus Windows.

Strategi lain yang mungkin adalah membuat banyak .orgfile untuk sistem yang berbeda, dan untuk (org-babel-load-file ...)yang menggunakan sistem Anda menggunakan variabel di atas dalam (cond ...)blok seperti yang di atas. Dengan cara ini Anda dapat menghindari logika kusut sama sekali.

Namun kemungkinan lain adalah dengan hanya menulis kode platform-independen dalam konfigurasi Emacs Anda - dan untuk menjaga tweak khusus sistem di komputer Anda .emacs. (Ini adalah cara saya melakukannya.)


Saya membayangkan ini dapat ditemukan di suatu tempat di dokumentasi jika ada tetapi saya tidak bisa menemukan daftar header yang komprehensif untuk blok kode. Terima kasih atas bantuan yang Anda berikan!

Ada argumen header di file info Emacs. Anda bisa sampai di sana dengan " C-h i,, "mOrg Mode"lalu "mSpecific header arguments"". Ini juga online di sini .

Ada juga argumen tajuk khusus bahasa dan informasi lainnya di sini. . (Yang juga ada di file Info.)

Archenoth
sumber
1
Terima kasih atas penulisan yang fantastis ini. Saya masih sangat baru menggunakan emacs (hanya menggunakannya sebagai editor utama saya selama setahun atau lebih, dan benar-benar aktif sejak Januari). Ini persis jenis eksplorasi opsi yang berbeda yang saya cari. Saya tidak tahu bahwa header akan menerima elisp seperti itu. Sekarang saya hanya perlu menentukan cara membuat yang kustom ... setidaknya dalam jangka panjang. Terima kasih lagi!
Dan
Tidak masalah. ^^ Karena Emacs cukup banyak didokumentasikan di hampir setiap aspek, Anda dapat benar-benar belajar banyak dengan hanya menjelajahi dokumentasi secara acak dengan C-h <thing>kabel ketika Anda melihat sesuatu yang menarik, atau dengan membaca kode orang lain. Semoga berhasil..!
Archenoth