Making a better, somewhat prettier, but definitely more functional Windows Command Line
I've blogged before, in fact in 2004, (!) that Windows is missing the text mode boat. There is a massive opportunity for a great, nay, awesome and pretty, command line on Windows. If someone cracks this problem, they're gonna be heroes.
I love iTerm2 and its tabs, its font handling, its simple elegance. I want this on Windows. In 2011 I found Console2, and then in 2012 I moved to ConEmu, a great tabbed terminal for Windows. Even then, it's not "pretty." I love these guys, and the ConEmu is truly an amazing and configurable piece of software, but it was written by developers for developers. I have to change the fonts to Consolas for the main font and Segoe UI for the rest to make it tolerable. Am I being petty and focusing on looks? Absolutely. Gorgeous and functional software is why Mac companies like Panic exist. They make things that are pretty AND functional. Windows folks could definitely "lovingly design" stuff more.
Here's some command line utilities that augment and help - but don't yet complete save - the Windows Command Line.
Clink
I just learned about Clink and I'm hooked. It's hooked as well, directly into your cmd.exe window! *rimshot*
We all know that there's Cygwin for a bash-like experience in Windows, but Click is a small utility that brings some of those productivity and editing features into cmd.exe directly!
- Bash-like line editing from GNU's Readline library. Read more on Readline's keyboard shortcuts.
- Better path completion (TAB).
- Paste from clipboard (Ctrl-V). Oh yes.
- Support for the completion of executables/commands, and environment variables.
- Undo/Redo (Ctrl-_ or Ctrl-X, Ctrl-U)
- Improved command line history.
- Persists across sessions.
- Searchable (Ctrl-R and Ctrl-S).
- History expansion (e.g. !!, !
, and !$).
The most significant change that Clink makes is to Tab Completion, moving to a more Bash-y "show them the choices" mode rather than the DOS-like "make them cycle through everything." Here I've pressed TAB over 2013-0 and Clink is showing me what I can choose from.
PowerShell ISE
Surprise! You already have this on your Windows computer. Ya, it freaked me out also. You can even hide the script pane if you want (Ctrl-R) and just use PowerShell ISE as a console! You get auto completion (see the Directory intellisense below), coloring, aliases and all the power of PowerShell.
Sure, it's not bash, but that may be a good thing. You may not have been exposed to PowerShell and the prospect may frighten you, but try it for a bit. They've aliased the obvious commands "ls" does what you'd expect as does "dir." Moving around will feel like any command prompt.
Not to mention if you are using PowerShell you already get a full debugger experience.
It won't win any awards for good looks (again, I come back to the importance of fonts, whitespace, and good typography...get a designer) but it is extremely functional and you already have it!
ConEmu
I've talked about ConEmu before, but I'll bring some of that over here. ConEmu takes your command prompt and adds tabs, status bar details, admin tabs, freakin' taskbar progress bars on copies (which is hot), and deep support for FarManager (Norton Commander anyone?)
ConEmu is definitely a huge jump for console usability on Windows. The feature that really blew me away was Progress Bar integration. If you're familiar with Windows 7 you are likely familiar with the way that progress bars are overlaid over a Windows 7 Taskbar button. ConEmu looks at the current application running and some heuristics and overlays progress. Madness. Do a chkdsk and watch the progress bar. Love this little detail.
Git for Windows or Cygwin
If you want a Linux-like experience on Windows with a nice shell, Cygwin has long been a choice. However, since the release of Git for Windows most folks I know just install it and use the Git Bash. If you get Cygwin proper you'll get a much more complete "fake Linux" through their very competent set of command line tools, but for most, Git Bash will suffice.
What about SSHing? That's a fundamental part of command-line life for folks connecting to remote Unix machines. For me, I have a Linux farm I run on Azure that I often need to ssh into.
Random: I like to say I 'shoosh' into the machines, but folks keep looking at me weird. I thought this was a thing?
However, the SSH clients for Windows suck. Ok, they don't suck, but they are ugly. It's scandalous how ugly. Mad respect to PuTTY for being awesome and super functional, but it's like running Windows 95 in a window every time I launch it. Here's some better SSH clients, including a fork of PuTTY itself.
Bitvise SSH Client - more importantly, SSH from the command line
The Bitvise SSH Client is free for personal use and works great. There's a whole GUI, and, bless them, it's not pretty. However! There's also a command line version which is the REAL treasure. I just want to type ssh and be on my way.
In fact, I made a batch file called "ssh.bat" and put it in my PATH that just has this inside: "stermc %1" this means I can just type ssh user@hostname:port and be on my way. This is, for me, WAY easier than putty for most things. Bitcise is definitely worth checking out.
Kitty
Kitty is a fork of version 0.62 of the original PuTTY. There's also a portable version that I've put in my Dropbox utils folder (which is in my PATH) so it's on every machine I have automatically. Kitty has some nice features like Send to Tray, transparency, session launching (so you don't need Pageant), and lots of little poweruser features like "rolling up" the app if you Ctrl-Click on the Title Bar.
Kitty also can integrate into your browser to handle ssh:// links, which is a nice touch.
What console app improvers have I missed? What do you use on Windows? Sound off in the comments.
Sponsor: Big thanks to the folks at RedGate for sponsoring the feed this week. Take a moment and check out their free download of Deployment Manager! Easy release management: Deploy your .NET apps, services and SQL Server databases in a single, repeatable process with Red Gate’s Deployment Manager. There’s a free Starter edition, so get started now!
About Scott
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
About Newsletter
My TakeCommand setup starts two tcc.exe (JPSoft's cmd.exe replacement) tabs and two Powershell tabs.
The real power lies in tcc's extended functions and built in variables.
JPSoft offers both free and subscription versions.
Highly recommended.
I was thrilled to discover puttycyg, which allows you to use putty for your local cygwin terminal.
However, I will still primarily use Cygwin for one feature that Clink nor Powershell ISE seem to provide...
Console output to the command window!
Whilst I love debugging in Visual Studio. Sometimes for performance / testing reasons a simple Console.WriteLine() output is the best (only) way to debug. And Cygwin seems to be the only way to access that output from what I've tried so far.
Anyone have any tips?
Since there are so many dials and knobs, and it takes a while to figure out what they do and get it right, I built a Chocolatey package to get a nice ConEmu setup in place quickly. It will install Adobe's SourceCode Pro (IMHO, the best fixed width terminal / programming font around), and configures a nice clean Base16 color scheme.
It also sets up a PS Admin tab, a regular PS tab and a Git Bash tab.
More details can be found on the Chocolatey page -- http://chocolatey.org/packages/EthanBrown.ConEmuConfig
And of course, my package is open source, so feel free to fork and create your own variations.
Enjoy!
Robert - Amazing find! I'm checking that out now!
CB - Good point, TakeCommand is an oldie but an actively developed ecosystem with a lot of fans!
Ethan - I love that you made your config a NuGet with cinst. Kudos.
EvilKiru - Dude, I was all about 4DOS back in the day.
I can only hope that as typography as a design principle takes off again -- thanks to the Metro UI -- that some Windows developers will apply the same principles to dealing with the command line. After all, the command line is the natural environment for text, numbers, tables, grids -- it should really be a delight to work there. It would also be great to see more IDE concepts like IntelliSense take root -- after all, you can do far more damage with a single typo at the command-line than you could in a file in Visual Studio, which will warn you about syntax errors, provide refactoring tools, code completion, etc., etc. I don't think the a command line IDE needs to go the WYSIWYG 'dark side' but it's strange that in 2013 it's such as Wild West environment, with little support and complete freedom to screw up your file system ...
http://channel9.msdn.com/Forums/Coffeehouse/Is-Microsoft-risking-irrelevancy-bc-of-lack-of-POSIX-compitability
It even mentions your podcast with Paul Irish :-)
I use Linux hosts for a lot of my work, using PuTTY for SSH. I found a custom fork of PuTTY that uses Direct2D/DriectWrite. It supports Aero Glass if you are into that kind of thing (and I am), and many styles of transparency (e.g. background is transparent but text is not!).
Like you, I think that my workstation should be beautiful and functional (I look at it all day). Here is a screenshot of my shell setup and the custom variant of PuTTY.
You can download the fork of PuTTY (source included) here: http://ice.hotmint.com/putty/d2ddw.html. The author is from Japan, so you might want to fire up your favorite translator.
And with different session profiles defined for local cygwin and various remote servers, I use a simple AutoHotKey script to setup keyboard shortcuts for easily starting the sessions. Ctrl-Alt-c opens a local cygwin session, Ctrl-Alt-d opens a session to server-D, etc.
Works great for me.
Thank you very much for this article, Scott!
Specifically, this thread requesting Windows terminal emulator recommendations.
Alt+space, e, p.
Works in the default PowerShell window, too.
Not pretty, but I've been using it for years, and it's in muscle memory for me at this point!
If it's not a thing, I'll do my part to spread it. From now on I will refer to it as 'shoosh'-ing :-)
I was saying 'shish'-ing occasionally but I like your 'shoosh'-ing much better. Thanks!
As for ssh.exe - I did not have to install anything more than the Git for Windows (and add the C:\Program Files (x86)\Git\bin directory to my PATH) to get ssh functionality in my cmd prompt.
When it comes to development environments, you should glance at Vagrant (http://vagrantup.com) as well - they support Windows environments - you can create virtualbox images of your server environment and spin them up at will with configurations for individual projects, etc. Works great in conjunction with ConEmu.
It uses javascript as the scripting language, and you can automate a lot of stuff.
Really nice
In fact, I made a batch file called "ssh.bat" and put it in my PATH that just has this inside: "stermc %1"
You could have created a ssh.bat that did putty -ssh %1 just as easily. Presumably Kitty supports this syntax as well.
This syntax is in the PuTTY Help File under PuTTY FAQ -> HOWTO Questions... which also covers loading a saved session from the command line, which is handy for those you have certificates for.
It brings intellisense to console version of powershell and to ConEmu of course ;)
Screenshot 1, screenshot 2.
What about the GnuWin32 collection?
http://gnuwin32.sourceforge.net/
One of the first things I do on a new build is pretty much install everything here, and off the bat that gives me a full POSIX compliant command line environment where things like awk, sed, diff, grep and more just work exactly the same as I'm used to on *nix.
Most of the utils don't require the cygwin runtimes either as a lot of them are natively compiled against the required win32 subsystems.
All of them just run from cmd.exe and can be piped together using | in exactly the same way most are used too.
There are a few quirks with the handling of speech marks (") , but that's due mainly to cmd not handling double and single as transparently as bash and others do. Install all of these however, then use git bash (as previously mentioned) and it's win all the way.
Basically, I use console2 (although I will check out ConEnu), and PyCmd for all the awesome I need.
Comments are closed.