Keyboard shortcut inconsistency is a low-grade remote team problem. Pair programming sessions become awkward when the navigator says “just hit the command to format” and the driver doesn’t know which one. Screen shares show different tool layouts. New engineers spend days figuring out which shortcuts the team actually uses.
This guide covers creating a shared shortcut standard and distributing it through dotfiles, settings sync, and onboarding automation.
Define Your Team’s Shortcut Standard
Start by documenting the shortcuts your team actually uses, not aspirational ones. Survey the team and standardize around the most common choices. Here’s a starter template:
# Team Keyboard Shortcut Standard
## Universal (All Tools)
| Action | Mac | Linux/Windows |
|--------|-----|---------------|
| Command palette | Cmd+Shift+P | Ctrl+Shift+P |
| Find in files | Cmd+Shift+F | Ctrl+Shift+F |
| Format document | Cmd+Shift+I | Ctrl+Shift+I |
| Toggle terminal | Ctrl+` | Ctrl+` |
| Go to definition | F12 | F12 |
| Find references | Shift+F12 | Shift+F12 |
| Rename symbol | F2 | F2 |
| Quick fix | Cmd+. | Ctrl+. |
| Save all | Cmd+Option+S | Ctrl+K S |
## Git Operations (VS Code / Cursor)
| Action | Mac | Linux/Windows |
|--------|-----|---------------|
| Git commit | Cmd+Enter (in Source Control) | Ctrl+Enter |
| Open source control | Ctrl+Shift+G | Ctrl+Shift+G |
| Stage file | Cmd+Enter on file | Ctrl+Enter |
| Discard changes | Cmd+Z in diff | Ctrl+Z |
## Navigation
| Action | Mac | Linux/Windows |
|--------|-----|---------------|
| Go back | Ctrl+- | Alt+Left |
| Go forward | Ctrl+Shift+- | Alt+Right |
| Recent files | Cmd+E | Ctrl+E |
| Switch editor | Cmd+1/2/3 | Ctrl+1/2/3 |
| Move to next problem | F8 | F8 |
VS Code / Cursor Settings Sync
The simplest distribution method for VS Code-based editors is Settings Sync:
- In VS Code:
Cmd+Shift+P> “Settings Sync: Turn On” - Sign in with GitHub
- Share the Gist ID with the team
For teams that prefer more control, use a shared keybindings.json:
// .vscode/keybindings.json (checked into repo for team use)
// Copy to: ~/.config/Code/User/keybindings.json
[
// Format document with Prettier
{
"key": "cmd+shift+i",
"command": "editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
// Run tests in current file
{
"key": "cmd+shift+t",
"command": "testing.runCurrentFile"
},
// Toggle integrated terminal
{
"key": "ctrl+`",
"command": "workbench.action.terminal.toggleTerminal"
},
// Go to next error/warning
{
"key": "f8",
"command": "editor.action.marker.next",
"when": "editorFocus"
},
// Rename symbol
{
"key": "f2",
"command": "editor.action.rename",
"when": "editorHasRenameProvider && editorTextFocus && !editorReadonly"
},
// Quick fix
{
"key": "cmd+.",
"command": "editor.action.quickFix",
"when": "editorHasCodeActionsProvider && editorTextFocus && !editorReadonly"
},
// Move line up/down
{
"key": "alt+up",
"command": "editor.action.moveLinesUpAction",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "alt+down",
"command": "editor.action.moveLinesDownAction",
"when": "editorTextFocus && !editorReadonly"
},
// Duplicate line
{
"key": "cmd+d",
"command": "editor.action.copyLinesDownAction",
"when": "editorTextFocus && !editorReadonly"
},
// Open file in new tab
{
"key": "cmd+enter",
"command": "workbench.action.files.newUntitledFile"
}
]
Apply via script:
#!/bin/bash
# scripts/setup-vscode-shortcuts.sh
KEYBINDINGS_SRC="$(git rev-parse --show-toplevel)/.vscode/keybindings.json"
if [[ "$OSTYPE" == "darwin"* ]]; then
DEST="$HOME/Library/Application Support/Code/User/keybindings.json"
else
DEST="$HOME/.config/Code/User/keybindings.json"
fi
mkdir -p "$(dirname "$DEST")"
cp "$KEYBINDINGS_SRC" "$DEST"
echo "VS Code keybindings installed to $DEST"
tmux Shortcut Standard
For teams using tmux, standardize the config:
# ~/.tmux.conf (distribute via dotfiles repo)
# ========================
# TEAM STANDARD KEYBINDINGS
# ========================
# Prefix: Ctrl+A (more ergonomic than Ctrl+B)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# Reload config
bind r source-file ~/.tmux.conf \; display "Config reloaded"
# Split panes (intuitive)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# Navigate panes (vim-style)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Resize panes
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# Switch windows
bind -n M-1 select-window -t 1
bind -n M-2 select-window -t 2
bind -n M-3 select-window -t 3
bind -n M-4 select-window -t 4
# New window in current path
bind c new-window -c "#{pane_current_path}"
# Mouse support
set -g mouse on
# Copy mode (vim-style)
setw -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
Dotfiles Repository for Team Distribution
A dotfiles repo ensures everyone gets the same configs on setup:
# Structure
dotfiles/
├── .tmux.conf
├── .zshrc
├── .gitconfig
├── vscode/
│ ├── keybindings.json
│ └── settings.json
├── scripts/
│ └── install.sh
└── README.md
#!/bin/bash
# dotfiles/scripts/install.sh
set -euo pipefail
DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
link_file() {
local src="$1"
local dst="$2"
mkdir -p "$(dirname "$dst")"
if [ -f "$dst" ] && [ ! -L "$dst" ]; then
mv "$dst" "${dst}.backup.$(date +%Y%m%d)"
echo "Backed up $dst"
fi
ln -sf "$src" "$dst"
echo "Linked $src -> $dst"
}
# Shell configs
link_file "$DOTFILES_DIR/.tmux.conf" "$HOME/.tmux.conf"
link_file "$DOTFILES_DIR/.zshrc" "$HOME/.zshrc"
link_file "$DOTFILES_DIR/.gitconfig" "$HOME/.gitconfig"
# VS Code
if [[ "$OSTYPE" == "darwin"* ]]; then
VSCODE_PATH="$HOME/Library/Application Support/Code/User"
else
VSCODE_PATH="$HOME/.config/Code/User"
fi
link_file "$DOTFILES_DIR/vscode/keybindings.json" "$VSCODE_PATH/keybindings.json"
link_file "$DOTFILES_DIR/vscode/settings.json" "$VSCODE_PATH/settings.json"
echo "Dotfiles installed"
Onboarding instruction:
git clone git@github.com:your-org/dotfiles.git ~/.dotfiles
bash ~/.dotfiles/scripts/install.sh
Shell Aliases as Team Standard
# ~/.zshrc / ~/.bashrc additions (in dotfiles repo)
# ================================================
# TEAM STANDARD ALIASES
# ================================================
# Git
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gca='git commit --amend --no-edit'
alias gp='git push'
alias gpf='git push --force-with-lease'
alias gl='git log --oneline --graph --decorate -20'
alias gd='git diff'
alias gds='git diff --staged'
alias gco='git checkout'
alias gb='git branch'
alias gpr='git pull --rebase'
# Docker
alias dc='docker compose'
alias dcu='docker compose up -d'
alias dcd='docker compose down'
alias dcl='docker compose logs -f'
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
# Kubernetes
alias k='kubectl'
alias kns='kubectl config set-context --current --namespace'
alias kctx='kubectl config use-context'
alias kpf='kubectl port-forward'
# Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ll='ls -la'
alias grep='grep --color=auto'
Related Reading
- Remote Team Terminal Emulator Comparison 2026
- Remote Team Git Hooks Standardization Guide
- How to Create a Remote Dev Environment Template
- Best Employee Recognition Platform for Distributed Teams