2014-07-23 20 views
5

Lấy cảm hứng từ điều này great post, tôi đang cố gắng sử dụng kết hợp org-modebabel để phát hành truy vấn đến elasticsearch. Ví dụ, đếm số lượng các mục trong một chỉ số:macro chế độ org bên trong khối mã và sử dụng babel

#+BEGIN_SRC sh 
curl -XGET 'http://my.uri.example:8080/index/_count' 
#+END_SRC 

Đoạn mã trên có thể được đánh giá bằng C-c C-c khi điểm là trong khối.

Mặt khác, người ta có thể xác định macros trong tài liệu org. Câu hỏi của tôi là: là nó có thể xác định một macro

#+MACRO: live-db http://my.uri.example:8080 

và viết lại các khối mã như sau:

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

Ra khỏi hộp, đối với tôi, nó đã không làm việc ... Nó có vẻ như babel không mở rộng macro trước khi đánh giá khối. Ý tưởng?

Sửa

Bây giờ, khi tôi biết rằng tôi có thể sử dụng es-mode, tôi sẽ không để tinh chỉnh câu hỏi của tôi. Hãy xem xét hai yêu cầu sau đây:

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

Họ chỉ khác nhau trong URL. Tôi muốn xác định hai macro:

#+MACRO staging http://my.uri.stage:8080 
#+MACRO live http://my.uri.live:8080 

và sau đó sử dụng macro làm biến của các khối. Có thể không?


Hãy chắc chắn rằng bạn kích hoạt việc thẩm định sh. Thêm nội dung như:

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

vào .emacs.

+0

Về câu hỏi đầu tiên của bạn, xem dòng 3088-3089 của ox.el: – fniessen

+1

Macros được mở rộng trước khi mã Babel được đánh giá. – fniessen

+0

(chức năng org-xuất khẩu-như) – fniessen

Trả lời

3

Mở rộng macro không được hỗ trợ nguyên bản khi thực thi các khối mã, nhưng Noweb reference syntax được hỗ trợ mạnh hơn rất nhiều.

Tuy nhiên, tôi nghi ngờ rằng nó sẽ hoạt động bằng cách sử dụng es-mode, vì nó chuyển url trong một số header argument và không phải là variable.

Đây là một ví dụ đơn giản cho một khối sh mã:

#+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 
Các vấn đề liên quan