org-mode代码块中的宏和使用Babel

9
受这篇优秀文章的启发,我尝试使用org-modebabel的组合来查询elasticsearch。例如,计算索引中条目的数量:
#+BEGIN_SRC sh
curl -XGET 'http://my.uri.example:8080/index/_count'
#+END_SRC

上述代码可以在块内使用 C-c C-c 进行评估。1 另一方面,可以在org文档中定义。我的问题是:是否可能定义一个宏?
#+MACRO: live-db http://my.uri.example:8080

并将代码块改写如下:

#+BEGIN_SRC sh
curl -XGET '{{{live-db}}}/index/_count'
#+END_SRC

对我来说,开箱即用时它没有起作用......看起来像是 babel 没有在块的评估之前扩展宏。有什么想法吗?

编辑

现在,一旦我知道我可以使用 es-mode,我想微调我的问题。考虑以下两个请求:

#+BEGIN_SRC es :url http://mu.uri.stage:8080
GET /users/_search?pretty
{
  "query": {
    "match_all":{}
  }
}
#+END_SRC

并且

#+BEGIN_SRC es :url http://mu.uri.live:8080
GET /users/_search?pretty
{
  "query": {
    "match_all":{}
  }
}
#+END_SRC

他们只是在URL上有所不同。我想定义两个宏:
#+MACRO staging http://my.uri.stage:8080
#+MACRO live http://my.uri.live:8080

然后将宏用作块的变量,这种做法可行吗?

1确保您启用了sh的评估。添加类似以下内容:

(org-babel-do-load-languages
 'org-babel-load-languages
 '((sh . t)))

添加到你的.emacs文件中。


关于您的第一个问题,请参见 ox.el 的 3088-3089 行: - fniessen
1
宏在 Babel 代码评估之前被展开。 - fniessen
(函数 org-export-as) - fniessen
也许这个问题应该向Org ML提问;Nicolas肯定会回答你。 - fniessen
2
@fniessen,我认为他试图执行而不是导出。无论如何,即使宏在执行babel代码之前被展开,它们也不会在源代码块内展开(请参见lisp/org-macro.el中的180-192行)。 - david-hoze
请参考Emacs SE上的这个答案,其中包含一个Elisp代码片段,可以在源代码块标题参数中添加org-macros扩展。 - Tobias
1个回答

5
宏扩展在执行代码块时不受本地支持,但是支持的Noweb引用语法更加强大。但是,我怀疑它在使用es-mode时无法工作,因为它通过头参数而不是变量传递url。这是一个sh代码块的简单示例:
#+name: staging
: http://my.uri.stage:8080

#+name: live
: http://my.uri.live:8080

#+name: test
#+begin_src sh :var url=staging
echo $url
#+end_src

#+call: test(live)

#+RESULTS:
: http://my.uri.live:8080

#+call: test(staging)

#+RESULTS:
: http://my.uri.stage:8080

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接