# HG changeset patch # User Steve Losh # Date 1349222529 14400 # Node ID cf2147225208f48ef75beff3c0bf43f80941f506 # Parent ff00631c125107385ce7aa3ed5ba3f5fe9b1af1d Space cadet diff -r ff00631c1251 -r cf2147225208 content/blog/2012/10/a-modern-space-cadet.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/blog/2012/10/a-modern-space-cadet.html Tue Oct 02 20:02:09 2012 -0400 @@ -0,0 +1,1286 @@ + {% extends "_post.html" %} + + {% hyde + title: "A Modern Space Cadet" + snip: "Emulating a legendary keyboard." + created: 2012-10-02 10:30:00 + flattr: true + %} + +{% block article %} + +I spend a lot of my time (easily over 8 hours a day) at a keyboard. As you +might have guessed from my previous entries about [Vim][] and [Mutt][] I'm not +averse to spending a few hours to improve an environment I'm going to be +spending tens of thousands of hours in over the next few years, so it shouldn't +be a shock that my keyboard is something I've heavily tweaked. + +This post is about what I've done to make my typing experience more pleasant and +efficient. + +If you scoff at customization you won't enjoy this post. What if I have to use +someone else's machine? I can count on one hand the number of times I've had to +use someone else's machine ever since I got an iPhone five years ago. I *like* +customizing my machine to save me time. Yes, there may be some excessive stuff +here, but not only does it make me type faster, it's *fun*! + +[TOC] + +[Vim]: /blog/2010/09/coming-home-to-vim/ +[Mutt]: /blog/2012/10/the-homely-mutt/ + +The Original +------------ + +There have been many, many keyboards produced in the world since the first ones +emerged. One of the most famous, at least in programming circles, is the [Space +Cadet Keyboard][space-cadet]. + +Originally used on Lisp machines and some other systems, it's not a keyboard for +the minimalist. There are four "bucky keys" (modifier keys): control, meta, +super, and hyper (plus shift, of course). There are also special keys that let +you type Greek letters and mathematical symbols. + +The Space Cadet is an example of a keyboard for someone not afraid to invest +some time to work faster. + +It's also absolutely gorgeous. The color scheme and typography is beautiful. + +This is the keyboard I used (loosely) as inspiration when crafting my current +setup. + +[space-cadet]: http://world.std.com/~jdostale/kbd/SpaceCadet.html + +Modern Hardware +--------------- + +I've tried a number of modern keyboards in the past few years. They're all +high-quality and more expensive than the $20 plastic toys that come with +desktops these days. But I spend 60 or more hours a week at a keyboard and +maybe one hour a week in my car, so I'm getting pretty good use out of the +dollars I've put into keyboards compared to the cost of my car. + +I'll go through the keyboards I've used in chronological order. I'm not going +to go into too much detail about the basics of mechanical keyboards and +switches. If you want to learn about that, [this post][ch] and [this +guide][mech] are good places to start. + +[ch]: http://www.codinghorror.com/blog/2010/10/the-keyboard-cult.html +[mech]: http://www.overclock.net/t/491752/mechanical-keyboard-guide + +### Apple Wireless Keyboard + +For a long time I used [Apple wireless keyboards][apple-wireless]. + +![Apple Wireless Keyboard](/media/images{{ parent_url }}/kb-apple.jpg) + +They're light and compact, but still feel extremely solid thanks to their metal +construction. + +They also stay really clean because there gaps between keys are tiny, instead of +the funnel-shaped gaps of other keyboard that send dirt straight to the bottom. + +They're readily available at any Apple store, and of course they're wireless +which is great. + +Finally, they also feel exactly like the keyboards on Apple's laptops, so your +muscle memory is perfectly suited to either one if you switch between them +often. + +Unfortunately typing on them is nowhere near as nice as the rest of the +keyboards in this list. The Apple keyboard have (I think) only 2mm of travel, +but you have to bottom-out the keys to register the keypresses. + +[apple-wireless]: http://www.apple.com/keyboard/ + +### Das Silent Ultimate + +The first mechanical keyboard I got was the [Das Silent Ultimate][das-silent]. + +![Das Silent Keyboard](/media/images{{ parent_url }}/kb-das.jpg) + +(This photo is actually my Das Clicky since I don't have the Silent any more, +but they're exactly the same externally.) + +Compared to the Apple keyboards the switches on the Das Silent (Cherry Brown +switches) feel far softer. You're not smashing your fingers against metal on +every keypress. + +Overall the Das Silent isn't too bad. It's built like a tank so I have no doubt +it'd last forever. It also has the option of blank keys, which I prefer. + +I didn't stick with this keyboard for long. First, its glossy finish looks good +when it's in the box and terrible forever after that. It's way too easy to get +dirty. + +Something also just feels "off" about the key switches to me, especially after +I've tried the other boards in this list. They feel, for lack of a better term, +"mushy" to me. + +[das-silent]: http://www.daskeyboard.com/model-s-ultimate-silent/ + +### Das Clicky Ultimate + +The next keyboard I tried was the [Das Clicky Ultimate][das-clicky]. + +![Das Clicky Keyboard](/media/images{{ parent_url }}/kb-das.jpg) + +This is exactly the same as the Das Silent except for the switches, which are +the "clicky" Cherry Blues. These feel *way* better to me than the browns. The +mushiness I described for the Silent is completely gone. + +They are not kidding when they say it is loud. If you're typing a lot expect to +have a constant background noise of clicks. But to me the sound is soothing, +especially once you get into a rhythm of typing for extended periods. Your +coworkers might disagree, so tread carefully. + +The Das Clicky still has that godawful glossy finish, unfortunately. After +a while I decided to try out what I had heard people raving about: Topre +switches. + +[das-clicky]: http://www.daskeyboard.com/model-s-ultimate/ + +### Happy Hacking Keyboard Professional 2 + +The [Happy Hacking Keyboard][hhkb] was my next keyboard. It's much more +expensive than the Dases were, so it was a tough call, but I'm glad I got it. + +![Happy Hacking Keyboard](/media/images{{ parent_url }}/kb-hhkb.jpg) + +The HHKB uses Topre key switches, which to me feel like Cherry Browns done +right. There's no "click" like the Blues, but instead of the mush of the +Browns you get a satisfying "thunk" or "sshhhunk" on each press. It's a great +balance: you have a nice satisfying sound that's less annoying for other people. + +The finish on this keyboard is perfect. It is the most unassuming, elegant, +wonderful matte finish I've seen on any keyboard. The plastic is just textured +enough to feel solid under your fingers (not slippery like Macbook keys) but not +enough to feel like you're typing on sandpaper. + +If you're short on space, or want to carry your keyboard with you, the HHKB is +for you. It's *tiny*, but still feels solid and not flimsy at all. + +I have two main complaints about the HHKB. First, there's two spaces on the +bottom row where they could have put a modifier key but didn't. The space on +the right has the logo, which is fair enough, but the one on the left is simply +blank for no good reason. + +My other complaint is the idiotic default placement of the `fn` key and the +arrow keys. I don't mind having to use `fn` to get to the arrows as +a concession to a compact design, but why on earth would you place them so that +you have to chord on a *single hand* to hit them? + +This problem would be completely solved if the `fn` key were moved from its +current position (right of the right shift key) down to the empty lower-left +corner. Then you could use your left hand to hold `fn` while your right worked +the arrow keys, no single-hand contortion required. + +So after a while with the HHKB I got sick of the arrow key problem. I loved the +Topre switches though, so the next choice was pretty obvious. + +[hhkb]: http://elitekeyboards.com/products.php?sub=pfu_keyboards,hhkbpro2&pid=pdkb400bn + +### Topre Realforce 103 + +The Topre Realforce 103UB was my next keyboard, and is the one I'm +still using to this day. + +![Topre Realforce Keyboard](/media/images{{ parent_url }}/kb-realforce.jpg) + +I believe the model I bought is now discontinued, but it's been replaced by the +[104UB][topre] which is exactly the same except for an extra key on the right +side. If I could swap my current keyboard for one of those I would. In fact, +if anyone wants to buy my used 103UB for a bit of a discount I'd be totally +willing to sell it to get the 104UB. + +Anyway, this keyboard has a few disadvantages. First, unlike every other +keyboard here (except the wireless Apple ones) *it is not a USB hub*. This +isn't a huge deal (I have external USB hubs anyway), but it did come as a big +surprise. + +Second, it's big. Really big. If you don't have *plenty* of room on your desk +you might want to look at the [tenkeyless][topre-tenkeyless] varieties which +ditch the number pad section to save space. I have room and I love having +a number pad, so I got the behemoth-sized model. + +Also for some reason I can't fathom there's no way to get blank, black keycaps +for this keyboard. You can get blank Topre keycaps in lime green, pink, yellow, +and lots of other colors, but not a simple black! + +Now for the good parts. This thing is built like a tank. If you needed to +defend your home from an intruder, it would make an acceptable blunt weapon with +which to do so, and you'd probably be able to plug it right back in and start +typing again. + +The finish is the same as on the HHKB (gorgeous), but I have to take a point off +for the non-blank keycaps. I don't need to look at the keys while I type, so +why marr the luxurious finish with lettering? + +The Realforce also uses Topre switches, but it has another trick up its sleeve +that makes typing on it even nicer than the HHKB. The version I have is the +"variable-weighted" one, which means that the keys under your weaker fingers +take less force to press than the ones under your stronger fingers. This is +fantastic for long sessions of typing. Instead of my pinkies getting tired my +fingers seem to all tire out at the same rate now. Topre does make a "uniform" +version that doesn't have this trick, but I really like variable weight keys +myself. + +[topre]: http://elitekeyboards.com/products.php?sub=topre_keyboards,rf104&pid=xf11t0 +[topre-tenkeyless]: http://elitekeyboards.com/products.php?sub=topre_keyboards,rftenkeyless + +### Verdict + +Right now I'm using the Topre Realforce for my day to day work. I've fallen in +love with how the Topre switches feel (I prefer them over all the others) and +the Happy Hacking Keyboard is just too cramped. If I were short on space the +HHKB would be great, but I have plenty of room on my desk, so why not make use +of it? + +Here's a photo of all the keyboards (along with a 13" Macbook Air) so you can +see the differences in size. + +![Keyboard Size Comparison](/media/images{{ parent_url }}/kb-size.jpg) + +Modern Software +--------------- + +Now that I've talked about the hardware it's time for the software. I use OS +X exclusively, so everything I say here is OS X specific. I'm sure there are +Windows and Linux equivalents somewhere though. + +I use three software programs that, together, give me just about unlimited +flexibility in customizing how my keyboard works in OS X. + +### Keyboard Maestro + +[Keyboard Maestro][] is a utility for binding macros to keyboard shortcuts in OS +X. It may not have the best user interface, but it can do a *lot*, and once you +set up your shortcuts you never have to look at it again. It's $36. + +Right now I use it for application switching, with a few twists I'll cover later +on. + +I switched to [Keymando][] for a while. It was great being able to configure it +in a programming language with a plain text file I could easily work with in +version control, but compared to Keyboard Maestro it's far slower and far +buggier. I'm now back to only using Keyboard Maestro. + +[Keyboard Maestro]: http://www.keyboardmaestro.com/main/ +[Keymando]: http://keymando.com/ + +### PCKeyboardHack + +[PCKeyboardHack][] lets you map one key on your keyboard to another at a very +low level. For example, you can change just the right Option key to send `F19` +instead. I use this for one single key which you'll see in the next section. +It's free and [open source][pc-git]. + +[PCKeyboardHack]: http://pqrs.org/macosx/keyremap4macbook/pckeyboardhack.html.en +[pc-git]: https://github.com/tekezo/PCKeyboardHack + +### KeyRemap4MacBook + +[KeyRemap4MacBook][] is how I do the bulk of my keyboard customizations. Like +all of the other applications its user interface is horrible, but it can do damn +near *anything* you might want. You could probably replace Keyboard Maestro +with it, at least for the kind of stuff I do. It's also free and [open +source][kr-git]. + +The bulk of what I describe in this post is going to use KeyRemap4MacBook. I'm +not going to give you a tutorial in it here -- read its documentation if you +want to learn how to use the things I'm going to show. + +[KeyRemap4MacBook]: http://pqrs.org/macosx/keyremap4macbook/index.html.en +[kr-git]: https://github.com/tekezo/KeyRemap4MacBook + +Control/Escape +-------------- + +These first few mappings aren't directly from the Space Cadet keyboard, but they +were inspired by its spirit of making an efficient tool for text editing. + +The Capslock key on modern keyboard has become the punchline of many a joke, and +for good reason: there's no reason to dedicate such an important key to +a function like capslock. + +Many people rebind it to a more useful key like Control, Option, Escape, or +Backspace. I rebound it to Control for a while and then realized that with +KeyRemap4MacBook I could get even more mileage out of it. + +The important thing I finally realized is that it's possible to divide keys on +the keyboard into three groups: + +* Keys you hold down to change how *other* keys behave, but that (usually) don't + do anything if you use them on their own (like Shift and Control). +* Keys that you press and release but don't want to "repeat" as you hold them + (like Escape or Insert). +* Keys that you sometimes press and release, but sometimes want to repeat (like + holding space to insert a bunch of spaces, or Backspace to kill a bunch of + characters). + +Can you see where this is heading? The last group is pretty normal, but the +first two groups are special. Specifically: there are two different ways to use +them and they're each only useful in one of those ways. + +This means that we can *combine* them onto a single key without losing any +useful functionality! + +I'm clearly not the first one to think of this, because KR4MB includes built-in +support for creating these kinds of mappings. + +First you'll want to map Capslock to Control at the OS X level by going into the +Keyboard preference pane in System Preferences, clicking the Modifier Keys +button in the lower right, selecting your keyboard in the dropdown list (this is +surprisingly easy to miss), and changing the Capslock setting: + +![Changing Capslock to Control in OS X](/media/images{{ parent_url }}/kb-caps.png) + +Then you can open KeyRemap4MacBook and choose the following premade option: + + Control_L to Control_L + (+ when you type Control_L only, send Escape) + +Now the Capslock key on the keyboard does the following: + +1. If held down and pressed with another key, it acts like Control. +2. If pressed and released on its own, it acts like Escape. + +That's two extremely important keys (at least for Vim users) on a single key in +one of the prime locations on the keyboard! No more awkward stretches! + +If you want to force yourself to learn to use it, disable the normal escape key. +You'll learn fast. + +Hyper +----- + +Modern OS X supports four "modifier" keys: Control, Option, Command, and Shift. +The Space Cadet keyboard had five: Control, Meta, Super, Hyper, and Shift. + +Shift and Control map to each other, and OS X's Option key is pretty much the +same as Meta (in fact I think Emacs users usually use Alt as Meta). +I arbitrarily decided that Command was the OS X equivalent of Super. That left +Hyper. + +Since OS X doesn't natively support a fifth modifier key, I came up with +an idea to fake it. + +First, I realized that because I use Capslock for Control I had no use for the +*real* left Control key. So the first step is to remap that to something else +distinct from the Capslock-version of Control. + +For this you need PCKeyboardHack. I don't think there's a way to do it in +KeyRemap4MacBook, because by the time KR4MB sees the keypress it can't tell if +it came from the Capslock key or the real Control key (due to how they were +changed in the previous section). PCKeyboardHack, however, *can*, so I remapped +left Control to keycode `80`: + +![Remapping Left Control in PCKeyboardHack](/media/images{{ parent_url }}/kb-pck.png) + +Keycode `80` is the `F19` key. My keyboard doesn't have an `F19` key so it +doesn't conflict with anything. Now we can simply remap `F19` in KR4MB just +like any other key. + +To create a "pseudo-Hyper" modifier, I remapped this key to be the equivalent of +holding down *all four other modifiers* by adding the following to my +`private.xml` KR4MB configuration file: + + :::xml + + Remap Left Control to Hyper + OS X doesn't have a Hyper. This maps Left Control to Control + Shift + Option + Command. + + space_cadet.left_control_to_hyper + + + --KeyToKey-- + KeyCode::F19, + + KeyCode::COMMAND_L, + ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L + + + +As far as I can tell, no keyboard shortcuts in OS X or any apps use all four +modifier keys (how would you normally press them all, anyway?). But many +programs, like Keyboard Maestro, let you define your own shortcuts. So now I've +got an entire key as a "namespace" all to myself for my own shortcuts! + +This is really nice. I don't have to worry about "shadowing" existing shortcuts +anywhere and it's only a single modifier to press. + +Currently I use this "namespace" for application switching. Instead of using +the normal `Command-Tab` switcher, I have shortcuts for each individual app +I use frequently. For example, `Hyper-k` switches to Firefox, `Hyper-y` +switches to Twitter, and so on. This is better than `Command-Tab`ing because +I don't have to worry about how many times I need to press it. `Hyper-k` +*always* goes to Firefox no matter what, so I can easily burn that into my +muscle memory. + +There's one more little trick I use in Keyboard Maestro that you might find +useful. It's specific to how I work, but you might like to do something +similar. + +I pretty much always keep two iTerm 2 windows open. The first contains a tmux +session with one window split into two panes. One pane holds +[weechat][weechat-prog] for IRC, the other holds [Mutt][mutt-prog] for email. +I keep this on my laptop screen at all times while I do other things on my +external monitor. + +The second iTerm window is almost always fullscreened, and contains a tmux +session with whatever I'm working on. The number of windows and panes varies +wildly. + +What I wanted was a way to bind `Hyper-i` and `Hyper-m` to directly focus my IRC +and mail panes, and `Hyper-j` to directly focus the second, "general-purpose" +iTerm window. + +The solution came in two parts. First I configured tmux so that `prefix N` +would select the nth pane in the current window by adding the following to +`~/.tmux.conf`: + + bind 1 select-pane -t 1 + bind 2 select-pane -t 2 + bind 3 select-pane -t 3 + bind 4 select-pane -t 4 + bind 5 select-pane -t 5 + bind 6 select-pane -t 6 + bind 7 select-pane -t 7 + bind 8 select-pane -t 8 + bind 9 select-pane -t 9 + +My tmux prefix is `Control-f`, so now pressing `Control-f 1` will go to pane 1, +and so on. Then I configured Keyboard Maestro like so: + +![Keyboard Maestro IRC Config](/media/images{{ parent_url }}/kb-irc.png) + +This binds `Control-Shift-Option-Command-i` (which is just `Hyper-i`) to do the +following: + +1. Focus iTerm 2. +2. Send a `Command-Option-1` keystroke, which will focus the first iTerm + 2 window (I simply make sure I always open my mail/irc window first). +3. Send `Control-f` keystroke. +3. Send `1` keystroke, which together with the previous one tells tmux to switch + to pane 1. + +The mail shortcut is similar, of course, and the general-purpose terminal one is +even simpler. + +So now I've got a free modifier key that won't conflict with anything, and I've +got some very easy-to-type shortcuts I can burn into my fingers for switching +applications quickly. Awesome. + +[weechat-prog]: http://www.weechat.org/ +[mutt-prog]: http://www.mutt.org/ + +Better Shifting +--------------- + +The Shift keys are another of those keys that are only useful with other keys, +so it's only natural that they were also on the list of keys to optimize. +First, though I took a detour to correct a bad habit of mine. + +### Shift Key Training Wheels + +I've been typing for most of my life, but I never really learned to do it +correctly. I can touch type, of course, but sometimes I use the wrong fingers +for certain keys. + +My most egregious offense was that I always used the left Shift key. Even when +typing `X` I'd hold the left Shift key with my left pinky and hit the `x` with +my left index finger, which pulls my hand off the home row and generally feels +awkward. + +One day I decided I was tired of doing this the wrong way and decided to fix +myself. The easiest way to break a bad habit is to make it harder or impossible +to do, so I created a custom KeyRemap4MacBook setting that *disables* the +keypress when you use the incorrect Shift key with a letter. Here it is in +full: + + :::xml + + Use the correct shift keys. + private.correct_shift_keys + + --KeyToKey-- KeyCode::Q, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::W, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::E, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::R, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::T, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::A, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::S, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::D, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::F, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::G, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::Z, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::X, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::C, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + --KeyToKey-- KeyCode::V, ModifierFlag::SHIFT_L, KeyCode::VK_NONE + + --KeyToKey-- KeyCode::Y, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::U, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::I, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::O, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::P, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::H, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::J, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::K, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::L, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::SEMICOLON, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::N, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::M, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::COMMA, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::DOT, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + --KeyToKey-- KeyCode::QUOTE, ModifierFlag::SHIFT_R, KeyCode::VK_NONE + + +It took me about four hours of normal computer use to unlearn over two decades +of wrong typing. It's amazing how fast muscle memory can adjust when you simply +*force* it to. + +Once I fixed myself I disabled this setting, because it also forces you to use +the "correct" Shift key when doing keyboard shortcuts, and sometimes those are +easer to do with the "wrong" Shift. + +If you only use one Shift key I'd really encourage you to try this. It spreads +out the wear over both pinkies and feels much better. Your hands will thank +you. + +### Shift Parentheses + +Now that I was using the right Shift keys, it was time to revisit mapping +something else onto them. One pair of keys stood out as a perfect candidate: the +left and right parentheses. + +Parentheses are common in most of the programming languages in use today (some +more than others). If you counted I bet you'd find them more common than square +or curly brackets in the majority of your code, and yet they're shoved away in +the horrible homes of `Shift-9` and `Shift-0`. + +I decided to try out remapping my Shift keys to work like so: + +* When held while pressing other keys, act like Shift. +* When pressed and released on their own, type an opening or closing parenthesis + (left and right shift respectively). + +This means I can type parentheses with a single, unchorded keypress. After +using it for a while I absolutely love it. Here's the KeyRemap4MacBook setting +for it: + + :::xml + + Shifts to Parentheses + Shifts, when pressed alone, type parentheses. When used with other keys they're normal shifts. + + private.shifts_to_parens + + + --KeyOverlaidModifier-- KeyCode::SHIFT_R, ModifierFlag::SHIFT_R | ModifierFlag::NONE, KeyCode::SHIFT_R, KeyCode::KEY_0, ModifierFlag::SHIFT_L + --KeyOverlaidModifier-- KeyCode::SHIFT_L, ModifierFlag::SHIFT_L | ModifierFlag::NONE, KeyCode::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_R + + + --KeyToKey-- KeyCode::SHIFT_L, ModifierFlag::SHIFT_R, KeyCode::KEY_0, ModifierFlag::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_L + --KeyToKey-- KeyCode::SHIFT_R, ModifierFlag::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_L, KeyCode::KEY_0, ModifierFlag::SHIFT_L + + + --KeyToKey-- KeyCode::SPACE, ModifierFlag::SHIFT_R, KeyCode::KEY_0, ModifierFlag::SHIFT_L, KeyCode::SPACE + + +As you can see there's actually a bit more to the mapping, because I was finding +some minor usability glitches in the bare setting. + +Occasionally I'll accidentally type a parenthesis when meaning to do something +else, but it happens so infrequently and the benefits are so great that I'd +absolutely recommend this to anyone who programs a lot. + +Key Layers +---------- + +Now we're getting to things that are directly inspired by the Space Cadet +keyboard. If you don't type a lot of mathematical characters you may not want +to bother with these, but since I've been taking the [Introduction to +Mathematical Thinking][coursera] class on Coursera these bindings have made it +very pleasant to type out my homework. + +[coursera]: https://www.coursera.org/course/maththink + +### Greek + +The Space Cadet had a separate key for typing Greek letters, and I've decided to +do the same. I don't know *exactly* how that modifier key worked, but here's +how my version is going to work. + +* Press and release the "Greek" key to go into "Greek mode" for one character. +* Type the appropriate latin letter to get the Greek character for that key + (capital letters and lowercase are distinct). + +For example, typing `Greek`, then `w` results in ω (omega), while `Greek`, then +`W` results in Ω (capital omega). + +If you want to actually type out full Greek words, this isn't ideal because you +have to press the `Greek` key between every letter. But for my purposes +(variables in math) it's perfect. + +There are two parts to implementing this in KeyRemap4MacBook. First we need to +pick a `Greek` key. I never use the `Command`, `Option`, and `Control` keys to +the right of the spacebar, so I chose the right `Option` key for this. + +If you *do* use the modifiers on the right you might prefer to pick a different +key for this, like `Insert` or `Print Screen`. + +Also, since I'm using the Realforce which is a PC Keyboard, that key is actually +called the "PC Application" key. I'm sure you can figure out how to adjust the +mapping if necessary. + +Here's the first part of the mapping, which binds the `Greek` key: + + :::xml + + Greek Layer + Right PC Application key activates the Greek key layer. + + space_cadet.greek_layer + + + --KeyToKey-- + KeyCode::PC_APPLICATION, + KeyCode::VK_STICKY_EXTRA4 + + +I use the virtual modifier key `EXTRA4`. This key is only intelligible inside +of KR4MB, but that's not a problem since I do all of the rest of the Greek +mapping inside there too. + +I wrote a little [Python script][cadetpy] to generate the rest of the mapping +for me. Here's the whole Greek layer mapping in its entirety: + + +What are all those `Option` modifiers doing in there? Well there's one more +step to making this work. You need to switch your keyboard layout in OS X to +the "Unicode Hex Input" layout under System Preferences → Language and Text +→ Input Sources: + +![Switching to Unicode Hex Input](/media/images{{ parent_url }}/kb-hex.png) + +As far as I can tell this is exactly like QWERTY except that it also allows you +to type in Unicode characters directly by holding `Option` and typing in their +Unicode code point's hex value. That's how the mapping inserts the Unicode +characters for the Greek letters. + +If you want to do this with another keyboard layout I'm not sure how you could +do it. If you find a way let me know and I'll post it here. + +However, there's a problem. The Unicode Hex Input keyboard layout disables OS +X's `Option-Left` and `Option-Right` keyboard shortcuts for some reason I don't +even want to try to guess. Luckily they can be restored with another mapping: + + :::xml + + Restore [Shift-]Opt-(Left/Right) + The Unicode Hex Input keyboard layout disables these keys for some reason. + + space_cadet.fix_opt_arrows + + + --KeyToKey-- + KeyCode::CURSOR_LEFT, VK_OPTION | VK_SHIFT, + + KeyCode::B, + ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L + + + --KeyToKey-- + KeyCode::CURSOR_LEFT, VK_OPTION, + + KeyCode::B, + ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L + + + --KeyToKey-- + KeyCode::CURSOR_RIGHT, VK_OPTION | VK_SHIFT, + + KeyCode::F, + ModifierFlag::OPTION_L | ModifierFlag::SHIFT_L | ModifierFlag::CONTROL_L + + + --KeyToKey-- + KeyCode::CURSOR_RIGHT, VK_OPTION, + + KeyCode::F, + ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L + + + +`Option-Delete` is also broken by Unicode Hex Input. I haven't figured out how +to fix this, but I don't really care about it because I have the following in my +`~/Library/KeyBindings/DefaultKeyBinding.dict` file which lets me use +`Control-w` just like at the command line: + + :::text + { + "^w"="deleteWordBackward:"; + } + +Welcome to the fiddly, maddening world of keybinding customization! + +The Greek layer in my mapping pretty much matches the original Space Cadet +mapping as far as I can tell. Here's a table of the keys and their Greek +counterparts: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyAloneShiftedNotes
aαΑAlpha
bβΒBeta
cχΧChi
dδΔDelta
eεΕEpsilon
fφΦPhi (p was taken and the ph sounds like an f)
gγΓGamma
hηΗEta
iιΙIota
jϑΘTheta (with one of the lowercase variants)
kκΚKappa
lλΛLambda (Lisp users rejoice!)
mμΜMu
nνΝNu
oοΟOmicron
pπΠPi
qθΘTheta (with the other lowercase variant)
rρΡRho
sσΣSigma (with one of the lowercase variants)
tτΤTau
uυΥUpsilon
vςΣSigma (with the other lowercase variant)
wωΩOmega (o was taken and the lowercase kind of looks like a w)
xξΞXi
yψΨPsi (p was taken and it looks a bit like a y)
zζΖZeta
+ +[cadetpy]: https://github.com/sjl/dotfiles/blob/master/keyremap4macbook/cadet.py + +### Math + +The Space Cadet also had a `Top` key for typing the symbols on the top of the +keys, which were (I think) used in APL. I don't use APL, but when typing out +mathematical text it would be nice to have some symbols easily available. + +I've added a Math layer that functions similarly to the Greek layer. I chose +the right `Control` key to activate it. I won't go into detail about how it +works because it's the same as the Greek layer. Here's the code for it if you +want to use it yourself: + +I've currently only filled in the Math layer with keys I find useful, so there +are a lot of empty keys at the moment. I plan to add new ones as I discover +I want them. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyAloneShiftedNotes
aAnd, Aleph
b
cComposition, Complex numbers
d
eElement of, Not element of
fIntegral (i was taken and it looks like an f)
g
h
iIntersection, Infinity
j
k
l
m
nNatural numbers
oOr
p
q
rRoot, Real numbers
s
t
uUnion
v
w
xXor
y
zIntegers
-¬Not (looks like a minus)
=±Not equal, Plus or minus (Shift-= is normally +)
/÷Division
,Less than or equal to (Shift-, is normally <)
.Greater than or equal to (Shift-. is normally >)
1
2
3
4
5
6
7
8×Times or cross product (Shift-8 is normally *)
9
0Null set
`Approximately equal to (Shift-` is normally ~)
[Proper subset of, Not proper subset of
]Proper superset of, Not proper superset of
Left
Right
Up/Down
+ +In addition, the last five rows also support the `Control` key for more +variants: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyCtrlCtrl-ShiftedNotes
[Subset of, Not subset of
]Superset of, Not superset of
Left
Right
Up/Down
+ +Conclusion +---------- + +If you want my full KeyRemap4MacBook configuration you can always get [the +latest version from my dotfiles][dotkr]. + +I've done some crazy, fiddly things to my machine. Undoubtedly lots of people +on Hacker News will scoff and brag about how they only use the defaults. +I don't really care. Given that I spend 60 hours or more a week at the keyboard +if these things only save me 0.01% of my time they'll pay for themselves in +a year or two. Not to mention all the finger pain they'll prevent. Plus, +tinkering around and seeing how far you can push things is fun (sometimes)! + +I'm pretty satisfied with my hardware and layout. My dream would be to get +a custom keycap set with my key labels and the Space Cadet colors/typography +that would fit on a white Realforce. It would be absolutely beautiful, but I'm +sure it'd be far too expensive to make a single custom set. Oh well, maybe some +day! + +[dotkr]: https://github.com/sjl/dotfiles/blob/master/keyremap4macbook/private.xml + +{% endblock article %} diff -r ff00631c1251 -r cf2147225208 layout/skeleton/_base.html --- a/layout/skeleton/_base.html Mon Oct 01 10:27:18 2012 -0400 +++ b/layout/skeleton/_base.html Tue Oct 02 20:02:09 2012 -0400 @@ -5,7 +5,7 @@ - + {% block title %}{% block extra_title %}{% endblock %}{{ page.title|safe }} / {{ site.name }}{% endblock %} @@ -29,15 +29,6 @@ -