Readline
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
- Pure Go, almost-only standard library
- Cross-platform (Linux / MacOS / Windows)
- Full
.inputrc
support (all commands/options) - Extensive test suite and almost full coverage of core code
- Extended list of additional commands/options (edition/completion/history)
- Complete multiline edition/movement support
- Command-line edition in
$EDITOR
/$VISUAL
support - Programmable API, with failure-safe access to core components
- Support for an arbitrary number of history sources
Emacs / Standard
- Native Emacs commands
- Emacs-style macro engine (not working accross 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 fonctionality, 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
![](https://github.com/reeflective/readline/raw/assets/emacs.gif?raw=true)
- Keyword switching & selection
![](https://github.com/reeflective/readline/raw/assets/switch-keywords.gif?raw=true)
![](https://github.com/reeflective/readline/raw/assets/select-keywords.gif?raw=true)
- Vim surround (selection and change)
![](https://github.com/reeflective/readline/raw/assets/vim-surround.gif?raw=true)
![](https://github.com/reeflective/readline/raw/assets/vim-surround-2.gif?raw=true)
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.