-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy path.dir-locals.el
96 lines (92 loc) · 3.98 KB
/
.dir-locals.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
;; Very similar logic appears in
;; https://www.github.com/dkogan/gnuplotlib
;; https://www.github.com/dkogan/feedgnuplot
;; https://www.github.com/dkogan/vnlog
;;
;; I need some advices to be able to generate all the images. I'm not using the org
;; exporter to produce the html, but relying on github's limited org parser to
;; display everything. github's parser doesn't do the org export, so I must
;; pre-generate all the figures with (org-babel-execute-buffer) (C-c C-v C-b).
;; This requires advices to:
;; - Generate unique image filenames
;; - Communicate those filenames to feedgnuplot
;; - Display code that produces an interactive plot (so that the readers can
;; cut/paste the snippets), but run code that writes to the image that ends up in
;; the documentation
(( org-mode . ((eval .
(progn
(setq org-confirm-babel-evaluate nil)
(org-babel-do-load-languages
'org-babel-load-languages
'((shell . t)
(gnuplot . t)))
;; This sets a default :file tag, set to a unique filename. I want each demo to
;; produce an image, but I don't care what it is called. I omit the :file tag
;; completely, and this advice takes care of it
(defun dima-info-local-get-property
(params what)
(condition-case nil
(cdr (assq what params))
(error "")))
(defun dima-org-babel-is-feedgnuplot
(params)
(and
(or (not (assq :file params))
(string-match "^guide-[0-9]+\\.svg$" (cdr (assq :file params))))
(string-match "\\<both\\>" (dima-info-local-get-property params :exports) )
(string-match "\\<file\\>" (dima-info-local-get-property params :results ))))
(defun dima-org-babel-sh-unique-plot-filename
(f &optional arg info params)
(let ((info-local (or info (org-babel-get-src-block-info t))))
(if (and info-local
(string= (car info-local) "sh")
(dima-org-babel-is-feedgnuplot (caddr info-local)))
;; We're looking at a feedgnuplot block. Add a default :file
(funcall f arg info
(cons (cons ':file
(format "guide-%d.svg"
(condition-case nil
(setq dima-unique-plot-number (1+ dima-unique-plot-number))
(error (setq dima-unique-plot-number 0)))))
params))
;; Not feedgnuplot. Just do the normal thing
(funcall f arg info params))))
(unless
(advice-member-p
#'dima-org-babel-sh-unique-plot-filename
#'org-babel-execute-src-block)
(advice-add
#'org-babel-execute-src-block
:around #'dima-org-babel-sh-unique-plot-filename))
;; If I'm regenerating ALL the plots, I start counting the plots from 0
(defun dima-reset-unique-plot-number
(&rest args)
(setq dima-unique-plot-number 0))
(unless
(advice-member-p
#'dima-reset-unique-plot-number
#'org-babel-execute-buffer)
(advice-add
#'org-babel-execute-buffer
:before #'dima-reset-unique-plot-number))
;; I'm using github to display guide.org, so I'm not using the "normal" org
;; exporter. I want the demo text to not contain --hardcopy, but clearly I
;; need --hardcopy when generating the plots. I add the --hardcopy to the
;; command before running it
(defun dima-org-babel-sh-set-demo-output (f body params)
(when (dima-org-babel-is-feedgnuplot params)
(with-temp-buffer
(insert body)
;; write to svg
(forward-word-strictly)
(insert (format " --terminal 'svg noenhanced solid size 800,600 font \",14\"' --hardcopy %s" (cdr (assq :file params))))
(setq body (buffer-substring-no-properties (point-min) (point-max)))))
(funcall f body params))
(unless
(advice-member-p
#'dima-org-babel-sh-set-demo-output
#'org-babel-execute:sh)
(advice-add
#'org-babel-execute:sh
:around #'dima-org-babel-sh-set-demo-output))
)))))