emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Alan Schmitt <alan.schmitt@polytechnique.org>
To: Org Mode <emacs-orgmode@gnu.org>
Subject: A small hack to document programs externally
Date: Fri, 06 Dec 2013 17:26:05 +0100	[thread overview]
Message-ID: <m2bo0u3q02.fsf@polytechnique.org> (raw)

Hello,

I've just written a small hack to refer to code in other files from an
org-mode buffer, so that the referred code would be copied in the buffer
to be exported when exporting the org buffer. (Our use case is a large
Coq development which we want to document online. Our may constraint is
that we need the documentation to live in files outside the code, yet
still refer to the actual code.)

Here is a small test case showing the approach

--8<---------------cut here---------------start------------->8---
#+OPTIONS: d:RESULTS

* utilities                                                        :noexport:
#+name: fetch
#+BEGIN_SRC emacs-lisp :results raw :var f="foo.v" :var s="Definition" :var n=0
  (defun fetchlines (file-path search-string nb-lines)
    "Searches for the SEARCH-STRING in FILE-PATH and returns the
  matching line and the following NB-LINES."
    (let ((myBuffer (get-buffer-create "fetchTemp")) result)
      (set-buffer myBuffer)
      (insert-file-contents file-path nil nil nil t)
      (goto-char 1)
      
      (setq result
            (if (search-forward search-string nil t)
                (let ((pos-beg (line-beginning-position))
                      (pos-end
                       (if (> nb-lines 0) 
                           (line-end-position nb-lines) 
                         (re-search-forward "\\.$" nil t))
                       ))
                  (buffer-substring pos-beg pos-end))
              ""))
      
      (kill-buffer myBuffer)
      result))
  
  (fetchlines f s n)
#+END_SRC

#+name: wrap-coq
#+BEGIN_SRC emacs-lisp :var text="" :results raw
(concat "#+BEGIN_SRC coq\n" text "\n#+END_SRC")
#+END_SRC

* example
:PROPERTIES:
:results: drawer
:post: wrap-coq(text=*this*)
:END:

#+call: fetch(f="/Users/schmitta/work/hocorecoq/coq/HOC01defs.v", s="Inductive process")

#+RESULTS:
:RESULTS:
#+BEGIN_SRC coq
Inductive process : Set :=
| Send : chan -> process -> process
| Receive : chan -> lvar -> process -> process
| Lvar : lvar -> process
| Gvar : var -> process
| Par : process -> process -> process
| Nil : process.
#+END_SRC
:END:
--8<---------------cut here---------------end--------------->8---

The ~fetch~ function takes as arguments the file where to search, the
string to be searched, and the number of lines to print. If this last
argument is omitted (or equal to 0), then everything until a final dot
('.' followed by a newline) is printed (this corresponds to the end of a
definition or statement in Coq).

Thanks to everyone who answered my recent questions on the list. And if
you have suggestions to improve this (including ways it may already be
doable natively), please don't hesitate to send them.

Best,

Alan

             reply	other threads:[~2013-12-06 16:26 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-06 16:26 Alan Schmitt [this message]
2013-12-06 21:46 ` A small hack to document programs externally Suvayu Ali
2014-01-04 15:01 ` Bastien
2014-01-04 16:36   ` Alan Schmitt
2014-02-01 10:22   ` Alan Schmitt
2014-02-03  8:59     ` Bastien
2014-02-03 12:11       ` Alan Schmitt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2bo0u3q02.fsf@polytechnique.org \
    --to=alan.schmitt@polytechnique.org \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).