In which I rant about the sorry state of tabbed documents under Mac OS

One of the things the Mac is known for is its consistency in keyboard shortcuts. Obviously, the cut, copy, and paste shortcuts are the same across apps. Cmd-comma always brings up preferences, when available. Cmd-W closes the current window. Cmd-P is print. Cmd-Shift-P is print settings. The Cmd-whatever list goes on and on: N for new, O for open, Q for quit, S for save, shift-S for save as, usually some variant if E for export and some variant of I for information, and so on. It seems like a very minor thing, but this attention to detail can get you proficient at applications quickly. When all apps use the same keyboard shortcuts, there’s never any question or second-guessing about what keys you hit to do something quickly. Additionally, everything you can do is visible plain as day in the pulldown menu system (specifically, while right-click context menus exist, nothing is secreted away on those that is not also available in the regular pulldowns) with keyboard shortcuts printed next to their corresponding menu items. Something you use often enough from the pulldown menus has a built-in teaching mechanism to reinforce the associated keyboard shortcut.

Unfortunately, this all breaks down in a glaringly obvious way when dealing with tabbed document windows. Widespread use of tabbed document windows is actually a relatively new thing to Mac OS. I think part of this is the philosophy of the user interface and its existing keyboard shortcuts. The Human Interface Guidelines, going back long before I ever started using a Mac, has always advocated a one-window-per-document paradigm. This effectively keeps up the desktop metaphor: a word processing window is thought of as a piece (or stack) of paper and documents get stored within folders and all that. Sticking to this paradigm is easier on the Mac than on Windows because of how keyboard-tabbing through windows works. On Windows, every window in the system is in a list (well, minus special windows like toolbars) and Alt-Tab navigates you through that list. If you have five browser windows open and three Word documents, it’ll take you eight Alt-Tabs to spin around the list back to the current document. Windows ends up conserving the number of things you have in the window list by consolidating a bunch of documents into one tabbed window. On the Mac, there are two sets of window lists: one for applications and one for the windows within an application. Alt-Tab switches you between applications and Alt-` (that’s the back-tick, the same key as the tilde) switches you between windows within the current application. On the surface, this scheme may sound a little counter-intuitive, as there are now two variables to keep track of when you want to keyboard your way to another window, but in practice it is surprisingly easy to pick up and use effectively. The Alt-Tab and Alt-` let you more finely tune your window navigation, giving you a better signal-no-noise (or wanted-to-unwanted) ratio when picking windows. In programmer-speak, it’s the difference between a binary search and traversing a linked list. Instead of going through all windows to get where you want, you narrow your search to a given application, then narrow further to the specific window.

I think another contributing factor to tabbed document windows being so rare under Mac OS has to do with the development tools. Because, historically, programmers were not encouraged (in fact, actively discouraged) from making tabbed document windows, XCode did not have pre-built templates for such things. Back when I was writing Windows applications (with Visual C++ v4.2, if that dates me), it was as simple as selecting “MDI” (Multiple Document Interface) as your application type, and the majority of the required code is written for you. (Okay, technically, MDI is not quite a tabbed interface, but it was pretty darn close.) On the Mac you would have had to cobble together your own multiple document interface out of the existing system widgets (like the tab strip) or roll your own. All of the templates stuck to the one-document-per-window metaphor. In summary, it is not easy to make tabbed document applications on the Mac. [Please note that this paragraph is based on my experience with Mac programming 2-3 years ago. I’m a low-level firmware engineer and do not always keep up on the latest and greatest developments with XCode.]

Although Safari is not the first application to bring tabbed documents to OS X (the first I’m aware of, off the top of my head, is Camino, but I am sure there is prior art), it is certainly the current gold standard. Apple wrote it and Apple happens to be the guys who wrote and maintain the Human Interface Guidelines, and people pay attention to how they implement things. To switch between tabs, they use Cmd-Shift-[ and Cmd-Shift-] for the previous and next tabs. Earlier versions used something wacky like Cmd-Shift-Left-Arrow and Cmd-Shift-Right-Arrow, but those have since been deprecated. They happen to conflict with pre-existing text field highlighting shortcuts and prevented you from switching tabs when a text entry field has focus and so they changed to something more unique. So are you following me here? Gold Standard. Cmd-Shift-[ and Cmd-Shift-].

Personally, I don’t use Safari all that much. I stick with Firefox. Firefox has the decency to follow the same Cmd-Shift-[ and Cmd-Shift-] that Safari uses. Nice. It has the added bonus of Cmd-1 through Cmd-9 taking you directly to a tab. The few times I find myself in Safari, I accidentally try to use these shortcuts, which Safari instead has mapped to the first 9 bookmarks on your toolbar. Oops. There is a slight disconnect here with Cmd-1 through Cmd-9. I prefer Firefox’s way, but that’s mainly because I have been using it longer and more frequently than Safari.

There are not very many other tabbed document interfaces in OS X, but the two others I do use frequently are all over the place with their shortcuts. For everyday editing, including text, HTML, CSS, JavaScript, PHP, and whatnot I use TextMate. For C/C++ code, I use Eclipse. (Yeah, yeah — I know — I should be using XCode, but Eclipse works the same on Linux and Mac, so there is less mental context-switching if I use Eclipse for all compiled code.)

TextMate gets the WTF award for pulling Cmd-Option-Left-Arrow and Cmd-Option-Right-Arrow out of its butt. At least it supports the same Cmd-1…Cmd-9 that Firefox does, but the previous/next tab thing is highly annoying. The Cmd-Shift-[ and Cmd-Shift-] that I keep accidentally pushing are for de-indent and indent, which brings up another WTF. Virtually every [graphical] editor I have used in the past, uses Tab and Shift-Tab to indent and de-indent a line or block of selected code. In TextMate, highlighting a block of code and hitting Tab will replace that whole block with 4 spaces. Great. Thanks. Cmd-Z and I have gotten to be good friends.

Eclipse betrays its Windows origins. Switching tabs is done by Ctrl-Tab, which cycles you through documents in order of most recently used. There is no menu item or keyboard shortcut for going to the previous/next tab. You kind of have to keep an exact mental list of what you’ve been working on recently so that you can efficiently skip around between tabs. Moving to the next or previous tab requires you to Ctrl-Tab enough times to get to where that tab is in the “stack.” It is awkward at best and annoying and time consuming at worst. If your mental list of what tabs you have recently visited does not exactly match the computer’s actual list, you can overshoot or undershoot by a tab.

Maybe I am being nit-picky, but when everything else in the OS has an OCD level of consistency and attention to detail, these tabbed navigation shortcut differences really stand out.

Posted in: Dear Diary

2 thoughts on “In which I rant about the sorry state of tabbed documents under Mac OS”

    1. I took Excel into consideration when writing that, but decided that sheets are more like pages within the same document as opposed to a tabbed interface between different documents.

Leave a Reply

Your email address will not be published. Required fields are marked *