Scott Hanselman

Windows 10 gets a fresh command prompt and lots of hotkeys

October 1, '14 Comments [28] Posted in Tools | Win10
Sponsored By
image

Much has been written and much will be written about the Windows 10 announcement.

I'm pretty stoked, and am playing with the Windows 10 Technical Preview now. I can see that there's lots of new enhancements to the shell, the Start Menu/ Screen, how Universal apps work, and so much more. But, let's focus on the "other shell." The console!

The console (conhost) that cmd.exe (often incorrectly but colloquially called the DOS Prompt) and PowerShell live within hasn't had much love in the last several years, IMHO. But then, suddenly, on stage at the Windows 10 announce we've got a VP showing folks that Ctrl-V (paste) works in the command prompt. Why would he do such a crazy thing?

Well, from what I can tell looking at the Preview, there's a LOT of cool Console goodness coming in Windows 10.

Here's a list of hotkeys in the Windows 10 Technical Preview console. This is just hotkeys! Be sure to explore the Properties dialog as well, resize, word wrapping, and more.

Text selection keys

These combinations interoperate with the mouse so you can start selecting with the mouse and continue with one of these commands, or vice versa. 

Selection Key Combination

Description

SHIFT + LEFT ARROW

Moves the cursor to the left one character, extending the selection.

SHIFT + RIGHT ARROW

Moves the cursor to the right one character, extending the selection.

SHIFT + UP ARROW

Selects text up line by line starting from the location of the insertion point.

SHIFT + DOWN ARROW

Extends text selection down one line, starting at the location of the insertion point.

SHIFT + END

If cursor is in current line being edited

* First time extends selection to the last character in the input line.

* Second consecutive press extends selection to the right margin.

Else

Selects text from the insertion point to the right margin.

SHIFT + HOME

If cursor is in current line being edited

* First time extends selection to the character immediately after the command prompt.

* Second consecutive press extends selection to the left margin.

Else

Extends selection to the left margin.

SHIFT + PAGE DOWN

Extends selection down one screen.

SHIFT + PAGE UP

Extends selection up one screen.

CTRL + SHIFT + RIGHT ARROW

Extends the selection one word to the right.

CTRL + SHIFT + LEFT ARROW

Extends the selection one word to the left.

CTRL + SHIFT + HOME

Extend selection to the beginning of the screen buffer.

CTRL + SHIFT + END

Extend selection to the end of the screen buffer.

CTRL + A

If cursor is in current line being edited (from first typed char to last type char) and line is not empty and any selection cursor is also within the line being edited

Selects all text after the prompt.  (phase 1)

Else

Selects the entire buffer.  (phase 2)

Extra Fun with CTRL + A

CTRL + A behavior is interesting. Regardless of the state of mark mode and quick edit mode, one of two things should happen. Either the entire buffer is selected, or (only in a single case) '2-Phase select' starts.  2-Phase select is the process where the first CTRL-A selects the characters to the right of the edit line prompt, and the second press selects the entire buffer.

Editing keys

As I mentioned above you can copy and paste text with the keyboard. When copying text, you might worry that CTRL + C has always been the BREAK command. This is a nice touch, it will still send the break signal to the running application when no text is selected. The first CTRL-C copies the text and clears the selection, and the second one signals the break. Nice attention to detail, IMHO.

Editing Key Combination

Description

CTRL + V

Paste text into the command line.

SHIFT + INS

Paste text into the command line.

CTRL + C

Copy selected text to the clipboard.

CTRL + INS

Copy selected text to the clipboard.

Mark mode keys

These keys function in mark mode. You can enter this mode by right-clicking anywhere in the console title bar and choosing Edit->Mark from the context menu as before, or via the new shortcut combination, CTRL-M. In the original console, mark mode resulted in block mode text selection. While in mark mode, you can hold down the ALT key at the start of a text selection command to use block mode in the new console. The selection key combinations above are all available in mark mode. CTRL + SHIFT + ARROW operations select by character and not by word while in mark mode.

Mark Mode Key Combination

Description

CTRL + M

Enter "Mark Mode" to move cursor within window.

ALT

In conjunction with one of the selection key combinations, begins selection in block mode.

ARROW KEYS

Move cursor in the direction specified.

PAGE KEYS

Move cursor by one page in the direction specified.

CTRL + HOME

Move cursor to beginning of buffer.

CTRL + END

Move cursor to end of buffer.

History navigation keys

Navigation  Key Combination

Description

CTRL + UP ARROW

Moves up one line in the output history.

CTRL + DOWN ARROW

Moves down one line in the output history.

CTRL + PAGE UP

Moves up one page in the output history.

CTRL + PAGE DOWN

Moves down one page in the output history.

Other keys

Other Key Combination

Description

CTRL + F

Opens "Find" in console dialog.

ALT + F4

Close the console window, of course!

If you are like me and also love the console and want it to get even better, head over to the Windows Command Prompt Uservoice and be heard!

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.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Inception-Style Nested Data Formats

September 30, '14 Comments [44] Posted in Musings
Sponsored By

Dan Harper had a great tweet this week where he discovered and then called out a new format from IBM called "JSONx."

"JSONx is an IBM standard format to represent JSON as XML"

ByUETcKIIAELf7h

Oh my. JSONx is a real thing. Why would one inflict this upon the world?

Well, if you have an existing hardware product that is totally optimized (like wire-speed) for processing XML, and JSON as a data format snuck up on you, the last thing your customers want to hear is that, um, JSON what? So rather than updating your appliance with native wire-speed JSON, I suppose you could just serialize your JSON as XML. Send some JSON to an endpoint, switch to XML really quick, then back to JSON. And there we are.

Storing a BMW inside another

But still, yuck. Is THIS today's enterprise?

In 2003 I wrote a small Operating System/Virtual Machine in C#. This was for a class on operating systems and virtual CPUs. As a joke when I swapped out my memory to virtual memory pages on disk, I serialized the bytes with XML like this:

<byte>8</byte>

Hilarious, I thought. However, when I showed it to some folks they had no problem with it.

DTDD: Data Transformation Driven Development?

That's too close to Enterprise reality for my comfort. It's a good idea to hone your sense of Code Smell.

Mal Sharmon tweeted in response to the original IBM JSONx tweet and pointed out how bad this kind of Inception-like nested data shuttling can get, when one takes the semantics of a transport and envelope, ignores them, then creates their own meaning. He offers this nightmarish Gist.

--
Http Response Code: 200 OK
--
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<meta name="status" content="409"/>
</head>
<body class="X-LProd-API-Response">
{&quot;errorCode&quot;:&quot;ItemExists&quot;,&quot;errorMessage&quot;:&quot;EJPVJ9161E: Unable to add, edit or delete additional files for the media with the ID fc276024-918b-489d-9b51-33455ffb5ca3.&quot;}
</body>
</html>

Here we see an HTML document returned presumably is the result of an HTTP GET or POST. The response, as seen in headers, is an HTTP 200 OK.

Within this HTML document, is a META tag that says, no, in fact, nay nay, this is not a 200, it's really a 409. HTTP 409 means "conflict," and it usually means that in the context of a request. "Hey, I can't do this, it'll cause a conflict, try again, user."

Then, within the BODY OF THE HTML with a Body tag that includes a CSS class that itself includes some explicit semantic meaning, is some...wait for it....JSON. And, just for fun, the quotes are HTML entities. &quote;

What's in the JSON, you say?

{
"errorCode": "ItemExists",
"errorMessage": "EJPVJ9161E: Unable to add, edit or delete additional files for the media with the ID fc276024-918b-489d-9b51-ffff5ca3."
}

Error codes and error messages that include an unique error code that came from another XML document downstream. Oh yes.

But why?

Inception Nested Data FormatsIs there a reason to switch between two data formats? Sure, when you are fully aware of the reason, it's a good technical reason, and you do it with intention.

But if your system changes data formats a half-dozen times from the moment leaves it's authoritative source on its way to the user, you really have to ask yourself (a half-dozen times!) WHY ARE WE DOING THIS?

Are you converting between data formats because "but this is our preferred format?" Or, we had nowhere else to stick it!

Just because I can take a JSON document, HTML encode it, tunnel it with a SOAP envelope, BASE64 that into a Hidden HTML input, and and store it in a binary database column DOES NOT MEAN I SHOULD.

Sometimes there's whole teams who exist only as a data format transformation as they move data to the next team. 

Sound Off

What kinds of crazy "Data Format Inception" have you all seen at work? Share in the comments!

UPDATE: Here's an insane game online that converts from JSON to JSONx to JsonML until your browser crashes!

P.S. I can't find the owner of the BMW picture above, let me know so I can credit him or her and link back!

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.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

How do I set different wallpapers for each monitor in Windows?

September 25, '14 Comments [27] Posted in Tools
Sponsored By

I wanted a different wallpaper (or "screensaver," for the non-technical relatives, because I know you call desktop wallpaper that) for each of my multiple monitors in Windows. To start changing your wallpaper, first right-click on the desktop on click Personalize.

Right click to Personalize

Click the words "Desktop Background" at the bottom of the Personalization dialog.

How to change your Desktop Background

Now, from here, if you LEFT-click a wallpaper you're selecting that wallpaper for ALL your monitors.

BUT, if you RIGHT-click on an image, you can set wallpapers individually.

Right click to set wallpaper individually

Enjoy!

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.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Towards a better console - PSReadLine for PowerShell command line editing

September 25, '14 Comments [22] Posted in Open Source | PowerShell
Sponsored By

Sometimes textmode is where it's at. I've long blogged about tools and techniques that will make your Windows console experience better. Perhaps you're a *nix person who is using Windows in your day job, or you wish the Windows PowerShell prompt was more nix-y. Or perhaps you're a PowerShell person who wants to take your command-line to the next level.

Well, just as NuGet is how we get .NET libraries quickly, and Chocolately is a kind of apt-get for Windows, PsGet is a way to easily add PowerShell modules to your prompt.

To install PsGet you run this script (feel free to vet it):

(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex

Once you've got PsGet, the purpose of this post is to introduce you to PSReadLine.

To install PsReadLine with PsGet, just

install-module PsReadLine

If you want to install PsReadLine manually, you can from their readme. It does a LOT:

PsReadLine replaces the command line editing experience in PowerShell.exe. It provides:

  • Syntax coloring
  • Simple syntax error notification
  • A good multi-line experience (both editing and history)
  • Customizable key bindings
  • Cmd and emacs modes (neither are fully implemented yet, but both are usable)
  • Many configuration options
  • Bash style completion (optional in Cmd mode, default in Emacs mode)
  • Bash/zsh style interactive history search (CTRL-R)
  • Emacs yank/kill ring
  • PowerShell token based "word" movement and kill
  • Undo/redo
  • Automatic saving of history, including sharing history across live sessions
  • "Menu" completion (somewhat like Intellisense, select completion with arrows) via Ctrl+Space

But it doesn't replace it in a scary "moved my cheese" way, but in a comfortable familiar way, similar to how Bash works now. It will add things that you WILL miss when you move to another machine that doesn't have PsReadline. If you are already comfortable (or learning) PowerShell, this will feel comfortable immediately. It's not Dvorak. ;)

Some cool PsReadLine examples

Syntax coloring for things like keywords (cd) and common commands (git):

Syntax coloring with PSReadline

PowerShell often has you opening parentheses, brackets and things, and then you have to count them to close them. PsReadLine helps with that also:

Not only does it give you nice syntax-highlighting for things like function building, it also shows me with the red > that I haven't closed the block.

Forgot to close the block

When you are editing a multi-line script, you can also now backup to other lines!

multiline editing with PSReadline

If you are typing something like Get-Process and either want to autocomplete switches, or autocomplete results, you can press Ctrl-Space:

autocomplete

If you're advanced, check out get-PSReadlineKeyHandler and not only look at what functions are bound to which hotkeys, BUT also check out all the functions that AREN'T bound. You have a lot of power for customization here!

get-PSReadlineKeyHandler

You can even set Emacs keybindings!

Set-PSReadlineOption -EditMode Emacs

Go check out https://github.com/lzybkr/PSReadLine on GitHub and give it a star!

Related Links

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.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Jump-Location - A Change Directory (CD) PowerShell Command that reads your mind

September 18, '14 Comments [27] Posted in Tools
Sponsored By

There's a lovely little utility called autojump for *nix consoles that makes the 'cd' command very smart. More that just auto-completion, it's a kind of "auto guessing." Hence, autojump. There is some beginning Windows support, but instead I turned to Tim Kellogg's open source PowerShell implementation "Jump-Location."

What a joy.

j this and j that

First, I was like "jump-location?" I'm not going to type that. But then, of course, duh. Aliases.

Jump-Location is aliased to just j, which means I can now do awesome stuff like this:

c:\> j sc
c:\users\scott> j g
c:\users\AppData\Local\GitHub> j des
c:\users\scott\Desktop>

But there's more. It's actually watching how long you are in a directory and keeping stats. You can see the weighted stats with "jumpstat" and the "database" is just a text file in ~\jump-location.txt.

If "j d" isn't enough to get me into C:\GitHub\DisProject then I can do "j g d" and I'm there. It's amazing.

Installation is easy, and I hope it gets on PsGet soon for even easier installation. Just unzip, unblock, ensure that your PowerShell execution policy allows scripts, and run ./install.ps1.

NOTE: Don't run install from your desktop, or a temp folder. Put the Jump-Location folder somewhere where it will live, and it's going to add a line like this to your user profile ("C:\Users\YOU\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1")  like this, so you'll want to install from a final path:

Import-Module 'C:\Users\Scott\Dropbox\utils\Jump-Location-0.5.1\Jump.Location.psd1'

I'm excited about this great little utility. Head over to https://github.com/tkellogg/Jump-Location and STAR it in GitHub, and give it a go! Tim, the author, is on Twitter at @kellogh. Other contributors include Sergey Vorobyev.

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.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.