mirror of
https://github.com/emacs-twist/org-babel.git
synced 2024-12-14 11:07:30 +00:00
86 lines
2.6 KiB
Org Mode
86 lines
2.6 KiB
Org Mode
* nix-org-babel
|
|
This is an implementation of =org-babel-tangle= in Nix.
|
|
Given an Org string, it extracts the contents of source blocks in a particular language.
|
|
** Rationale
|
|
[[https://github.com/talyz/fromElisp][talyz/fromElisp]] provides support for Org, and it is also part of [[https://github.com/nix-community/emacs-overlay][emacs-overlay]], which apparently is used by many people for their own configs.
|
|
However, I wanted to experiment with more advanced features such as excluding archived entries, and I wasn't sure if I could mix that with their code base.
|
|
I needed the feature in [[https://github.com/akirak/emacs-twist][my own project]], and I wanted to put it under my control, so I wrote it from scratch.
|
|
** Usage
|
|
Import the flake.
|
|
*** Extracting source blocks from an Org file/string
|
|
**** tangleOrgBabel function
|
|
This function takes an Org string and returns its source blocks.
|
|
|
|
Example:
|
|
|
|
#+begin_src nix
|
|
let
|
|
tangle = lib.tangleOrgBabel {
|
|
languages = [ "emacs-lisp" ];
|
|
};
|
|
in
|
|
# Return a string
|
|
tangle (builtins.readFile ./config.org)
|
|
#+end_src
|
|
|
|
Arguments:
|
|
|
|
1. An attribute set of options.
|
|
2. An Org input string.
|
|
**** tangleOrgBabelFile function
|
|
Similar to =tangleOrgBabel=, but this function takes a file as an argument and writes the output to a file.
|
|
|
|
Example:
|
|
|
|
#+begin_src nix
|
|
# Write to a file
|
|
let
|
|
pkgs = import nixpkgs {
|
|
inherit system;
|
|
overlays = [
|
|
org-babel.overlays.default
|
|
];
|
|
};
|
|
in
|
|
pkgs.tangleOrgBabelFile "init.el" ./config.org {
|
|
languages = [ "emacs-lisp" ];
|
|
}
|
|
#+end_src
|
|
|
|
Note that this function is provided in the overlay of the flake.
|
|
|
|
Arguments:
|
|
|
|
1. A string for the derivation name.
|
|
2. An input file path.
|
|
3. An attribute set of options.
|
|
*** Options
|
|
**** Languages
|
|
Example:
|
|
|
|
#+begin_src nix
|
|
{
|
|
languages = [ "emacs-lisp" "elisp" ];
|
|
}
|
|
#+end_src
|
|
|
|
Default: =[ "emacs-lisp" "elisp" ]=
|
|
**** Filtering subtrees
|
|
You can transform the input by specifying =processLines= option.
|
|
It must be a function that takes a list of strings and returns a list of strings.
|
|
|
|
This library also contains =excludeHeadlines= function which can be used to exclude subtrees according to a predicate on the headline text, so you can use it in the option.
|
|
|
|
Example:
|
|
|
|
#+begin_src nix
|
|
{
|
|
# Exclude archived subtrees
|
|
processLines = excludeHeadlines (matchOrgTag "ARCHIVE");
|
|
}
|
|
#+end_src
|
|
|
|
You can use the following predicates from this library:
|
|
|
|
- tag :: Returns true if the headline matches a tag given as the argument. The argument must be a string.
|
|
- headlineText :: Returns true if the headline matches the text given as the argument. The argument must be a string.
|