Terminal.Gui: A Cross Platform Terminal UI Toolkit for .NET
249 points by manjana 2 years ago | 80 comments- malkia 2 years agoOn the C++ front, I've been using this and love it - https://github.com/ArthurSonzogni/FTXUI - it also has wasm target, so may target the web.
I'm regular Far Commander on Windows, and Midnight Commander, also known as mc on Linux/OSX. In fact my "Command-Prompt" on Windows is always FAR (this comes with certain limitations, but I'm so used to it, I can't do my normal work without it). I could never get into the Explorer, and only use it in rare cases.
- WorldMaker 2 years agoRelatedly, this exact C# library was started by and a lot of early contributions were from Miquel de Icaza who also started Midnight Commander.
- hdjjhhvvhga 2 years agoLooks great, thanks!
As for Orthodox File Managers, I'm in the same camp and I could never understand how people can be productive with bare Explorer window. Most operations of files and directories require more work (keystrokes/mouse movements) than in OFMs. Not to mention things like having a quick look into any text file, for example (F3-Esc) as opposed to double clicking - running an external viewer - closing it. Practically everything in OFMs can be done faster.
- lostmsu 2 years agoThe main way I navigate these days is global search through Everything. File operations apart from saving and opening files are extremely rare, and I just do them from PowerShell via command history.
- cek 2 years agoDo you happen to use "F7 History" [1] which is based on `Out-ConsoleGridView`, which, in-turn is built on Terminal.Gui?
If not, why not? (Because I'd love to make it even better).
- cek 2 years ago
- lostmsu 2 years ago
- sebastianconcpt 2 years agoOh thanks for sharing! I wanted bad something modern like this!!!
- WorldMaker 2 years ago
- hazrmard 2 years agoLooking at the demo images, I must admit that I have some traumatic memories associated with that shade of blue on a console :) Mostly from fiddling with BIOS settings etc.
My only experience with C# is in using the Unity 3D game engine. Now with a console apps ecosystem, cross-platform focus, GUI libraries, machine learning stuff, mobile apps. It's becoming an attractive prospect by the day.
- malkia 2 years agoAnd to me the opposite - Turbo/Borland Pascal/C++, or the E3 editor. Okay, turns out blue is not great color for you - but that was the "dark" theme at the time.
- sixothree 2 years agoAgreed and this library definitely sparks joy; especially since I was looking for something just like this recently for a quick project.
- sixothree 2 years ago
- babypuncher 2 years agoC# the language has always felt like "Java, but better".
Now with .NET Core embracing cross platform and maturing nicely, it feels like the whole ecosystem can be described as "Java, but better". On Windows, it's already been there for a decade or more, but the label never felt right when hosting on Linux meant using an alternative runtime like Mono.
- tecleandor 2 years agoHah! But it also feels a bit Norton Commander to me, and that's not that bad ;)
- DesiLurker 2 years agoAlso somehow reminded me of the old Borland Turbo-C++ 'IDE'. would love to have something like that with good tag navigation for daily driver.
- VikingCoder 2 years agoAlso "XTree" which was probably the best software ever for DOS.
- VikingCoder 2 years ago
- DesiLurker 2 years ago
- xupybd 2 years agoF# is even better. It is an amazing fun and productive language to work in. At the end of the day a language is just a language, but much the a keyboard some are more comfortable than others. I find F# very comfortable. C# is also very nice to work in. C# is probably a better choice as you spend less novelty points.
- int_19h 2 years agoBlue background was a very common convention for DOS TUI. I'm not sure which app started it, but it was seen in MS-DOS editor / QBASIC; Norton Commander and its numerous clones; Turbo/Borland Pascal and C++; Microsoft C, Pascal and VB for DOS; FoxBASE / FoxPro; and so on.
- malkia 2 years ago
- jabart 2 years agoAbout four years ago I had a meeting with a distributor who had terminal app and wanted to move it to a web based app. Everyone had the keyboard shortcuts memorized and did a quick demo that the refresh rate of the monitor was not fast (only slightly joking here) enough to go through all the screens they did for each task they had to do in this system. Interesting that this could be a useful replacement for something like that in a modern language.
- VikingCoder 2 years agoI don't think you're joking at all. People underestimate how quickly people can navigate through complex systems when they're given time to practice:
https://www.reddit.com/r/nextfuckinglevel/comments/xa50x1/ma...
- littlecranky67 2 years agoI remember the early 90s, when the women at the local groceries store (Aldi Germany) were equally as fast when typing in the prices of the articles using just a numpad keyboard on the register - before barcode scanners were a thing. Today it seems surreal or special, but back then you were basically considered a trained professional on the checkout counter.
- littlecranky67 2 years ago
- Mountain_Skies 2 years agoA state agency contracted us to replace their old green screen CSR system with a web based one. The existing CSRs hated the new system because they could get work done faster using the keystroke drive system they were accustomed to using. The client however was fine with this outcome because that job had very high turnover and it took too long for new employees to get to the point where they were highly productive. The handful of long term employees asked if they could have both systems running side by side but the client didn't want to have to support both. At least as state employees, this resetting of their productivity to that of new employees didn't impact their salary level that was based mostly on seniority.
- myth2018 2 years agoIn my country (Brazil) I sporadically meet people using TUI-based systems. Mostly COBOL but also a good amount of Clipper (or Harbour, maybe?).
I'm also aware of a couple of companies maintaining systems in Harbour and my parents use a web app written in Pascal -- I could tell by the error messages, which are extremely rare btw; the system is very stable, despite the frequent changes it goes through thanks to the tax-legislation mess we have here.
I started asking people about which type of system they prefer: those old dinosaurs or the good-looking, modern ones? 100% voted for the former. Why? "It's fast", they answer.
Some say it's because "they learned to work on those older systems and now are resisting to change". But this is simply false: even younger professionals, who grew using GUIs and web apps, prefer TUIs when it comes to get stuff done.
Such interfaces are also easier to develop. Then, I believe it would be a win-win if TUIs were widely readopted: happier users, systems cheaper to design, build and test.
But trends are so hard to change...
- int_19h 2 years agoIt would be more interesting to dive down and figure out what exactly the users like more about TUI. Just speed alone can't be it, because e.g. WinXP-era UI is blazing fast on modern hardware (and was plenty fast even back then). And if we know what it is, we can build GUIs that are just as efficient, but that also offer e.g. better text rendering etc compared to TUI.
I once had an interesting experience migrating users from a TUI to a GUI app, ~20 years ago. In that case, after watching them work for a while and asking some questions, the takeaway was that they really wanted the flow to be 100% keyboard-based. Which the GUI apps nominally provided (back then; less so these days), but all too often the correct tab order etc is ignored in practice, making it very difficult to use.
I made sure design the GUI with keyboard in mind, and that common patterns they've learned from TUI would still work. For example, the TUI had a textbox above a listbox, and it was common for users to press arrow-down to navigate from the textbox to the first item in the list, and arrow-up to navigate from the list back into the textbox. This isn't normal behavior for GUI, but I coded it in anyway.
- myth2018 2 years ago> It would be more interesting to dive down and figure out what exactly the users like more about TU
Indeed. When they say "it's fast", I don't read it simply as "the program is fast". They get their stuff done faster, and the program is simply a tool -- if further speed can be achieved with something else, so be it. It doesnt even need to be software.
However, I still think TUIs are in a better position due to lower development and maintainance costs. This can be achieved by GUI frameworks, for sure. But TUIs tend to be terser, and their natural limitations become an advantage when they make certain sorts of bullcrap (animations, for instance) undoable. I believe this contributes to long-term stability, as developers spend way less time dealing with useless requirements.
> the takeaway was that they really wanted the flow to be 100% keyboard-based
Good that you could draw such conclusion. I do think we should rely more on observation to find out what users need, as opposed to what they _say_ they need. I know this sounds condescending, but I dont mean that. I just believe thay it's hard for them to identify and verbalize some critical factors for their success and they need some mediation.
I also feel upset about the keyboard as a second-class citizen in modern systems. There's this UX design school of thought portraying users as creatures of extremely limited working memory, who can't even remember what they wanted when they clicked the option, and therefore need infantilized interfaces full of pictures and colorful buttons because they won't be able to memorize a handful of keyboard combinations
- myth2018 2 years ago
- int_19h 2 years ago
- cheriot 2 years agoI'm surprised keyboard shortcuts are not more normal in b2b web apps for this exact reason. There's no technical limitation. Bloomberg probably has the most profitable "terminal" UI, supports the same keyboard shortcuts it had a generation ago, and the whole thing was built on webkit last I heard.
- malkia 2 years agoI've heard the same about some day-trading companies, or anyone dealing with customers/clients and has to lots to input/navigate - they still keep old terminals to good use.
- VikingCoder 2 years ago
- bayesianbot 2 years agoGreat, there's some terminal programs I'd have preferred to code in C# but did in Python instead as I didn't know this exists.
First I thought resizing doesn't work but it seems it's only an issue with kitty, on alacritty it works as expected, in case anyone else is wondering the same.
- VikingCoder 2 years agoNeat!
I wish it also worked with something like xterm.js, a terminal in the browser.
Either by compiling .Net to WASM... Like Client-Side Blazor does, right?
...or using client-server technology... Like Server-Side Blazor does, right?
- cek 2 years agoTerminal.Gui maintainer here...
We're working on it [1]
[1] https://github.com/Blazor-Console/HACC/blob/main/README.md
- VikingCoder 2 years agoAwesome, and yes, +1 to the comment:
> A possible BBS with door games like ZMachine and a sea-faring game I'm writing in a private repo, (top secret!) which used to have the only test harness solution containing both the source and test repos.
My hot take would be to implement a lot of LambdaMOO [1]... in C#... because I like the grammar and parser [1], and I like reflection and attributes... and... Well, it's a thing I'd just like to exist.
[1] : https://www.hayseed.net/MOO/manuals/ProgrammersManual.html
- VikingCoder 2 years ago
- sceptically 2 years agoCorrect
- cek 2 years ago
- issung 2 years agoHow people get the mouse working in the terminal is one of those things I've always wondered how they do it, but never look into it because then the magic is gone. As a daily software engineer it's nice to have some things remain as magic
- _the_inflator 2 years agoIn a certain sense, this is so damn cute and pure DOS nostalgia. My next side project is going to be a Norton Commander I guess.
- lostmsu 2 years agoMake a TurboPascal-style VSCode clone instead? :)
- lostmsu 2 years ago
- raphinou 2 years agoI'm expecting a terminal UI to be primarily keyboard-driven, but the demo uses the mouse a lot. Anyone having experience with this library and able to confirm keyboard navigation is good by default?
- colanderman 2 years agoTab navigation and hotkeys are enabled by default. It's easy to add other keyboard overrides as well. You do not need a mouse to use it.
- BeefWellington 2 years agoI may be showing my age here, but I think most people would expect a TUI to provide arrow key navigation and highlight by default, which is not demonstrated.
Simply mapping Gui -> TUI isn't really a good user experience IME. The terminal should generally be keyboard-first/designed with keyboard-only in mind.
- cek 2 years agoTerminal.Gui maintainer here...
We view the mouse as optional. We want the mouse to work perfectly, but it should be optional. If any of the library doesn't work well with just a keyboard, please submit an issue!
- alkonaut 2 years agoAre there any specific examples from the demo that don't show proper highlights (i.e. that don't look exactly like e.g. TurboPascal, Norton Commander or Linux menuconfig in terms of hints/highlight/focus)?
This isn't an emulation of a mouse gui stuck in a terminal, this is literally a port of an older curses lib to the latest .net, so it doesn't feel like it should have any unnecessary influence from desktop ui systems at all.
- lostmsu 2 years ago> Simply mapping Gui -> TUI isn't really a good user experience IME
Nitpicking: gaming console GUIs are very accessible. I'd take them as a great starting point.
- cek 2 years ago
- BeefWellington 2 years ago
- colanderman 2 years ago
- gwbas1c 2 years agoWhat? No Blazor support? No mobile support? (Joke)
I think console UIs are good for a sweet spot where you need a "just good enough" UI that you can whip up in a few minutes. I hope this meets the sweet spot.
- cek 2 years agoI posted this above too, but for completeness... Blazor support is under development:
- VikingCoder 2 years agoI know you're joking, but I wish I had client-server support with xterm.js or something similar.
I'd like to write MUDs (Multi-User Dungeon games) in C#...
- Cthulhu_ 2 years agoiirc most MUDs use telnet, so any user can use whichever client they prefer - I'm sure there's ways to have xterm.js use telnet. There's this project that is a MUD using Telnet written in C#: https://github.com/cmackles/MudSharp
- VikingCoder 2 years agoYes, thanks, I'm aware most MUDs use telnet, but in my opinion, that's a barrier to entry to most users.
And thanks for the link, but it makes me sad to see a repro that was last updated 5 years ago.
> I'm sure there's ways to have xterm.js use telnet.
You have to have a server in-between to do straight telnet. (You can't do a vanilla TCP/IP connection from the browser.)
So I'd like to have WebSockets + xterm.js taking the place of telnet + terminal...
And then I'd like a .Net API that looks like curses, or like this GUI, or something... and that persists the console (like tmux or something), so if the user re-connects, they get their view restored "automagically."
- airstrike 2 years agoWhat we really need is a MUD that is fed through StableDiffusion -> NeRF and outputs a 3D map for you to play in
- VikingCoder 2 years agoOh, also...
If I had this thing I want, I could also use it as a debug console for servers...
- VikingCoder 2 years ago
- Cthulhu_ 2 years ago
- cek 2 years ago
- mu_killnine 2 years agoWhat a wonderful project. Bookmarked for the next time I need something nice in the terminal :)
Way to go, team.
- kgwxd 2 years agoI'm going to use the heck out of this but I can't even touch it until I know exactly why it's named Terminal._G_ui. I figured an explanation would be in the first sentence. The G better stand for something super clever :)
- gulabjamuns 2 years agoWhat are the prerequisites for installing on MacOS ? Thanks.
- ripley12 2 years agoTrying to give you a fairly complete answer: It's a .NET library, the prerequisites are the same as any .NET library.
If you want to write code in .NET you will need to install the .NET SDK.
If you just want to run an application written in .NET... it depends. Apps can be shipped with a built-in .NET runtime ("self-contained"), which makes them bigger on disk but they don't need any prerequisites installed. Apps can also be shipped without a .NET runtime ("framework-dependent"), in which case the user needs to have a shared runtime installed to run the app.
- cek 2 years agoJust the latest .NET Core runtime.
- ripley12 2 years ago
- amelius 2 years agoHow is state managed?
- cek 2 years agoThe Terminal.Gui library itself doesn't provide any special means for dealing with state. However, the full power of .NET Core is available for devs to do whatever they please.
- cek 2 years ago
- ape4 2 years agoIs there a Terminal.somethingElse too ?
- zamadatix 2 years agoIt's just the naming convention of .NET stuff, e.g. someone else has a NuGet package for "Terminal.Connector" and someone else has one for " Rebex.Terminal.SerialPort" but none of these are related. I will say normally you'd stick some sort of group/developer/company identifier in front though like the Rebex example has but it's not a hard and fast rule.
- zamadatix 2 years ago
- rod_ochoa 2 years agoAmazing!
- 2 years ago
- mavu 2 years ago"Cross platform" and .NET
Very funny.
- benbristow 2 years agohttps://dotnet.microsoft.com/en-us/
If you haven't looked at .NET in a few years, you'd be surprised.
- hulitu 2 years agoDoes it run from a network share ?
- hulitu 2 years ago
- jeremycarter 2 years agoYou living under a rock? You've been able to do cross platform .NET since forever, first with Mono and now with .NET Core and .NET latest.
- daigoba66 2 years agoMaybe funny 4-5 years ago, but these days it’s incredibly well supported across Windows/Linux/MacOS.
- benbristow 2 years ago
- bongobingo1 2 years agoHow fast does it stream a 10gb file though?
- hulitu 2 years agoWhy would a terminal stream a file ? RCE ?
- julianz 2 years agoPretty sure this is a Casey Muratori reference. Doesn't really apply to the current project as it's a UI on top of the existing terminal rather than a whole new terminal.
More details: https://www.youtube.com/watch?v=hxM8QmyZXtg
- julianz 2 years ago
- hulitu 2 years ago