Org Babelは、システムタイプに基づいて条件付きでコードブロックをもつれさせることができますか?


10

編集:私はまだバベルのロープを学んでいる間、私は約読んだsystem-typeemacs-versionwindow-system彼らは私がここで述べてきた動作を取得するために必要なすべての情報が含まれているような音の変数、。実際、必要に応じて、コードブロックでOS固有のコードを条件付きでラップすることもできます。しかし、これがこれに取り組む最善の方法であるかどうか疑問に思っています。


私はBabelを使用してEmacsの読み書き可能な設定ファイルを作成しています。私が頻繁に使用するすべてのプラットフォーム(基本的にはさまざまなLinuxディストリビューションやMac)で設定ファイルを機能させたいのですが、その一部にはシステムに依存する設定が含まれます(たとえば、Macで使用するデフォルトのフォントはLinux Mintで使用しているものとは異なります)。

私がelispを使用してMacを使用しているかどうかを確認する方法を見たのは確かです(したがって、システム固有の設定をこれに基づいて何らかの条件でラップすることができます)が、Org / Babelには、自分が使用しているシステムのタイプを検出する方法がいくつかあります。これにより、システムごとに異なるコードブロックを記述できます。さらに良いことに、これはEmacsの異なるバージョンでも実行できますか?私は次のようなコードを想定しています(プラットフォーム名とヘッダー名は意図的な例です)

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

揚げる大きな魚はプラットフォームです。私が使用しているemacsとemacsenのバージョンは、ほとんどの状況でこれから推測できるためです。プラットフォームは、上記で提案したものよりも粗くなる可能性があることを述べておかなければなりません。(私がLinux、Windows、またはMacディストリビューションを使用しているかどうかを本当に知る必要があるだけです。)また、これらが組み込み機能ではない場合、このようなコードブロックヘッダーを作成するにはどうすればよいですか?

編集:次のようになる可能性も高いと思います。

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

これが存在する場合、ドキュメントのどこかにあると思いますが、コードブロックのヘッダーの包括的なリストを見つけることができなかったようです。あなたが提供できる助けをありがとう!


:関連参照してくださいemacs.stackexchange.com/questions/58149/...
mankoffを

回答:


12

これらをカスタムヘッダーに抽出する方法はわかりませんが、生のELISPをヘッダー引数に含めることができます。したがって、条件付きでもつれるには、次の:tangleように引数にチェックを入れるだけです。

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

ファイルが絡まり、ELISP式「(eq system-type 'gnu/linux)」がtrueの場合、「"yes"」が返され、その言語ブロックのデフォルトのファイル名に絡みます。必要に応じて、そこにファイル名を入れることもできます。条件がを返したnil場合、ブロックは絡まりません。

あなたが試してみることができる他のいくつかのシステムタイプはwindows-nt、いくつかのWindows OSの場合は " darwin"、Mac OSXの場合は" "です。このページでemacs-version説明されている変数を使用して、その他のシステム情報(「」を含む)を取得できます

これらのヘッダー引数が扱いにくくなる場合は、.emacs特定のシステムタイプのファイル名のみを返すいくつかの関数を定義するセクションを含めることができます。そうすれば、で単一の関数呼び出しが必要になります:tangle


私はまだBabelのロープを学習していますが、ここで説明した動作を取得するために必要なすべての情報が含まれているように聞こえる、システムタイプ、emacsバージョン、およびウィンドウシステム変数について読みました。実際、必要に応じて、コードブロックでOS固有のコードを条件付きでラップすることもできます。しかし、これがこれに取り組む最善の方法であるかどうか疑問に思っています。

あなた自身の設定ファイルに関しては、あなたにとって最も快適なものが最善のオプションです...しかし、あなたの問題に取り組む他の方法があります、例えば、別の可能性は次のようなものを持つことです:

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

... .orgファイルの先頭にあり、各プラットフォーム固有のブロックに、それぞれのファイルを指すもつれ引数があります... :tangle windows.elWindows固有のコードの場合は" "のようにします。

別の可能な戦略は.org、異なるシステム用に複数のファイルを作成(org-babel-load-file ...)し、上記の(cond ...)ようなブロックで上記の変数を使用してシステム用のファイルを作成することです。このようにして、複雑なロジックを完全に回避できます。

さらに別の可能性は、プラットフォームに依存しないコードのみをEmacs構成に記述し、システム固有の調整をに保持すること.emacsです。(これが私のやり方です。)


これが存在する場合、ドキュメントのどこかにあると思いますが、コードブロックのヘッダーの包括的なリストを見つけることができなかったようです。あなたが提供できる助けをありがとう!

Emacs情報ファイルにはヘッダー引数があります。あなたは「とそこに着くことができC-h i"mOrg Mode"その後、および"mSpecific header arguments"」。こちらもオンラインです

言語固有のヘッダー引数やその他の情報もここにあります。。(これはInfoファイルにも含まれています。)


1
この素晴らしい記事を書いてくれてありがとう。私はまだemacsを使用するのが非常に新しいです(1年間ほどメインのエディターとしてのみ使用しており、1月から本当に積極的に使用しています)。これはまさに私が探していたさまざまなオプションの探求のタイプでした。ヘッダーがそのようなelispを受け入れるとは思いもしませんでした。今、私はカスタムのものを作成する方法を決定する必要があります...少なくとも長期的には。再度、感謝します!
Dan、

問題ありません。^^ Emacsはほぼすべての面でかなり文書化されているので、C-h <thing>興味深いものを見つけたときにコードを使ってランダムに文書を探索するか、他の人のコードを読むことで、多くを学ぶことができます。幸運を..!
Archenoth、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.