Introduction: "Drop Down", Quake-style Command Prompt for Windows
As a regular Lifehacker reader (albeit one who rarely enacts the excellent tips within), my attention was brought some time ago to Tilda.
Tilda provides a drop-down console for *nix-based systems, in a style familiar to players of First-Person shooter games - press the Tilde (~), and the console appears at the top of the screen, ready for input. Press it again, and it disappears. Neat and tidy, easy to use, and extremely helpful.
However. While *nix users get to enjoy such marvels, we who choose to slum on the Windows platforms are left without said nifty gadgets.
Heartbroken, I found myself searching for a solution. Without any coding skills to my name, I needed something easy. So I turned to a couple of Lifehacker favourites to achieve a simple facsimile of the effect.
Disclaimer: As so many budding Instructable authors have said before me - this is my first, so be gentle on my poor ego.
What you will need:
You will need:
- A Windows-based Hotkey-enabler. I chose AutoHotKey, and the following Instructable will be based around that choice. Adjust to taste.
- A Windows-based console shadowing application. I chose Console.
Optional: Cygwin, for that truly authentic *nix flavour.
Once you have collected your components, press onward.
Tilda provides a drop-down console for *nix-based systems, in a style familiar to players of First-Person shooter games - press the Tilde (~), and the console appears at the top of the screen, ready for input. Press it again, and it disappears. Neat and tidy, easy to use, and extremely helpful.
However. While *nix users get to enjoy such marvels, we who choose to slum on the Windows platforms are left without said nifty gadgets.
Heartbroken, I found myself searching for a solution. Without any coding skills to my name, I needed something easy. So I turned to a couple of Lifehacker favourites to achieve a simple facsimile of the effect.
Disclaimer: As so many budding Instructable authors have said before me - this is my first, so be gentle on my poor ego.
What you will need:
You will need:
- A Windows-based Hotkey-enabler. I chose AutoHotKey, and the following Instructable will be based around that choice. Adjust to taste.
- A Windows-based console shadowing application. I chose Console.
Optional: Cygwin, for that truly authentic *nix flavour.
Once you have collected your components, press onward.
Step 1: Configure Your Hotkey Mapper, Part 1.
I'm going to - potentially mistakenly - assume that the programs suggested have been installed to your liking in your preferred directories. If you aren't able to install the programs, or you're having issues, check out the forums for the respectiveprograms.
With that out of the way, we are free to begin configuration.
Disclaimer again: I in no way claim to be an expert at either program. What I have put together below is based on a five-minute read of the documentation for the program and having a specific goal in mind. There is, no doubt, more elegant ways to achieve the same effect. I leave this as an exercise for the reader, or pedant, or both.
So. For those eager to achieve the effect, scroll to the bottom of this instructable, download the files, install, and enjoy. But I will, for those with the desire to read further, explain my reasoning and steps.
What we want to achieve, at this stage, is to make the console appear with a hotkey, and disappear with the same hotkey - or, for a little more elegance, the escape key.
I've chosen to use the much-underappreciated Windows key along with the tilde - well, the backtick key, anyway: Win+`.
Let's start simple. We want to launch the console if it's not active, or show it if it is.
Ah, love-er-ly. Pseudo-pseudocode. If it exists (IfWinExist), and it's not active (IfWinActive), make it visible and active. If it exists (IfWinExist) and it's active (IfWinActive), then hide it. If it doesn't exist, Run it.
Okay. Problem: We don't know what (console) should be.
Good point. AutoHotKey needs to be able to refer to the Console application somehow. We need to uniquely identify a session of Console, so we can work with it.
AutoHotKey includes a program called AutoIt3 Window Spy. Basically, this allows us to get the information we need about Console.
With that out of the way, we are free to begin configuration.
Disclaimer again: I in no way claim to be an expert at either program. What I have put together below is based on a five-minute read of the documentation for the program and having a specific goal in mind. There is, no doubt, more elegant ways to achieve the same effect. I leave this as an exercise for the reader, or pedant, or both.
So. For those eager to achieve the effect, scroll to the bottom of this instructable, download the files, install, and enjoy. But I will, for those with the desire to read further, explain my reasoning and steps.
What we want to achieve, at this stage, is to make the console appear with a hotkey, and disappear with the same hotkey - or, for a little more elegance, the escape key.
I've chosen to use the much-underappreciated Windows key along with the tilde - well, the backtick key, anyway: Win+`.
Let's start simple. We want to launch the console if it's not active, or show it if it is.
IfWinExist [[console]]{ IfWinActive [[console]] { WinHide [[console]] } else { WinShow [[console]] }}else Run [[shortcut to console]]returnAh, love-er-ly. Pseudo-pseudocode. If it exists (IfWinExist), and it's not active (IfWinActive), make it visible and active. If it exists (IfWinExist) and it's active (IfWinActive), then hide it. If it doesn't exist, Run it.
Okay. Problem: We don't know what (console) should be.
Good point. AutoHotKey needs to be able to refer to the Console application somehow. We need to uniquely identify a session of Console, so we can work with it.
AutoHotKey includes a program called AutoIt3 Window Spy. Basically, this allows us to get the information we need about Console.
Step 2: Sideline: AutoIt3 Window Spy
It's not my intention to create an Instructable about Window Spy. But, quickly, here's how to use it to find the class details about your Console window. For more, check out the AutoHotKey Documentation.
First, launch Console.
Second, launch AutoIt3 Window Spy.
Then, with both open, select your Console window to make it active.
Window Spy will display a significant amount of detail about your Console window. The bit you need to know is the Window Title and Class section, specifically the Class - the line beginning with "ahk_class".
In this case, the line we need is:
ahk_class Console Main Command Window
You can make AHK more selective by using the title; that's, again, an exercise for the reader.
First, launch Console.
Second, launch AutoIt3 Window Spy.
Then, with both open, select your Console window to make it active.
Window Spy will display a significant amount of detail about your Console window. The bit you need to know is the Window Title and Class section, specifically the Class - the line beginning with "ahk_class".
In this case, the line we need is:
ahk_class Console Main Command Window
You can make AHK more selective by using the title; that's, again, an exercise for the reader.
Step 3: Configure Your Hotkey Mapper, Part 2.
After our little tryst with Window Spy, we now have the information we need to complete our script, right?
Let's try again:
Okay; that should work, right?
Not quite. It's good, but it's not right. Yet. We have a couple of issues outstanding.
When you run the script, and press your hotkey, you'll notice that Console launches. Another press - it disappears. Great!
Not really. Press it again - and it launches another session of Console! That's not right, is it?
Issue 1: Hidden Consoles stay hidden
So, we're losing the script at "IfWinActive" - it can't find the hidden Console!
AHK has a command for that - DetectHiddenWindows. Let's add it now.
Run it again. This time, it'll hide - but, hmm... it won't come back!
Issue 2: Hidden Consoles really stay hidden
What's happening here is, the console is hidden by WinHide, but it's still active. We need to move the focus somewhere else, so that the IsWinActive call won't return true. The easiest place to send that focus is to the Windows Taskbar.
Close, but no cigar! It comes back, but it's not active - you can't just start typing!
Issue 3: Home movie effect - Console hasn't got focus!
Easy. We'll just make sure that when we show it, we give it focus straight away.
It works! Except... we can't close it with escape. That's the icing on the cake.
Issue 4: No way out!
This is just a matter of adding a quick second script to the end of your .AHK file:
Simply: if we're in Console, escape hides it. Done!
So - that's it for the AHK file. But your console window is still appearing in the middle of the screen - not very Quake-like. Let's fix that.
Let's try again:
#`::IfWinExist ahk_class Console Main Command Window{ IfWinActive ahk_class Console Main Command Window { WinHide ahk_class Console Main Command Window } else { WinShow ahk_class Console Main Command Window }}else Run [[shortcut to console]]returnOkay; that should work, right?
Not quite. It's good, but it's not right. Yet. We have a couple of issues outstanding.
When you run the script, and press your hotkey, you'll notice that Console launches. Another press - it disappears. Great!
Not really. Press it again - and it launches another session of Console! That's not right, is it?
Issue 1: Hidden Consoles stay hidden
So, we're losing the script at "IfWinActive" - it can't find the hidden Console!
AHK has a command for that - DetectHiddenWindows. Let's add it now.
#`::DetectHiddenWindows, onIfWinExist ahk_class Console Main Command Window{ IfWinActive ahk_class Console Main Command Window { WinHide ahk_class Console Main Command Window } else { WinShow ahk_class Console Main Command Window }}else Run consoleDetectHiddenWindows, offreturnRun it again. This time, it'll hide - but, hmm... it won't come back!
Issue 2: Hidden Consoles really stay hidden
What's happening here is, the console is hidden by WinHide, but it's still active. We need to move the focus somewhere else, so that the IsWinActive call won't return true. The easiest place to send that focus is to the Windows Taskbar.
#`::DetectHiddenWindows, onIfWinExist ahk_class Console Main Command Window{ IfWinActive ahk_class Console Main Command Window { WinHide ahk_class Console Main Command Window WinActivate ahk_class Shell_TrayWnd } else { WinShow ahk_class Console Main Command Window }}else Run consoleDetectHiddenWindows, offreturnClose, but no cigar! It comes back, but it's not active - you can't just start typing!
Issue 3: Home movie effect - Console hasn't got focus!
Easy. We'll just make sure that when we show it, we give it focus straight away.
#`::DetectHiddenWindows, onIfWinExist ahk_class Console Main Command Window{ IfWinActive ahk_class Console Main Command Window { WinHide ahk_class Console Main Command Window WinActivate ahk_class Shell_TrayWnd } else { WinShow ahk_class Console Main Command Window WinActivate ahk_class Console Main Command Window }}else Run consoleDetectHiddenWindows, offreturnIt works! Except... we can't close it with escape. That's the icing on the cake.
Issue 4: No way out!
This is just a matter of adding a quick second script to the end of your .AHK file:
#IfWinActive ahk_class Console Main Command Windowesc:: { WinHide ahk_class Console Main Command Window WinActivate ahk_class Shell_TrayWnd }returnSimply: if we're in Console, escape hides it. Done!
So - that's it for the AHK file. But your console window is still appearing in the middle of the screen - not very Quake-like. Let's fix that.
Step 4: Skin Your Console
So, now the finishing touches. Again, like AHK, there's any number of ways to customize Console to your liking; check out the readme.txt file in your Console directory to find out more about the XML syntax Console uses.
However: here's how to create the drop-down effect: we want something borderless, semi-transparent and top-left anchored.
Here's the console.xml file I used for this effect.
The size and width of the font affects the eventual width of the console. Unfortunately, Console - like the Windows console - can only be so wide. Choose a wider font to achieve a wider console.
Personally, I had issues with proportional fonts (ie: fonts with variable-width letters, like Arial); stick with Monospaced fonts such as Lucida Console for best effect.
The top-left docking and the on-top z_order are what give the appropriate feel, here. Play around with these values to change the look-and-feel of your console.
The inside_border is a personal taste, as is the taskbar_button. The former moves the console's text away from the outside edges, and the taskbar_button makes a Console icon appear on the taskbar when it's active.
The alpha and inactive_alpha transparency is, again, a matter of personal taste. Closer to 255 is more opaque; closer to 0 is more transparent.
I've chosen to put an image behind my console; the sizing of this image, however, is a little bit of guesswork unless you know the letter-sizes of your chosen font; then, simply, multiply out by the rows and columns and come up with an appropriate size. Quake console, anyone?
The final step is to save all this as an XML file, typically in your Console directory. You can then refer to it directly in your AHK script, or, as I've done, create a shortcut in your path somewhere - called "console" - that passes the XML file as a parameter; then point AHK to that.
Extra Credit
For those truly in search of a *nix experience; you can install Cygwin, and direct Console to use the Cygwin Bash environment as your primary shell:
Extra-Extra Credit
Run both Cygwin and Windows cmd with two different hotkeys! That, I'm afraid, is an exercise for the reader...
However: here's how to create the drop-down effect: we want something borderless, semi-transparent and top-left anchored.
Here's the console.xml file I used for this effect.
<?xml version="1.0"?><console title="dropdownconsole" change_refresh="5" refresh="100"> <font> <size>10</size> <bold>false</bold> <italic>false</italic> <color r="255" g="255" b="255" /> <name>Lucida Console</name> </font>
The size and width of the font affects the eventual width of the console. Unfortunately, Console - like the Windows console - can only be so wide. Choose a wider font to achieve a wider console.
Personally, I had issues with proportional fonts (ie: fonts with variable-width letters, like Arial); stick with Monospaced fonts such as Lucida Console for best effect.
<position> <x>0</x> <y>10</y> <!-- dock to top left for "quake-console" feel --> <docked>top left</docked> <snap_distance>10</snap_distance> <!-- float on top --> <z_order>on top</z_order> </position>
The top-left docking and the on-top z_order are what give the appropriate feel, here. Play around with these values to change the look-and-feel of your console.
<appearance> <hide_console>true</hide_console> <border>none</border> <!-- move text away from the outside edge --> <inside_border>10</inside_border> <taskbar_button>tray</taskbar_button>Set border to none to hide the Windows border and make the window chromeless, for a seamless feel.
The inside_border is a personal taste, as is the taskbar_button. The former moves the console's text away from the outside edges, and the taskbar_button makes a Console icon appear on the taskbar when it's active.
<size rows="18" columns="95" buffer_rows="500" /> <transparency alpha="200" inactive_alpha="100">alpha</transparency> <background> <color r="0" g="0" b="0" /> <image style="center">dark.png</image> </background>Columns and Rows govern how many lines/columns of text your console can display. Again, this is a personal taste; set columns to "max" for Console to ... erm... set the width to the maximum.
The alpha and inactive_alpha transparency is, again, a matter of personal taste. Closer to 255 is more opaque; closer to 0 is more transparent.
I've chosen to put an image behind my console; the sizing of this image, however, is a little bit of guesswork unless you know the letter-sizes of your chosen font; then, simply, multiply out by the rows and columns and come up with an appropriate size. Quake console, anyone?
<scrollbar> <color r="0" g="0" b="0" /> <style>flat</style> </scrollbar>Self-explanatory; this sets how the scrollbars are coloured and displayed.
<cursor> <color r="255" g="255" b="255" /> <style>fading block</style> </cursor> </appearance> <behaviour> <!-- keep the console in place --> <mouse_drag>false</mouse_drag> <copy_on_select>true</copy_on_select> </behaviour></console>Mouse_drag prevents you from picking up the console and moving it around. Copy_on_select replicates the *nix select-to-copy functionality, for a more *nixy-feel.
The final step is to save all this as an XML file, typically in your Console directory. You can then refer to it directly in your AHK script, or, as I've done, create a shortcut in your path somewhere - called "console" - that passes the XML file as a parameter; then point AHK to that.
Extra Credit
For those truly in search of a *nix experience; you can install Cygwin, and direct Console to use the Cygwin Bash environment as your primary shell:
<console title="dropdownconsole" change_refresh="5" refresh="100" shell="c:\cygwin\cygwin.bat">
Extra-Extra Credit
Run both Cygwin and Windows cmd with two different hotkeys! That, I'm afraid, is an exercise for the reader...


