Emacs packages in OCaml
May 9, 2025 ยท View on GitHub
Ecaml is a library for writing Emacs packages in OCaml. It uses Emacs
25 support for dynamic modules to load native OCaml code into Emacs.
Building a plugin
First you build the plugin as a shared object (e.g. my_plugin.so).
Then you use bin/dump-ecaml.sh to dump a wrapper Elisp file
which will perform top-level definitions and load that shared object.
Using Dune
Compile your plugin using (modes (native shared_object)) in the executable
stanza of your dune file. See example/dune.example
for an example.
Using Jane Street jenga rules
Simply add (only_shared_object true) to the executables stanza in
your jbuild. For instance:
(executables
((names (my_plugin))
(libraries (ecaml))
(only_shared_object true)))
Then build my_plugin.so with jenga. This has been tested in opam
using jane-build.
Using other build systems
You need to use the -output-complete-obj option of ocamlopt to
produce a self-contained shared object file. For instance to build the
plugin in the example/ directory:
$ ocamlfind ocamlopt -linkpkg -package ecaml -thread -output-complete-obj \
-runtime-variant _pic -pp ppx-jane example_plugin.ml -o example_plugin.so
Links
As of Emacs version 25, Emacs supports plugins. Here is the API:
Here's a tutorial:
http://diobla.info/blog-archive/modules-tut.html
Here's an example plugin:
Licensing
Note that Emacs modules must be GPL compatible, so you must make sure that your work based on Ecaml is released under a GPL compatible license.
Ecaml itself is released under the Apache 2.0 license which is GPL compatible.