croatoan icon indicating copy to clipboard operation
croatoan copied to clipboard

Common Lisp bindings for the ncurses terminal library.

#+TITLE: croatoan

  • Introduction

croatoan is a set of bindings to the ncurses terminal library for Common Lisp.

It is inspired by, but not derived from, cl-ncurses and cl-charms.

The API is not yet stable, but the already finished parts are not expected to change much.

It is developed and tested on Ubuntu 20.04 x86_64 and SBCL 2.1.10.

The only supported ncurses version is 6.x --with-abi-version=6. The previous version 5.9 mostly works, but is not actively supported.

If your distribution still ships ncurses --with-abi-version=5, for full compatibility (wide characters, 256 colors and extended mouse support), you will have to manually build ncurses 6.x.

  • Goals

Its main goal is to provide a higher-level, lispy/CLOSy interface, whereas the existing bindings clone the cryptic C API.

As of now, the library is in an early, but hopefully usable stage. Ncurses is old and huge and it will take a while to cover completely.

A second goal is to reimplement the extension libraries forms, menu and dialog in Lisp instead of wrapping the C libraries.

A third, distant goal is to provide direct bindings for ANSI escape sequences, so that basic terminal control functions can be used from Lisp on systems without terminfo and ncurses.

  • Usage

The library is available in Quicklisp and can be installed with

#+BEGIN_SRC sh (ql:quickload "croatoan") #+END_SRC

  • Systems and packages

|-----------------------------+------------------+-------------+----------------| | Library | System | Package | Short nickname | |-----------------------------+------------------+-------------+----------------| | Higl-level CLOS API | croatoan | croatoan | crt | | Low-level ncurses bindings | croatoan-ncurses | ncurses | | | ANSI X3.64 escape sequences | ansi-escape | ansi-escape | esc | |-----------------------------+------------------+-------------+----------------|

  • Documentation

The documentation is currently provided by the docstrings and the commented examples.

  • SLIME/Thread support

Since ncurses is not thread-safe, all IO has to occur in the main thread of the REPL running in a terminal.

This makes it difficult to interact with ncurses from the Emacs SLIME REPL which runs in its own thread.

A workaround is to pass all ncurses IO to the main thread via a thread-safe queue. Basic support for this has been implemented.

A tutorial on interacting with ncurses from swank/slime is available in docs/slime.md

  • Contributing

You are welcome to contribute and any form of help would be greatly appreciated.

  • Contact

Please direct any questions about ncurses, croatoan or other terminal-related Lisp topics, libraries and applications to the following mailing list:

  • https://mailman.common-lisp.net/listinfo/croatoan-devel