Terminal UI library with rich, interactive widgets — written in Golang

Overview

Rich Interactive Widgets for Terminal UIs

PkgGoDev Go Report

This Go package provides commonly needed components for terminal based user interfaces.

Screenshot

Among these components are:

  • Input forms (include input/password fields, drop-down selections, checkboxes, and buttons)
  • Navigable multi-color text views
  • Sophisticated navigable table views
  • Flexible tree views
  • Selectable lists
  • Grid, Flexbox and page layouts
  • Modal message windows
  • An application wrapper

They come with lots of customization options and can be easily extended to fit your needs.

Installation

go get github.com/rivo/tview

Hello World

This basic example creates a box titled "Hello, World!" and displays it in your terminal:

package main

import (
	"github.com/rivo/tview"
)

func main() {
	box := tview.NewBox().SetBorder(true).SetTitle("Hello, world!")
	if err := tview.NewApplication().SetRoot(box, true).Run(); err != nil {
		panic(err)
	}
}

Check out the GitHub Wiki for more examples along with screenshots. Or try the examples in the "demos" subdirectory.

For a presentation highlighting this package, compile and run the program found in the "demos/presentation" subdirectory.

Projects using tview

Documentation

Refer to https://pkg.go.dev/github.com/rivo/tview for the package's documentation. Also check out the Wiki.

Dependencies

This package is based on github.com/gdamore/tcell (and its dependencies) as well as on github.com/rivo/uniseg.

Versioning and Backwards-Compatibility

I try really hard to keep this project backwards compatible. Your software should not break when you upgrade tview. But this also means that some of its shortcomings that were present in the initial versions will remain. In addition, at least for the time being, you won't find any version tags in this repo. The newest version should be the one to upgrade to. It has all the bugfixes and latest features. Having said that, backwards compatibility may still break when:

  • a new version of an imported package (most likely tcell) changes in such a way that forces me to make changes in tview as well,
  • I fix something that I consider a bug, rather than a feature, something that does not work as originally intended,
  • I make changes to "internal" interfaces such as Primitive. You shouldn't need these interfaces unless you're writing your own primitives for tview. (Yes, I realize these are public interfaces. This has advantages as well as disadvantages. For the time being, it is what it is.)

Your Feedback

Add your issue here on GitHub. Feel free to get in touch if you have any questions.

Issues
  • virtual Table view #question

    virtual Table view #question

    Does the library support virtual table?

    I'd like to build a simple log viewer with this lib, but the log is quite huge, so I don't think I'd like to load the whole logfile to memory.

    opened by pihentagy 31
  • panic: tview.(*Table).Draw.func1

    panic: tview.(*Table).Draw.func1

    I am getting a panic in tview. It looks like it might be in table.go line 469, but it is really hard to troubleshoot because of the way the panic is being printed.

    panic

    (Click image for bigger view)

    opened by joegrasse 28
  • Mouse support

    Mouse support

    Hi, this pull request adds mouse support. Here are some notes on the changes:

    • app.EnableMouse() is needed in order to enable the mouse. Mouse enabled does cause extra traffic and redrawing. Because it's disabled by default, there should be no behavior impact to existing programs.
    • Mouse enabled prevents normal selecting text in most terminals. Workaround is to use the shift key while selecting. It's the developer's decision if they want to impose this on their users.
    • Buttons, checkboxes and list items can be clicked.
    • InputField sets focus on click, it could potentially also allow you to click to a specific character position.
    • DropDown list responds to clicks, and clicking outside closes the list.
    • Clicks on TreeView and Table not implemented yet.
    • Primitives could have a new hover draw state, such as changing the background color on hover. Needs color/theming decision. (I experimented with focusing on hover, it works well but I'm not sure it's a good default)
    • Try the the presentation demo to test the mouse. You can't click to switch slides, that would be nice.

    Relevant issues: #13 #361 #338 #337

    opened by millerlogic 26
  • TextView: limiting the maximum number of lines

    TextView: limiting the maximum number of lines

    Hi,

    I am using TextView to display scrolling log output, but as soon as the text in the buffer becomes very big, CPU usage shoots up.

    I propose solving it by adding a new SetMaxLines() method that makes sure the buffer slice never contains more lines than the set maximum. By default, it is set to infinite, therefore this would be a backward-compatible change.

    Proposed PR: #452

    opened by jpeletier 23
  • Feature: popup/docked menu

    Feature: popup/docked menu

    The reason I am asking for popup menu is that the list using as menu taking too much space if laid vertically, it just doesn't look proper as a habit if laid horizontally.

    Two solutions:

    • A
    1. Introduce a modal window, allow this modal window to be used as container, similar like flex. So user can add the list into it.
    2. Allow a triggering key(eg: m for menu) from current focused gui component, eg: page/table/textview etc to trigger the popup modal
    3. In this use case, user trigger 2 keys: m -> f to trigger a function call

    I tried current modal, it seems the way of using it is too much mind twisted. I don't like it for a few reasons:

    1. User need to put it into a page, then hide it, you will have to switch to that page in order to show it. This way, the whole page of modal normally hide the view of your working page. It is not a popup, at least the way using it does not feel intuitive

    2. This modal page is taking a tab page and it is not naturally belongs to the tab pages. If I need one modal window as menu for a tab page for some operations, there would be too many pages used for the modal windows. To avoid displaying the modal window page, when I render the tab number and switch logic, I will have to put special logic for it

    • B

    Not sure if this is good. But if it's doable and easy to implement, then it should be cool

    1. Allow a triggering key(eg: m for menu) from current focused gui component, eg: page/table/textview etc to trigger the popup modal

    2. For a tab page structured as: flex [(hidden list) | table]. The hidden list won't be showing and take any space. Only when the triggering key is pressed, then the list will be showing and take the space, the table component will take the space as normal. After user select the list item to trigger required function, the list will be hidden again.

    Just a thought for your consideration. tview will get better and even cooler :)

    opened by stephencheng 19
  • Install error - cannot convert b.borderAttributes

    Install error - cannot convert b.borderAttributes

    go get fails with following error

    go get github.com/rivo/tview
    # github.com/rivo/tview
    Workspace/go/src/github.com/rivo/tview/box.go:343:63: cannot convert b.borderAttributes (type tcell.AttrMask) to type tcell.Style
    Workspace/go/src/github.com/rivo/tview/table.go:331:108: cannot convert attributes (type tcell.AttrMask) to type tcell.Style
    Workspace/go/src/github.com/rivo/tview/table.go:888:150: cannot convert cell.Attributes (type tcell.AttrMask) to type tcell.Style
    Workspace/go/src/github.com/rivo/tview/table.go:957:63: cannot convert a (type tcell.AttrMask) to type tcell.Style
    Workspace/go/src/github.com/rivo/tview/table.go:1020:24: invalid operation: t.selectedStyle != 0 (mismatched types tcell.Style and int)
    
    opened by m-ivanov 19
  • Forms can grow beyond terminal dimensions

    Forms can grow beyond terminal dimensions

    If you add too many form items to a form, it can vertically grow beyond the terminal's height. It would be nice if one could scroll within a form in such a case.

    opened by joegrasse 19
  • please publish a release

    please publish a release

    It's crucial for some (including me) to freeze their dependencies. I have my way around by running

    go get github.com/rivo/[email protected] 
    

    still, please publish a release

    https://github.com/rivo/tview/releases

    image

    opened by jossef 18
  • Freeze and Crash

    Freeze and Crash

    Hi!

    New ability to send redraw request to app is cool, but adding second event loop is not.

    Crush App crush on exit. Just Ctrl-C and we see panic trace. It happened because screen is gone in Stop(), but event queue still have tcell.EventResize.

    Freeze Let take Box example and change it a bit:

    // Demo code for the Box primitive.
    package main
    
    import (
    	"github.com/gdamore/tcell"
    	"github.com/rivo/tview"
    )
    
    func main() {
    	box := tview.NewBox().
    		SetBorder(true).
    		SetBorderAttributes(tcell.AttrBold).
    		SetTitle("A title")
    
    	app:=tview.NewApplication()
    	app.SetInputCapture(func (event *tcell.EventKey) *tcell.EventKey {
    		switch event.Key() {
    			case tcell.KeyCtrlC:
    			case tcell.KeyCtrlQ:
    				app.Stop()
    			default:
    				return event
    		}
    		return nil
    		})
    
    	if err := app.SetRoot(box, true).Run(); err != nil {
    		panic(err)
    	}
    }
    

    As you can see, I add input handler on app level. It just eat Ctrl-C and allow quit on Ctrl-Q. Build, run. Ctrl-C - and we going to endless loop somewhere around EventLoop: label Exit by Ctrl-Q working as expected, but it strange: on my more complex app any call of Application.Stop() cause panic.

    Why adding more complicated mechanism if there is already simple, reliable and extendable tcell.PostEvent()?

    opened by aunoor 16
  • Crash in program due to deadlock

    Crash in program due to deadlock

    This example program crashes when doing a CTR-C.

    fatal error: all goroutines are asleep - deadlock!
    
    goroutine 1 [select]:
    github.com/rivo/tview.(*Application).Run(0xc00017c000, 0x0, 0x0)
            C:/Users/user/Documents/gowork/pkg/mod/github.com/rivo/[email protected]/application.go:302 +0x205
    main.main()
            C:/Users/user/Documents/gowork/src/github.com/user/box/main.go:17 +0x1e5
    
    goroutine 19 [select]:
    github.com/gdamore/tcell/v2.(*cScreen).PollEvent(0xc00017e000, 0xc000049fa0, 0xc0002b85e0)
            C:/Users/user/Documents/gowork/pkg/mod/github.com/gdamore/tcell/[email protected]/console_win.go:372 +0xbf
    github.com/rivo/tview.(*Application).Run.func2(0xc0000b1690, 0xc00017c000)
            C:/Users/user/Documents/gowork/pkg/mod/github.com/rivo/[email protected]/application.go:267 +0xac
    created by github.com/rivo/tview.(*Application).Run
            C:/Users/user/Documents/gowork/pkg/mod/github.com/rivo/[email protected]/application.go:254 +0x11d
    
    C:\WINDOWS\system32>
    

    main.go

    // Demo code for the Box primitive.
    package main
    
    import (
    	"github.com/gdamore/tcell/v2"
    	"github.com/rivo/tview"
    )
    
    func main() {
    	box := tview.NewBox().
    		SetBackgroundColor(tcell.ColorGreen).
    		SetTitle("Hello").
    		SetBorder(true).
    		SetBorderPadding(0, 0, 0, 0).
    		SetBorderColor(tcell.ColorWhite)
    
    	if err := tview.NewApplication().SetRoot(box, true).Run(); err != nil {
    		panic(err)
    	}
    }
    

    go.mod

    module github.com/joegrasse/box
    
    go 1.15
    
    require (
    	github.com/gdamore/tcell/v2 v2.2.0
    	github.com/rivo/tview v0.0.0-20210217110421-8a8f78a6dd01
    )
    

    go.sum

    github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
    github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
    github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU=
    github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA=
    github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4=
    github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU=
    github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
    github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
    github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
    github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg=
    github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
    github.com/rivo/tview v0.0.0-20210217110421-8a8f78a6dd01 h1:rtCzDXdaqhiRakJsz0bUj+3sOUjw82bJDcJrAzQ0u+M=
    github.com/rivo/tview v0.0.0-20210217110421-8a8f78a6dd01/go.mod h1:n2q/ydglZJ1kqxiNrnYO+FaX1H14vA0wKyIo953QakU=
    github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
    github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
    github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
    golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY=
    golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
    golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
    golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
    golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    
    opened by joegrasse 14
  • Example of popup Modal by shortcut

    Example of popup Modal by shortcut

    https://github.com/rivo/tview/wiki/Modal example list modal hardwired to root or Pages elements. But I already have List as my root element, and I want to show modal (without buttons) when I press i and close it on Esc or clicking outside. Would be nice to have an example that demonstrates how that's possible.

    The straightforward approach I tried that doesn't work.

            // Create UI elements
            list := tview.NewList()
            // Set Box properties on the List component
            list.SetBorder(true).SetTitle(" package updates ")
            // Set List properties
            list.ShowSecondaryText(false)
    
            infobox := tview.NewModal().
                    AddButtons([]string{"Quit", "Cancel"}).
                    SetText("Lorem Ipsum Is A Pain")
    
            // Attach elements and start UI app
            app := tview.NewApplication()
            app.SetRoot(list, true) // SetRoot(root Primitive, fullscreen bool)
            app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
                    if event.Key() == tcell.KeyESC {
                            app.Stop()
                    }
                    // Key is a character
                    if event.Key() == tcell.KeyRune {
                            if event.Rune() == 'q' {
                                    app.Stop()
                            }
                            if event.Rune() == 'i' {
                                    app.SetFocus(infobox)
                            }
                    }
                    return event
            })
    

    After pressing i the List border becomes single line, and it stops responding to events. Nothing else is shown. Pressing Esc doesn't revert to previous state, but exits the application.

    opened by abitrolly 0
  • Border styling example on the Box page

    Border styling example on the Box page

    https://github.com/rivo/tview/wiki/Box page is nice, but it could be better if it also listed how to style boxes.

    How to make a box border single line instead of double line? How to remove side borders and leave only the top with menu at the bottom?

    If Box is not the right element to make bottom menus, then a link tp a proper element with explanation why Box is not good would be nice.

    opened by abitrolly 0
  • The flexbox directions are reversed

    The flexbox directions are reversed

    Repr code:

    package main
    
    import (
    	"github.com/rivo/tview"
    )
    
    func main() {
    	app := tview.NewApplication()
    
    	flex := tview.NewFlex().SetDirection(tview.FlexRow)
    
    	flex.AddItem(
    		tview.NewBox().
    			SetBorder(true).
    			SetTitle("Left"),
    		0,
    		1,
    		false,
    	)
    
    	flex.AddItem(
    		tview.NewBox().
    			SetBorder(true).
    			SetTitle("Right"),
    		0,
    		1,
    		false,
    	)
    
    	if err := app.SetRoot(flex, true).SetFocus(flex).Run(); err != nil {
    		panic(err)
    	}
    }
    

    Expected behaviour:

    The Left and Right boxes to be on the left and right side of the terminal.

    Actual behaviour:

    image The Left and Right boxes are placed on the up and bottom sides of the terminal.

    My expectations are guided by experience, but here's the MDN reference for flexbox axes: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox#the_main_axis

    Is this the expected behavior of tview flexbox axes? If so, why? This doesn't make much sense to me.

    opened by franeklubi 4
  • [Feature Request] add Flex.GetItem()

    [Feature Request] add Flex.GetItem()

    Related: #385

    opened by ghost 0
  • Add batch writer for TextView's

    Add batch writer for TextView's

    I'd like to propose this as an alternative superset to #641 (See also discussion in #636).

    This allows for backwards compatibility by not modifying the locking characteristics of Write, but also gives us a way to perform writes in a tight loop without incurring the overhead of locking.

    Usage would look like this:

    tv := tview.NewTextView()
    
    w := tv.BatchWriter() // Lock acquired
    defer w.Close() // Lock released
    w.Clear()
    for {
      w.Write(/* some long write, copy, etc. in a loop */)
    }
    
    opened by SamWhited 0
  • feature request: expose number of lines in text on `TextView`

    feature request: expose number of lines in text on `TextView`

    Use-case:

    I'm dynamically updating a TextView with content from stdout (so is #645), and I'd like to efficiently check the total number of lines ("\n" delimited) in the view. I'm using the view's line-count to:

    • Handle empty standard-output appropriately
    • Display a total-line and current-line widget in the header

    At the moment, I use a multiwriter to copy stdout to a buffer, and count lines from there. This is untidy.

    Ideally I could call

    tview.GetLineCount()
    

    that would wrap this functionality.

    Implementation:

    tview.GetLineCount()

    is based of a private value lineCount in the TextView struct. This value would be updated in .Write and .SetText and wherever else it's needed (reindexBuffer?), and would be capped by the struct value maxLines if present.

    Related Issues:

    • #451
    opened by rgrannell1 2
  • Feature request: table.SetBorders(horizontal,  vertical bool)

    Feature request: table.SetBorders(horizontal, vertical bool)

    Table is used frequently to select by table row, table.SetBorders(horizontal=true, vertical=false) could get more nice look

    opened by treesong 1
  • Feature request: Support table.SetRowHeight(int)

    Feature request: Support table.SetRowHeight(int)

    While table has several columns and the screen width is not enough to display them. To show more info, I wish the table cell can contain two lines.

    opened by treesong 1
  • Is there a way to make a box a

    Is there a way to make a box a "terminal view" ?

    I was trying to create a UI that would look something like:

    ------------ Info About Files In Sync To Server -------------
    | detected file change                                      |
    | uploading file to remote server                           |
    | successfully uploaded                                     |
    -------------------------------------------------------------
    -------------- Bash Session On Remote Server ----------------
    | welcome to remote server                                  |
    | $> _                                                      |
    |                                                           |
    |                                                           |
    |                                                           |
    |                                                           |
    |                                                           |
    |                                                           |
    |                                                           |
    -------------------------------------------------------------
    

    Where the top box is just information about detecting local file changes and syncing those upstream and the bottom one is a bash terminal / ssh session to said upstream. Something where the bottom window could receive an stdin, stderr, stdout.

    At first glance I don't see a way to make something like this happen. Am I missing something?

    opened by khepin 8
  • Invert text on InputField focus

    Invert text on InputField focus

    (may be related to #611)

    Source Reference

    Is it currently possible to invert an InputField's content on focus? My use-case is I'm using an InputField to input commands to execute, and I'd like to invert when focused and "normal" when focused on another item.

    InputField does not support SetDynamicColors (which is fair from an API design standpoint), but supports several colour setters that accept tcell colours. Is it possible to invert colours (SGR 7) using InputField setters and tcell?

    The closest "color" I can find is ColorReset

    I don't want to hardcode colorBlack and colorWhite since this may clash with a user's terminal scheme; I want to respect what colours are already in place.

    For example (using ANSI):

    print "rl: some other text    line 1 / 20\n"; print "a"; print b; print c; print d; print e; print; print "\u001b[7m> Focused Input\u001b[0m"
    

    Screenshot from 2021-09-13 18-44-12

    print "rl: some other text    line 1 / 20\n"; print "a"; print b; print c; print d; print e; print; print "> Unfocused Input\u001b"
    

    Screenshot from 2021-09-13 18-45-13

    opened by rgrannell1 1
Owner
rivo
rivo
Terminal UI library with rich, interactive widgets — written in Golang

Rich Interactive Widgets for Terminal UIs This Go package provides commonly needed components for terminal based user interfaces. Among these componen

rivo 6.1k Oct 24, 2021
Golang terminal dashboard

termui termui is a cross-platform and fully-customizable terminal dashboard and widget library built on top of termbox-go. It is inspired by blessed-c

Zack Guo 11.3k Oct 21, 2021
Tool for shell commands execution, visualization and alerting. Configured with a simple YAML file.

Sampler. Visualization for any shell command. Sampler is a tool for shell commands execution, visualization and alerting. Configured with a simple YAM

Alexander Lukyanchikov 9.1k Oct 24, 2021
vgrep - a user-friendly pager for grep

vgrep is a pager for grep, git-grep, ripgrep and similar grep implementations, and allows for opening the indexed file locations in a user-specified e

Valentin Rothberg 514 Oct 16, 2021
Soren L. Hansen 1.4k Oct 25, 2021
Share your terminal as a web application

GoTTY - Share your terminal as a web application GoTTY is a simple command line tool that turns your CLI tools into web applications. Installation Dow

Iwasaki Yudai 15.9k Oct 15, 2021
🧑‍💻📊 Show off your most used shell commands

tsukae ??‍?? ?? Tsukae, 使え - means use in Japanese (so it refers to commands that you use) Built on top of termui and cobra Big shoutout to jokerj40 f

Ilya Revenko 415 Oct 11, 2021
Secure, private and feature-rich CLI password manager

Kure Kure is a free and open-source password manager for the command-line. This project aims to offer the most secure and private way of operating wit

Gastón Palomeque 110 Oct 17, 2021
🔥 [WIP] Interactive Jira Command Line

JiraCLI Interactive Jira CLI ?? This project is still a work in progress ?? This tool mostly focuses on issue search and navigation at the moment. How

Ankit Pokhrel 212 Oct 19, 2021
Make Highly Customized Boxes for your CLI

Box CLI Maker ?? Box CLI Maker is a Highly Customized Terminal Box Creator. Features Make Terminal Box in 8️⃣ inbuilt different styles 16 Inbuilt Colo

Swastik Baranwal 155 Oct 22, 2021
Building powerful interactive prompts in Go, inspired by python-prompt-toolkit.

go-prompt A library for building powerful interactive prompts inspired by python-prompt-toolkit, making it easier to build cross-platform command line

Masashi Shibata 4.2k Oct 20, 2021
Bit is a modern Git CLI

bit is an experimental modernized git CLI built on top of git that provides happy defaults and other niceties: command and flag suggestions to help yo

Chris Walz 5.7k Oct 16, 2021
Disk usage analyzer with console interface written in Go

Gdu is intended primarily for SSD disks where it can fully utilize parallel processing. However HDDs work as well, but the performance gain is not so huge.

Daniel Milde 1.4k Oct 24, 2021
Advanced ANSI style & color support for your terminal applications

termenv lets you safely use advanced styling options on the terminal. It gathers information about the terminal environment in terms of its ANSI & col

Christian Muehlhaeuser 815 Oct 15, 2021
A modern and intuitive terminal-based text editor

micro is a terminal-based text editor that aims to be easy to use and intuitive, while also taking advantage of the capabilities of modern terminals

Zachary Yedidia 17.9k Oct 20, 2021
Interactive CLI helper for creating git branches with JIRA Links and some text

bb (better-branch) Interactive CLI helper for creating git branches with JIRA Links and some text Still in development? Yes How it works? This tiny ut

Eugene Uvarov 3 Sep 11, 2021
💻 PTerm | Pretty Terminal Printer A golang module to print pretty text

✨ PTerm is a modern go module to beautify console output. Featuring charts, progressbars, tables, trees, and many more ?? It's completely configurable and 100% cross-platform compatible.

null 2.1k Oct 22, 2021
A golang library for building interactive prompts with full support for windows and posix terminals.

Survey A library for building interactive prompts on terminals supporting ANSI escape sequences. package main import ( "fmt" "github.com/Alec

Alec Aivazis 2.7k Oct 22, 2021
A terminal based graphical activity monitor inspired by gtop and vtop

NO LONGER MAINTAINED. A maintained fork of gotop exists at https://github.com/xxxserxxx/gotop. Another terminal based graphical activity monitor, insp

Caleb Bassi 7.1k Oct 17, 2021