2016-06-25 20:41:06 +00:00
# Cursive
2015-05-09 19:28:21 +00:00
2016-10-02 22:59:31 +00:00
[![crates.io ](https://meritbadge.herokuapp.com/cursive )](https://crates.io/crates/cursive)
2021-04-11 06:48:51 +00:00
[![Rust ](https://github.com/gyscos/cursive/actions/workflows/rust.yml/badge.svg?branch=main )](https://github.com/gyscos/cursive/actions/workflows/rust.yml)
2020-07-06 22:03:29 +00:00
[![Build status (appveyor) ](https://ci.appveyor.com/api/projects/status/uk5pww718jsp5x2l/branch/main?svg=true )](https://ci.appveyor.com/project/gyscos/cursive/branch/main)
2016-06-25 20:44:01 +00:00
[![MIT licensed ](https://img.shields.io/badge/license-MIT-blue.svg )](./LICENSE)
2017-02-27 22:22:43 +00:00
[![Gitter chat ](https://badges.gitter.im/gyscos/cursive.png )](https://gitter.im/cursive-rs/cursive)
2016-06-25 20:44:01 +00:00
2018-06-19 06:04:24 +00:00
2019-06-19 18:39:11 +00:00
Cursive is a TUI (Text User Interface) library for rust. It uses ncurses by default, but [other backends are available ](https://github.com/gyscos/cursive/wiki/Backends ).
2016-08-03 17:47:13 +00:00
It allows you to build rich user interfaces for terminal applications.
2015-05-09 19:28:21 +00:00
2017-11-17 19:46:29 +00:00
# [Documentation](http://docs.rs/cursive)
2016-06-25 20:53:04 +00:00
2015-05-19 17:01:54 +00:00
It is designed to be safe and easy to use:
2015-05-09 19:28:21 +00:00
2016-10-07 17:17:28 +00:00
```toml
2016-06-25 23:55:24 +00:00
[dependencies]
2021-01-20 18:45:46 +00:00
cursive = "0.16"
2015-05-22 23:28:23 +00:00
```
2016-07-03 20:16:22 +00:00
Or to use the latest git version:
2016-10-07 17:17:28 +00:00
```toml
2016-07-03 20:16:22 +00:00
[dependencies]
2019-06-19 18:39:11 +00:00
cursive = { git = "https://github.com/gyscos/cursive" }
2016-07-03 20:16:22 +00:00
```
2019-06-19 18:39:11 +00:00
([You will also need ncurses installed.](https://github.com/gyscos/cursive/wiki/Install-ncurses))
2015-06-02 19:03:33 +00:00
2016-09-28 22:22:21 +00:00
```rust,no_run
2016-09-29 05:45:27 +00:00
use cursive::views::{Dialog, TextView};
2015-05-09 19:28:21 +00:00
fn main() {
2016-06-26 00:10:18 +00:00
// Creates the cursive root - required for every application.
2020-04-15 19:20:50 +00:00
let mut siv = cursive::default();
2015-05-09 19:28:21 +00:00
2016-06-26 00:10:18 +00:00
// Creates a dialog with a single "Quit" button
2016-10-02 22:15:30 +00:00
siv.add_layer(Dialog::around(TextView::new("Hello Dialog!"))
2016-06-29 13:06:28 +00:00
.title("Cursive")
.button("Quit", |s| s.quit()));
2015-05-09 19:28:21 +00:00
2015-05-19 18:01:16 +00:00
// Starts the event loop.
siv.run();
2015-05-09 19:28:21 +00:00
}
```
2015-05-19 17:01:54 +00:00
2020-07-06 22:03:29 +00:00
[![Cursive dialog example ](https://raw.githubusercontent.com/gyscos/cursive/main/doc/cursive_example.png )](examples/src/bin/dialog.rs)
2015-05-24 21:07:30 +00:00
2020-07-06 22:03:29 +00:00
Check out the other [examples ](https://github.com/gyscos/cursive/tree/main/examples ) to get these results, and more:
2016-07-18 01:18:20 +00:00
2017-03-25 07:34:53 +00:00
< div >
2020-04-24 00:13:50 +00:00
< a href = "examples/src/bin/edit.rs" > < img src = "https://imgur.com/CQgSwly.png" alt = "edit.rs example" , width = "48%" / > < / a >
< a href = "examples/src/bin/lorem.rs" > < img src = "https://imgur.com/hW9M9MV.png" alt = "lorem.rs example" , width = "48%" / > < / a >
< a href = "examples/src/bin/menubar.rs" > < img src = "https://imgur.com/xx3lZPz.png" alt = "menubar.rs example" , width = "48%" / > < / a >
< a href = "examples/src/bin/select.rs" > < img src = "https://imgur.com/couty0n.png" alt = "select.rs example" , width = "48%" / > < / a >
< a href = "examples/src/bin/mines/" > < img src = "https://imgur.com/vNteYyy.png" alt = "mines example" , width = "48%" / > < / a >
< a href = "examples/src/bin/theme.rs" > < img src = "https://i.imgur.com/3Yleozc.png" alt = "theme.rs example" , width = "48%" / > < / a >
2017-03-25 07:34:53 +00:00
< / div >
2016-07-18 01:18:20 +00:00
2015-05-25 08:15:00 +00:00
_(Colors may depend on your terminal configuration.)_
2015-05-24 21:07:30 +00:00
2016-08-20 08:22:07 +00:00
## Tutorials
These tutorials may help you get started with cursive:
2020-07-06 22:03:29 +00:00
* [Starting with cursive: (1/3) ](https://github.com/gyscos/cursive/tree/main/doc/tutorial_1.md )
* [Starting with cursive: (2/3) ](https://github.com/gyscos/cursive/tree/main/doc/tutorial_2.md )
* [Starting with cursive: (3/3) ](https://github.com/gyscos/cursive/tree/main/doc/tutorial_3.md )
2016-08-16 00:26:44 +00:00
2017-04-18 17:30:55 +00:00
## Third-party views
Here are a few crates implementing new views for you to use:
2019-09-20 18:05:27 +00:00
* [cursive-aligned-view ](https://github.com/deinstapel/cursive-aligned-view ): A view wrapper for gyscos/cursive views which aligns child views.
* [cursive-async-view ](https://github.com/deinstapel/cursive-async-view ): A loading-screen wrapper.
* [cursive-flexi-logger-view ](https://github.com/deinstapel/cursive-flexi-logger-view ): An alternative debug view using `emabee/flexi_logger` .
2020-10-07 21:27:11 +00:00
* [cursive-markup ](https://sr.ht/~ireas/cursive-markup-rs ): A view that renders HTML or other markup.
2019-09-20 18:05:27 +00:00
* [cursive-multiplex ](https://github.com/deinstapel/cursive-multiplex ): A tmux like multiplexer.
* [cursive-tabs ](https://github.com/deinstapel/cursive-tabs ): Tabs.
* [cursive_calendar_view ](https://github.com/BonsaiDen/cursive_calendar_view ): A basic calendar view implementation.
* [cursive_hexview ](https://github.com/hellow554/cursive_hexview ): A simple hexview.
* [cursive_table_view ](https://github.com/BonsaiDen/cursive_table_view ): A basic table view component.
* [cursive_tree_view ](https://github.com/BonsaiDen/cursive_tree_view ): A tree view implementation.
## Showcases
Here are some cool applications using cursive:
* [RustyChat ](https://github.com/SambaDialloB/RustyChat ): Chat client made using Rust and Cursive.
2021-02-10 19:46:20 +00:00
* [clock-cli ](https://github.com/TianyiShi2001/clock-cli-rs ): A clock with stopwatch and countdown timer functionalities.
2019-09-20 18:05:27 +00:00
* [fui ](https://github.com/xliiv/fui ): Add CLI & form interface to your program.
* [grin-tui ](https://github.com/mimblewimble/grin ): Minimal implementation of the MimbleWimble protocol.
2021-02-10 19:46:20 +00:00
* [kakikun ](https://github.com/file-acomplaint/kakikun ): A paint and ASCII art application for the terminal.
* [mythra ](https://github.com/deven96/mythra ): CLI to search for music.
* [ncspot ](https://github.com/hrkfdn/ncspot ): Cross-platform ncurses Spotify client.
2019-09-20 18:05:27 +00:00
* [ripasso ](https://github.com/cortex/ripasso ): A simple password manager written in Rust.
2021-02-10 19:46:20 +00:00
* [rusty-man ](https://sr.ht/~ireas/rusty-man ): Browse rustdoc documentation.
* [so ](https://github.com/samtay/so ): A terminal interface for Stack Overflow.
2020-10-08 20:36:03 +00:00
* [sudoku-tui ](https://github.com/TianyiShi2001/sudoku-tui ): Play sudoku on the command line.
2017-04-18 17:30:55 +00:00
2016-06-25 20:41:06 +00:00
## Goals
2015-05-24 21:07:30 +00:00
2016-06-26 00:19:26 +00:00
* **Ease of use.** Simple apps should be simple. Complex apps should be manageable.
2016-06-25 20:41:06 +00:00
* **Linux TTY Compatibility.** Colors may suffer, and UTF-8 may be too much, but most features *must* work properly on a Linux TTY.
* **Flexibility.** This library should be able to handle simple UI scripts, complex real-time applications, or even games.
* In particular, it tries to have enough features to recreate these kind of tools:
* [menuconfig ](http://en.wikipedia.org/wiki/Menuconfig#/media/File:Linux_x86_3.10.0-rc2_Kernel_Configuration.png )
* [nmtui ](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Configure_a_Network_Team_Using_the_Text_User_Interface_nmtui.html )
2015-05-19 20:54:50 +00:00
2016-06-25 20:41:06 +00:00
## Compatibility
2015-06-06 20:51:21 +00:00
First off, terminals are messy. A small set of features is standard, but beyond that, almost every terminal has its own implementation.
### Output
* **Colors**: the basic 8-colors palette should be broadly supported. User-defined colors is not supported in the raw linux TTY, but should work in most terminals, although it's still kinda experimental.
* **UTF-8**: Currently Cursive really expects a UTF-8 locale. It may eventually get patched to support window borders on other locales, but it's not a priority.
2019-06-19 18:39:11 +00:00
There is initial support for [wide characters ](https://en.wikipedia.org/wiki/CJK_characters ). [RTL ](https://en.wikipedia.org/wiki/Right-to-left ) support [is planned ](https://github.com/gyscos/cursive/issues/31 ), but still very early.
2015-06-06 20:51:21 +00:00
### Input
2015-06-06 22:05:01 +00:00
* The `key_codes` example can be a useful tool to see how the library reacts to various key presses.
* Keep in mind that if the terminal has shortcuts registered, they probably won't be transmitted to the app.
* UTF-8 input should work fine in a unicode-enabled terminal emulator, but raw linux TTY may be more capricious.
2020-04-24 00:13:50 +00:00
## [Contributing](CONTRIBUTING.md)
2019-03-04 19:12:51 +00:00
## Alternatives
2019-06-19 18:39:11 +00:00
See also [tui-rs ](https://github.com/fdehau/tui-rs ) - and a small [comparison page ](https://github.com/gyscos/cursive/wiki/Cursive-vs-tui%E2%80%90rs ).