A year ago, I did the switch from Linux to Mac OS at work. While the initial couple of weeks were painful, I’ve gradually grown to love the Mac environment. It’s a good balance of a Unix-like development environment with ease of use and commercial supported software.
But no matter how praised Apple’s design is, they have failed in some areas. The Mac OS app switcher is one of them. A lot can be said on how an app switcher should work, but there are a couple of clear cock-ups in the Mac OS flavor.
Mac OS has chosen to emphasize apps over windows, thus the main keybinding is for switching between different apps (Cmd+Tab). A separate keybinding is provided for switching between windows of a single app (Cmd+backtick).
The choice of Cmd+backtick (`) is because backtick is the key above tab, making it a natural choice for related functionality. The glaring problem is that this is hugely US-centric. Any non-US keyboard – including the US-international keyboard – has backtick in a different location.
Compare the key combinations on a couple of standard keyboard layouts:
To make the keybinding work in any reasonable way, the user must know how to manually rebind the keybinding to Cmd+section sign (§) or whatever character happens to be above tab. (For those without the know-how, it’s from System Preferences → Keyboard → Shortcuts → Keyboard → Move focus to next window.)
Similar functionality, different way of working
The second glaring usability issue is the way the two functionalities work. Switching between apps and windows is completely analogous functionality, so they should work the same, right? Alas, they don’t.
The most common use-case by far is switching back and forth between two apps or windows. Switching between two apps is simple: you just press (and release) Cmd+Tab repeatedly. Do the same with Cmd+backtick, and it won’t switch between the two windows, but cycle through all the windows of the app. To move back and forth between two windows (assuming you have more than two) you have to alternate between Cmd+backtick and Cmd+Shift+backtick.
There is simply no excuse for this kind of inconsistency. I even posted a question on UX StackExchange, and have yet to receive a single explanation for this logic.
I have some other gripes about the switcher as well, though I admit these ones can be argued against.
The philosophy of switching between apps, not windows, seems to be a remnant from the 90s, when each task had its own app. Especially with the prevalence of web apps, the browser is increasingly the app within which different tasks are performed. Why should I have to use cognitive effort to know which keybinding I have to hit? I want to switch between tasks (i.e. windows), not apps.
Another is that when switching apps, it brings all the app windows to front at once. I often have multiple terminal windows open and I want one of them on top, not all of them. This I admit is highly dependent on usage patterns.
Thirdly, the app switcher shows all apps open on all desktops. Cognitively, I split up different types of work on different desktops, and want to switch only between those in the current context. In any case, if I select, say, the mail client which is not on the current desktop, instead of actually taking me to the correct desktop and showing the app, it just leaves me staring at an unchanged (apart from the menu bar) screen.
Fortunately, there are a few pieces of software that provide a custom window switcher, and they can even be bound to the standard Cmd+Tab keybinding.
(Updated) I previously recommended Witch, until I discovered HyperSwitch. HyperSwitch is blazingly fast, allows switching between the two recent windows without even bringing the switcher into view (set “Delay activation for” to ~200 ms), shows preview images, and just works incredibly well out-of-the-box. (As of Feb 2019 it’s available free in Beta.)