https://github.com/janestreet/ecaml
Writing Emacs plugin in OCaml
https://github.com/janestreet/ecaml
Last synced: 8 months ago
JSON representation
Writing Emacs plugin in OCaml
- Host: GitHub
- URL: https://github.com/janestreet/ecaml
- Owner: janestreet
- License: mit
- Created: 2016-08-29T13:29:37.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2025-05-09T20:17:34.000Z (8 months ago)
- Last Synced: 2025-05-16T18:05:04.343Z (8 months ago)
- Language: OCaml
- Size: 1.69 MB
- Stars: 271
- Watchers: 16
- Forks: 12
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGES.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-list - ecaml
README
# Emacs packages in OCaml
`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`](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:
```scheme
(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](https://github.com/janestreet/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:
```shell
$ 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:
http://git.savannah.gnu.org/cgit/emacs.git/tree/src/emacs-module.h?id=e18ee60b02d08b2f075903005798d3d6064dc013
Here's a tutorial:
http://diobla.info/blog-archive/modules-tut.html
Here's an example plugin:
http://git.savannah.gnu.org/cgit/emacs.git/tree/modules/mod-test/mod-test.c?id=e18ee60b02d08b2f075903005798d3d6064dc013
## 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.