Source code here refers to any plain text collection of computer instructions, possibly with comments, written using a human-readable programming language. Org can manage source code in an Org document when the source code is identified with begin and end markers. Working with source code begins with identifying source code blocks. A source code block can be placed almost anywhere in an Org document; it is not restricted to the preamble or the end of the document. However, Org cannot manage a source code block if it is placed inside an Org comment or within a fixed width section.
Here is an example source code block in the Emacs Lisp language:
#+BEGIN_SRC emacs-lisp (defun org-xor (a b) "Exclusive or." (if a (not b) b)) #+END_SRC
Org can manage the source code in the block delimited by ‘#+BEGIN_SRC’ … ‘#+END_SRC’ in several ways that can simplify housekeeping tasks essential to modern source code maintenance. Org can edit, format, extract, export, and publish source code blocks. Org can also compile and execute a source code block, then capture the results. The Org mode literature sometimes refers to source code blocks as live code blocks because they can alter the content of the Org document or the material that it exports. Users can control how live they want each source code block by tweaking the header arguments (see Using Header Arguments) for compiling, execution, extraction, and exporting.
Source code blocks are one of many Org block types, which also include “center”, “comment”, “dynamic”, “example”, “export”, “quote”, “special”, and “verse”. This section pertains to blocks between ‘#+BEGIN_SRC’ and ‘#+END_SRC’.
For editing and formatting a source code block, Org uses an appropriate Emacs major mode that includes features specifically designed for source code in that language.
Org can extract one or more source code blocks and write them to one or more source files—a process known as tangling in literate programming terminology.
For exporting and publishing, Org’s back-ends can format a source code block appropriately, often with native syntax highlighting.
For executing and compiling a source code block, the user can configure Org to select the appropriate compiler. Org provides facilities to collect the result of the execution or compiler output, insert it into the Org document, and/or export it. In addition to text results, Org can insert links to other data types, including audio, video, and graphics. Org can also link a compiler error message to the appropriate line in the source code block.
An important feature of Org’s management of source code blocks is the ability to pass variables, functions, and results to one another using a common syntax for source code blocks in any language. Although most literate programming facilities are restricted to one language or another, Org’s language-agnostic approach lets the literate programmer match each programming task with the appropriate computer language and to mix them all together in a single Org document. This interoperability among languages explains why Org’s source code management facility was named Org Babel by its originators, Eric Schulte and Dan Davison.
Org mode fulfills the promise of easy verification and maintenance of publishing reproducible research by keeping text, data, code, configuration settings of the execution environment, the results of the execution, and associated narratives, claims, references, and internal and external links in a single Org document.
Details of Org’s facilities for working with source code are described in the following sections.
|• Structure of Code Blocks:||Code block syntax described.|
|• Using Header Arguments:||Different ways to set header arguments.|
|• Environment of a Code Block:||Arguments, sessions, working directory...|
|• Evaluating Code Blocks:||Place results of evaluation in the Org buffer.|
|• Results of Evaluation:||Choosing a results type, post-processing...|
|• Exporting Code Blocks:||Export contents and/or results.|
|• Extracting Source Code:||Create pure source code files.|
|• Languages:||List of supported code block languages.|
|• Editing Source Code:||Language major-mode editing.|
|• Noweb Reference Syntax:||Literate programming in Org mode.|
|• Library of Babel:||Use and contribute to a library of useful code blocks.|
|• Key bindings and Useful Functions:||Work quickly with code blocks.|
|• Batch Execution:||Call functions from the command line.|