/readline

Shell library with powerful and modern UI, large feature set, and `.inputrc` support

Primary LanguageGoApache License 2.0Apache-2.0


Readline

Github Actions (workflows) Go module version GoDoc reference Go Report Card codecov License: BSD-3

This library is a modern, pure Go readline shell implementation, with full .inputrc and legacy readline command/option support, and extended with various commands, options and tools commonly found in modern shells. Its architecture and completion system is heavily inspired from Z-Shell. It is used, between others, to power the console library.

Features

Core

Emacs / Standard

  • Native Emacs commands
  • Emacs-style macro engine (not working across multiple calls)
  • Keywords switching (operators, booleans, hex/binary/digit) with iterations
  • Command/mode cursor status indicator
  • Complete undo/redo history
  • Command status/arg/iterations hint display

Vim

  • Near-native Vim mode
  • Vim text objects (code blocks, words/blank/shellwords)
  • Extended surround select/change/add functionality, with highlighting
  • Vim Visual/Operator pending mode & cursor styles indications
  • Vim Insert and Replace (once/many)
  • All Vim registers, with completion support
  • Vim-style macro recording (q<a>) and invocation (@<a>)

Interface

  • Support for PS1/PS2/RPROMPT/transient/tooltip prompts (compatible with oh-my-posh)
  • Extended completion system, keymap-based and configurable, easy to populate & use
  • Multiple completion display styles, with color support.
  • Completion & History incremental search system & highlighting (fuzzy-search).
  • Automatic & context-aware suffix removal for efficient flags/path/list completion.
  • Optional asynchronous autocomplete
  • Builtin & programmable syntax highlighting

Documentation

Readline is used by the console library and its example binary. To get a grasp of the functionality provided by readline and its default configuration, install and start the binary.

The documentation is available on the repository wiki, for both users and developers.

Showcases

- Emacs edition
(This extract is quite a pity, because its author is not using Emacs and does not know many of its shortcuts)
- Vim edition
- Undo/redo line history
- Keyword switching & selection
Switching various keywords
Using regexp-based selection to grab parts of words (here, URL components)
- Vim selection & movements (basic)
- Vim surround (selection and change)
Selecting/adding/changing surround regions
Surround and change in shellwords, matching brackets, etc.
- Vim registers (with completion)
- History movements/completion/use/search
History movement, completion and some other other widgets
- Completion
Classic mode & incremental search mode
Suffix-autoremoval
- Prompts
- Logging
- Inputrc init file reload
- Multiline edition
- Macros
Emacs
Vim

Status

This library is now in a release status, as it has underwent several major rewrites and is now considered mostly feature-complete, with a solid testing suite to ensure safe and smooth operation to the best extent possible. New releases will be regularly pushed when bugs are found and corrected.

Additionally:

  • Key dispatch/flushing, meta-key enable, etc might still contain some bugs/wrong behavior: 30 years of legacy support for 3000 different terminal emulators cannot be done right by me alone.
  • Please open a PR or an issue if you face any bug, and it will be promptly resolved.
  • Don't hesitate proposing a new feature or a PR if you deem it to be useful to most users.

Credits

  • @kenshaw for his .inputrc parsing package, which brings much wider compatibility to this library.
  • chzyer/readline for the Windows I/O code and everything related.
  • Some of the Vim code is inspired or translated from zsh-vi-mode.
  • lmorg/readline, for the line tokenizers.