1
0
Fork 0
mirror of https://github.com/emacs-twist/org-babel.git synced 2024-12-14 11:07:30 +00:00
A pure Nix implementation of org-babel-tangle
Find a file
2022-01-02 16:22:04 +09:00
.github/workflows chore: Make nixpkgs available on CI 2021-12-03 23:18:24 +09:00
nix feat: Add selectHeadlines function 2022-01-02 16:22:04 +09:00
test feat: Add selectHeadlines function 2022-01-02 16:22:04 +09:00
flake.lock Initial commit 2021-12-03 22:44:34 +09:00
flake.nix fix!: Provide the file writer in an overlay 2021-12-12 05:18:46 +09:00
LICENSE docs: Add license 2021-12-03 22:45:03 +09:00
README.org docs: Add usage 2021-12-12 05:42:02 +09:00

nix-org-babel

This is a quick and dirty implementation of org-babel-tangle in Nix. It provides a function that takes an Org string and returns the contents of source blocks in a particular language.

talyz/fromElisp has a built-in Org support, but I created this because I needed more control on which parts to extract. It provides an option for excluding subtrees matching a particular heading pattern. For example, you can omit archived subtrees from the output.

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:

  let
    tangle = lib.tangleOrgBabel {
      languages = [ "emacs-lisp" ];
    };
  in
  # Return a string
  tangle (builtins.readFile ./config.org)

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:

  # Write to a file
  let
    pkgs = import nixpkgs {
      inherit system;
      overlays = [
        org-babel.overlay
      ];
    };
  in
  pkgs.tangleOrgBabelFile "init.el" ./config.org {
    languages = [ "emacs-lisp" ];
  }

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

This option is required.

Example:

  {
    languages = [ "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 excludeOrgSubtreesOnHeadlines 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:

  {
    # Exclude archived subtrees
    processLines = excludeOrgSubtreesOnHeadlines (matchOrgTag "ARCHIVE");
  }

You can use the following predicates from this library:

matchOrgTag
Returns true if the headline matches a tag given as the argument. The argument must be a string.
matchOrgHeadline
Returns true if the headline matches the text given as the argument. The argument must be a string.
matchOrgHeadlines
Returns true if the headline matches any of the texts given as the argument. The argument must be a list of strings.