Linuxify your Mac
Recently I got offered a MacBook Pro by my company. Little did I know that how unfriendly macOS's UX really are until I daily-drive it. So here is some lifesaving hacks such that a long time Linux user like me can use the macOS.
UI Scaling
Mac uses a weird scaling paradigm as it mixes up resolution and UI Scaling. The best UI Scaling is to use a "Look-like" resolution of 1920x1080.
Remap keys
The existence of ^(Ctrl in Mac), ⌥ (Option in Mac) and ⌘ (Command in Mac) breaks my flow immediately.
In order to keep my muscle memory, here is the key remapping if you are used to Linux(specifically Gnome)/Windows.
For both Windows/Apple Keyboard
- Ctrl
⌃-> Command - Option
⌥-> Control - Command
⌘-> Option
Use Marta and customize
Mac's Finder is so bad that it is beyond saving. Just use Marta.
Here is the configuration that you should override
environment {
terminal "iTerm"
}
behavior {
actions {
core.trash.confirm false
}
layout {
showActionBar false
}
table {
iconSize 30
}
}
keyBindings {
"Cmd+X" "core.move"
"Delete" "core.trash"
"F2" "core.rename"
"F5" "core.refresh"
}
fonts {
actionBar [ "Default" 18 ]
breadcrumbs [ "Default" 18 ]
virtualTabs [ "Default Bold" 18 ]
files [ "Default" 18 ]
statusBar [ "Default Light" 18 ]
tableHeader [ "Default" 18 ]
tabs [ "Default" 18 ]
preferences [ "Monaco" 18 ]
}
Alt-Tab
Mac does not have the corresponding feature of Alt + Tab. You are supposed to use Command + Tab then Command + `.
You can install the following application to achieve the same thing.
The alt-tab that switches between windows but not application.
https://alt-tab-macos.netlify.app/
Configure the hotkey to be ⌥ + Tab.
Rectangle
The windows snapping for Mac is very anti-ergonomic.
You should install Rectangle to make it reasonable.
Windows Manager that supports Window-style keyboard snapping.
https://rectangleapp.com/
Set the following hotkeys
Super+ Up : MaximizeSuper+ Down: RestoreSuper+ Left: Left HalfSuper+ Right: Right Half
Stats.App
The best Mac System monitor app is Stats.
You can download it from here.
Home-End Behaviour
The Home and End button does not have consistent behaviour on Mac. The only way to make it easier
to use is to set up the KeyBinding yourself. Here is the configuration that I am using.
https://cobus.io/posts/2017-02-09/osx-home-end-keys/#:~:text=This%20remapping%20does%20the%20following,start%20and%20end%20of%20document
Create a file /Users/gordonlau/Library/KeyBindings/DefaultKeyBinding.dict. Put in the following content.
{
"\UF729" = moveToBeginningOfParagraph:; // home
"\UF72B" = moveToEndOfParagraph:; // end
"$\UF729" = moveToBeginningOfParagraphAndModifySelection:; // shift-home
"$\UF72B" = moveToEndOfParagraphAndModifySelection:; // shift-end
"^\UF729" = moveToBeginningOfDocument:; // ctrl-home
"^\UF72B" = moveToEndOfDocument:; // ctrl-end
"^$\UF729" = moveToBeginningOfDocumentAndModifySelection:; // ctrl-shift-home
"^$\UF72B" = moveToEndOfDocumentAndModifySelection:; // ctrl-shift-end
}
Mission Control hotkey for Snapping
Change the hot key for Snapping to Ctrl + Up for showing mission control and Ctrl + Down for showing only the application.
Next Tab/Previous Tab
The next tab/previous tab behaviour is not consistent across different applications.
In Windows, they are Ctrl + Page Up and Ctrl + Page Down.
But in Mac, they are different for different applications.
The only true consistent hotkey are
Command+Shift+[: previous tabCommand+Shift+]: next tab
Terminal's Ctrl + C and Command + C issue
In terminal, Ctrl+C is sending SIGINT,⌘+C is copying files. Since I have already mapped ⌘ to Ctrl on a Windows Keyboard. I cannot use
Ctrl+C to send SIGINT.
- Installing
iTerm, setCopyandPasteto^+Shift+Cand^+Shift+Prespectively. And add^+Cto sendSigINT,^+Dto sendSigTERMand^+zto sendSigTSTP. UseiTermto replace the built-in terminal of Mac. - In vscode, set vscode to sendSequence when
^+C,^+Dand^+zto send signal while terminal is in focus.
[
...
{
"key": "shift+cmd+c",
"command": "-workbench.action.terminal.openNativeConsole",
"when": "!terminalFocus"
},
{
"key": "shift+cmd+c",
"command": "workbench.action.terminal.copySelection",
"when": "terminalTextSelectedInFocused || terminalFocus && terminalHasBeenCreated && terminalTextSelected || terminalFocus && terminalProcessSupported && terminalTextSelected || terminalFocus && terminalTextSelected && terminalTextSelectedInFocused || terminalHasBeenCreated && terminalTextSelected && terminalTextSelectedInFocused || terminalProcessSupported && terminalTextSelected && terminalTextSelectedInFocused"
},
{
"key": "cmd+c",
"command": "workbench.action.terminal.sendSequence",
"args":{
"text": "\u0003"
},
"when": "terminalFocus"
},
{
"key": "cmd+d",
"command": "workbench.action.terminal.sendSequence",
"args":{
"text": "\u0004"
},
"when": "terminalFocus"
},
{
"key": "cmd+z",
"command": "workbench.action.terminal.sendSequence",
"args":{
"text": "\u001a"
},
"when": "terminalFocus"
}
...
]
- If you are using IntelliJ, simply disable the terminal and open
iTermwhenever you want to use Terminal.iTermis superior than the small terminal anyway. - Basically you need to configure each terminal in every application to do the same. Therefore I use mostly
iTermon Mac due to this issue.