Switch de Windows à macOS (pour développeur)#

Guide pratique pour un développeur habitué à Windows qui passe à macOS. Couvre les différences essentielles, les pièges fréquents et les bonnes pratiques de dev.


Différences clés d'environnement#

Aspect Windows macOS
Noyau NT (closed-source) Darwin (Unix, basé sur BSD)
Shell par défaut PowerShell / cmd zsh (depuis Catalina)
Filesystem NTFS / ReFS APFS
Sensibilité à la casse Sensible (Case-sensitive) Insensible par défaut (Foo.txt = foo.txt)
Gestionnaire de paquets winget / Chocolatey / Scoop Homebrew (indispensable)
Permissions élévation UAC (prompt administrateur) sudo (comme Linux)
Séparateur de chemin \ (backslash) / (forward slash, comme Linux)
ligne de fin de fichier CRLF (\r\n) LF (\n)
Registry Oui (regedit) Aucun équivalent (plist + fichiers de config)

Le point le plus important : macOS est un système Unix. Tout ce que vous connaissez de Linux (bash/zsh, permissions POSIX, hiérarchie de fichiers Unix, outils GNU/BSD) s'applique. Votre muscle memory Linux est plus pertinente que votre muscle memory Windows.


Équivalences clavier#

C'est le plus gros choc initial. La touche Cmd (⌘) remplace Ctrl dans la plupart des raccourcis système.

Correspondances générales#

Action Windows macOS
Copier Ctrl+C Cmd+C
Couper Ctrl+X Cmd+X
Coller Ctrl+V Cmd+V
Sélectionner tout Ctrl+A Cmd+A
Annuler (undo) Ctrl+Z Cmd+Z
Refaire (redo) Ctrl+Y Cmd+Shift+Z
Rechercher Ctrl+F Cmd+F
Nouvel onglet Ctrl+T Cmd+T
Fermer onglet / fenêtre Ctrl+W / Alt+F4 Cmd+W / Cmd+Q
Imprimer Ctrl+P Cmd+P
Sauvegarder Ctrl+S Cmd+S
Action Windows macOS
Début de ligne Home Cmd+← ou Ctrl+A
Fin de ligne End Cmd+→ ou Ctrl+E
Mot précédent / suivant Ctrl+← / Ctrl+→ Alt+← / Alt+→
Supprimer mot avant curseur Ctrl+Backspace Alt+Backspace
Supprimer toute la ligne après curseur Ctrl+K
Début / fin de document Ctrl+Home / Ctrl+End Cmd+↑ / Cmd+↓

Astuce : Dans le Terminal macOS, les raccourcis de navigation texte Unix traditionnels fonctionnent aussi (Ctrl+A = début de ligne, Ctrl+E = fin de ligne, Ctrl+W = supprimer mot précédent, Ctrl+U = supprimer ligne entière).

Correspondances de touches physiques#

Touche Windows Touche macOS Note
Ctrl Cmd (⌘) Pour les raccourcis applicatifs
Alt Option (⌥) Caractères spéciaux, navigation mot par mot
Win Cmd ou Fn Selon le contexte
Ctrl (raccourcis shell) Control (même touche) Ctrl+C, Ctrl+Z en terminal restent sur Control
Caps Lock Caps Lock Désactivable dans Réglages Système
Print Screen Cmd+Shift+3 (plein écran) / Cmd+Shift+4 (sélection) Pas de touche dédiée
Delete (suppr à droite) Fn+Backspace ou Delete (selon clavier) Backspace s'appelle "Delete" sur Mac
Num Lock Clear Rarement pertinent

Caractères spéciaux importants#

Touche Symbole macOS Nom
Cmd Command (CLOVER)
Option Option
Shift Shift
Control Control
Caps Lock Caps Lock
Fn Fn ou 🌐 Globe (sur claviers récents)

Gestion des fenêtres#

Bases#

Action Windows macOS
Maximiser Bouton carré Bouton vert (mais = plein écran, pas "maximiser")
Minimiser Bouton _ Bouton jaune (Cmd+M)
Fermer Bouton X Bouton rouge (Cmd+W)
Basculer entre apps Alt+Tab Cmd+Tab
Basculer entre fenêtres d'une même app Cmd+~ (backtick)
Forcer à quitter Gestionnaire des tâches Cmd+Option+Esc
Bureau Win+D F11 ou gesture trackpad
Mission Control (toutes fenêtres) Win+Tab F3 ou Ctrl+↑ (gesture 3 doigts vers le haut)

Différences notables#

  • "Maximiser" : sur macOS, le bouton vert met en plein écran (interface dédiée, cache la barre de menus). Pour simplement agrandir la fenêtre, double-cliquez la barre de titre ou utilisez un tool comme Rectangle.
  • Menu bar : macOS a une barre de menus unique en haut de l'écran (pas dans chaque fenêtre). C'est l'application active qui occupe la barre. L'équivalent du menu contextuel d'une fenêtre est dans cette barre.
  • Redimensionnement : seul le coin bas-droit fonctionne par défaut (contrairement à Windows où on peut agripper tous les bords). Là encore, des tools tierces améliorent ça.
  • Alt+Tab / Cmd+Tab : Cmd+Tab bascule entre applications. Pour basculer entre fenêtres d'une même app, c'est Cmd+~ (ou Cmd+Backtick).

Outils tiers recommandés pour la gestion des fenêtres#

macOS est pauvre en gestion de fenêtres par défaut (pas de snapping à la Windows). Installer :

  • Rectangle (gratuit, open-source) — snapping type Windows (Ctrl+Option+← = moitié gauche). C'est le minimum vital.
  • Magnet (payant App Store) — alternative similaire.
  • Amethyst (gratuit) — tiling window manager type i3/sway.
brew install --cask rectangle

Finder vs Explorer#

Différences conceptuelles#

Concept Explorer (Windows) Finder (macOS)
Sélection multiple contiguë Shift+Clic Shift+Clic
Sélection multiple discontinue Ctrl+Clic Cmd+Clic
Ouvrir dans nouvelle fenêtre Clic milieu ou Ctrl+Double-clic Cmd+Double-clic
Couper / coller fichier Ctrl+XCtrl+V Impossible par défautCmd+C puis Cmd+Option+V pour déplacer
Adresse de chemin visible Barre d'adresse Option+Cmd+P (barre de chemin) ou Cmd+↑
Copier chemin en texte Shift+clic droit → "Copier en tant que chemin" Option+Cmd+C ou clic droit → "Copier [fichier] comme chemin d'accès"
Raccourci vers dossier Barre latérale, favoris Barre latérale (favoris), tags
Recherche Win+F ou barre de recherche Cmd+F ou barre de recherche (Spotlight indexé)

Chemins clés#

Windows macOS Rôle
C:\Users\vous /Users/vous (alias ~) Home directory
C:\Program Files /Applications Applications GUI
C:\Program Files (x86) (pas d'équivalent)
C:\Windows\System32 /usr/bin, /bin, /System Binaires système
C:\Users\vous\AppData\Local ~/Library/Application Support Données app
C:\Users\vous\AppData\Roaming ~/Library/Preferences Préférences
C:\Users\Public /Users/Shared Dossier partagé
\\serveur\partage smb://serveur/partage Partage réseau
Variables d'environnement (UI) ~/.zshrc ou ~/.zprofile

Finder masque les dossiers système par défaut. Pour afficher ~/Library : Finder → menu Aller → maintenir Option → "Bibliothèque" apparaît.


Terminal natif et shells#

Terminal.app vs alternatives#

macOS fournit Terminal.app (dans /Applications/Utilitaires/). Il est fonctionnel mais limité. Installer un meilleur terminal :

Terminal Avantages Installation
iTerm2 Split panes, profiles, hotkey window, triggers, intégration tmux brew install --cask iterm2
Warp Terminal "intelligent" avec AI, blocs de commandes brew install --cask warp
Kitty / Alacritty GPU-accelerated, minimal, très rapide brew install --cask kitty / brew install alacritty
Ghostty Moderne, rapide, par Mitchell Hashimoto brew install --cask ghostty

Recommandation : iTerm2 pour démarrer, c'est le standard.

Shell : zsh par défaut#

Depuis macOS Catalina (10.15), zsh est le shell par défaut (bash est encore dispo mais ancien).

Vérifier votre shell :

echo $SHELL        # /bin/zsh

Fichiers de configuration zsh (par ordre de chargement) :

  1. /etc/zprofile — système, exécuté au login
  2. ~/.zprofile — utilisateur, au login (l'équivalent de .bash_profile)
  3. /etc/zshrc — système, à chaque shell interactif
  4. ~/.zshrcutilisateur, à chaque shell interactif ← c'est ici que vous mettez vos alias, votre PATH, etc.

Améliorer zsh#

Installer un framework comme Oh My Zsh pour avoir de l'autocomplétion, un thème sympa et une gestion simple de plugins :

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Plugins utiles (dans ~/.zshrc, ligne plugins=(...)) :

  • git — alias git essentiels (gst, gco, gpush, etc.)
  • z — saut rapide entre répertoires récents
  • zsh-autosuggestions — autocomplétion type fish
  • zsh-syntax-highlighting — coloration syntaxique en temps réel
  • docker, docker-compose — complétion
  • brew — alias Homebrew

Homebrew — le gestionnaire de paquets#

Homebrew est l'équivalent de apt, dnf, winget sur macOS. C'est le premier truc à installer.

Installation#

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Sur Apple Silicon (M1+), Homebrew s'installe dans /opt/homebrew. Ajoutez au ~/.zprofile :

eval "$(/opt/homebrew/bin/brew shellenv)"

Usage#

# Installer un outil CLI
brew install wget git ripgrep fzf jq node python

# Installer une app GUI (cask)
brew install --cask iterm2 visual-studio-code docker rectangle

# Mettre à jour
brew update && brew upgrade

# Chercher
brew search <terme>

# Lister ce qui est installé
brew list

# Désinstaller
brew uninstall <paquet>
brew uninstall --cask <app>

# Nettoyage
brew cleanup

Formula vs Cask#

Type Rôle Exemples
formula Outils en ligne de commande, libs git, node, python, wget
cask Applications GUI (.app, .dmg) google-chrome, docker, slack, iterm2

Equivalent des commandes Windows#

Besoin Windows macOS (Homebrew)
Installer winget install X brew install X
App GUI winget install X brew install --cask X
Chercher winget search X brew search X
Lister winget list brew list
Maj winget upgrade --all brew upgrade

Brewfile (reproductibilité)#

Pour sauvegarder / restaurer votre setup :

# Exporter
brew bundle dump --file=~/Brewfile

# Réinstaller depuis un Brewfile
brew bundle --file=~/Brewfile

PATH et variables d'environnement#

Sur macOS (zsh), les variables d'environnement se définissent dans ~/.zshrc (ou ~/.zprofile pour les sessions login).

Définir le PATH#

# ~/.zshrc

# Homebrew (Apple Silicon)
eval "$(/opt/homebrew/bin/brew shellenv)"

# Ajouter des dossiers au PATH
export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/.cargo/bin:$PATH"           # Rust
export PATH="/usr/local/opt/python/libexec/bin:$PATH"

# Variables diverses
export EDITOR="code --wait"
export LANG="fr_FR.UTF-8"
export GOPATH="$HOME/go"

Recharger après modification :

source ~/.zshrc

Différences avec Windows#

Concept Windows macOS
Définir une variable setx VAR "valeur" (persistant) ou $env:VAR (PowerShell session) export VAR="valeur" (session) ou dans ~/.zshrc (persistant)
Variables système (UI) Panneau de config → Variables d'environnement Aucune UI — fichier de config
PATH séparateur ; :
Voir une variable echo %VAR% / $env:VAR echo $VAR
Voir toutes les variables Get-ChildItem Env: env ou printenv
Variable utilisateur vs système HKCU\Environment vs HKLM\System\... ~/.zshrc (utilisateur) vs /etc/zshrc (système)

Attention : les apps GUI (lancées depuis le Finder / Spotlight) ne lisent pas ~/.zshrc. Pour passer des variables à des apps GUI, il faut utiliser launchctl setenv VAR valeur ou un fichier .plist dans ~/Library/LaunchAgents.


Git sur macOS#

Installation#

Git est préinstallé sur macOS, mais souvent une version ancienne. Utiliser Homebrew :

brew install git
git --version   # devrait afficher une version récente

Configuration#

git config --global user.name "Votre Nom"
git config --global user.email "vous@example.com"
git config --global init.defaultBranch main
git config --global core.editor "code --wait"
git config --global pull.rebase true

Credentials et SSH#

Option A — GitHub CLI (recommandé) :

brew install gh
gh auth login

gh configure automatiquement les credentials Git HTTPS pour GitHub.

Option B — SSH keys :

ssh-keygen -t ed25519 -C "vous@example.com"
# Suivre les prompts (passphrase optionnelle)
cat ~/.ssh/id_ed25519.pub
# Ajouter la clé publique sur GitHub/GitLab

Le Keychain macOS gère automatiquement le passphrase SSH : une fois débloquée, vous n'avez plus besoin de la retaper pendant la session.

CRLF vs LF#

C'est un piège classique : Windows a tendance à configurer git en mode core.autocrlf=true, ce qui convertit les fins de ligne. Sur macOS, on veut du LF pur :

# Désactiver la conversion automatique
git config --global core.autocrlf false

# Préférable : utiliser un .gitattributes à la racine du repo
echo "* text=auto" > .gitattributes

Gestion des permissions — pas de UAC#

macOS fonctionne comme Linux avec le modèle Unix : permissions POSIX (rwx), utilisateur normal, et élévation via sudo.

Différences fondamentales#

Concept Windows macOS
Élévation de privilèges UAC prompt (GUI, OK/Cancel) sudo commande (CLI, mot de passe)
Compte admin Membre du groupe Administrateurs Membre du groupe admin
Root Pas de root login (SYSTEM) sudo -i ou sudo su - pour shell root
Modifier système UAC sudo
Installer app (GUI) .exe / .msi (UAC) Drag dans /Applications (souvent pas besoin de sudo)

Exemples#

# Modifier un fichier système
sudo nano /etc/hosts

# Installer un binaire dans /usr/local/bin (peut nécessiter sudo selon setup)
sudo cp monbinaire /usr/local/bin/

# Changer le propriétaire d'un fichier
sudo chown vous:staff /chemin/fichier

# Rendre un script exécutable
chmod +x script.sh

L'équivalent "désactiver le UAC"#

Sur macOS, il n'y a pas de toggle pour désactiver l'élévation. Mais vous pouvez :

  • Configurer sudo pour ne pas demander le mot de passe (sudo visudo, ajouter NOPASSWD:déconseillé).
  • Être root en permanence via sudo -i (à éviter).

En pratique, macOS demande votre mot de passe moins souvent que Windows ne demande UAC, car beaucoup d'installations d'apps ne nécessitent pas de privilèges (drag dans /Applications).


Pièges courants#

1. Docker Desktop#

Docker Desktop sur macOS n'est pas natif : macOS ne peut pas faire tourner de conteneurs Linux directement (kernel différent). Docker Desktop lance une VM Linux (via Hypervisor.framework) et expose le daemon Docker.

Implications :

  • Lenteur I/O : le mount de volumes (-v) entre le filesystem macOS et la VM Linux est lent. Solutions :
  • Utiliser des named volumes Docker plutôt que des bind mounts pour les données.
  • Activer VirtioFS dans Docker Desktop (Settings → General → "Choose file sharing implementation") — bien plus rapide que le défaut osxfs.
  • Pour des projets très intensifs I/O (Symfony, Rails, gros node_modules), envisager Colima (plus léger) ou OrbStack (rapide, natif, commercial).
# Alternative légère à Docker Desktop
brew install colima docker
colima start
  • Licence : Docker Desktop est payant pour les entreprises > 250 employés. Colima et OrbStack sont des alternatives.

2. Filesystem case-insensitive par défaut#

APFS sur macOS est case-insensitive mais case-preserving par défaut :

  • Foo.txt et foo.txt pointent vers le même fichier.
  • Le nom affiché préserve la casse (Foo.txt reste Foo.txt), mais ls foo.txt fonctionne aussi.

Pièges :

  • Git : si vous renommez un fichier en changeant juste la casse (MyComponent.jsmycomponent.js), Git sur macOS ne voit pas de changement. Solution :
git mv -f MyComponent.js temp.js
git mv -f temp.js mycomponent.js

ou

git config core.ignorecase false
  • Linux de prod : Linux est case-sensitive. Un code qui marche sur macOS peut casser en prod si deux fichiers ont des noms ne différant que par la casse.
  • Sensibilité configurable : APFS peut être créé en mode case-sensitive (diskutil apfs addVolume ... -caseSensitive), mais c'est rare et certains apps ne le supportent pas.

3. Caractères spéciaux dans les noms de fichiers#

macOS accepte des caractères que Windows refuse (et vice-versa) :

  • macOS autorise : :, ?, * dans les noms de fichiers... enfin non, macOS remplace : par / dans l'API et vice-versa (NFD vs NFC normalization). En fait, macOS interdit : et / dans les noms (comme Windows), mais la substitution est transparente.
  • macOS autorise les noms avec espaces de tête/trailing, très longs, des emojis, etc.
  • Unicode normalization : macOS utilise NFD (decomposed form) pour les noms de fichiers accentués. Linux utilise NFC (composed). Conséquence : un fichier café.txt créé sur Mac peut apparaître comme deux fichiers différents quand on le pousse sur un système Linux via rsync/git. La plupart des outils gèrent ça, mais c'est un piège potentiel.

4. Command line tools pas installés#

Beaucoup d'outils dev (gcc, make, git, headers système) ne sont pas installés par défaut. Le premier git ou compilation peut échouer avec :

xcode-select: note: no developer tools were found at '/Applications/Xcode.app'

Installer les Command Line Tools (sans Xcode complet, ~1.5 Go) :

xcode-select --install

À faire en premier après installation de macOS.

5. brew install lent / erreur de permissions#

Sur Apple Silicon, Homebrew installe dans /opt/homebrew. Si vous avez des erreurs de permissions :

sudo chown -R $(whoami) /opt/homebrew/*

6. Python / pip / system Python#

Le Python système macOS (/usr/bin/python3) est bridgé : vous ne pouvez pas pip install globalement sans casser le système. Solutions :

# Utiliser le Python Homebrew
brew install python

# Ou mieux : utiliser uv (gestionnaire de paquets Python moderne, ultra rapide)
brew install uv

# Ou pyenv pour gérer plusieurs versions
brew install pyenv
pyenv install 3.12.0
pyenv global 3.12.0

7. "Ouvrir avec" — fichier bloqué#

macOS Gatekeeper bloque les apps non signées ("XYZ ne peut pas être ouvert car l'identité du développeur ne peut pas être vérifiée"). Pour bypasser :

  • Réglages Système → Confidentialité et sécurité → "Ouvrir quand même"
  • Ou en CLI :
xattr -cr /Applications/MonApp.app

8. Pas de tiling natif#

Windows 11 a le snapping de fenêtres intégré. macOS n'a rien par défaut. Installer Rectangle dès le premier jour :

brew install --cask rectangle

Bonnes pratiques de dev sur macOS#

Setup minimum recommandé (à installer le jour 1)#

# 1. Command Line Tools (prérequis pour tout)
xcode-select --install

# 2. Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 3. Les essentiels
brew install git node python ripgrep fzf jq gh
brew install --cask iterm2 rectangle visual-studio-code

# 4. Configurer git
git config --global user.name "Votre Nom"
git config --global user.email "vous@example.com"
git config --global init.defaultBranch main
git config --global core.autocrlf false

# 5. Auth GitHub
gh auth login

Workflow quotidien#

  • Terminal : iTerm2 avec un profile configuré (police mono, thème sombre, splits avec Cmd+D / Cmd+Shift+D).
  • Éditeur : VS Code, Neovim, ou JetBrains. Tous marchent identiquement à Windows.
  • Recherche globale : Spotlight (Cmd+Espace) — équivalent de la barre de recherche Windows. Taper une app, un fichier, un calcul, une définition.
  • Gestion des fenêtres : Rectangle pour le snapping.
  • Mot de passe / secrets : Keychain Access (intégré) ou 1Password / Bitwarden.

Productivité#

Raccourci Action
Cmd+Espace Spotlight (recherche globale)
Cmd+Tab Basculer entre apps
Cmd+~ Basculer entre fenêtres d'une même app
Cmd+Option+Esc Force quit (équivalent Task Manager)
Cmd+Option+D Afficher/cacher le Dock
Cmd+Shift+3 Capture plein écran
Cmd+Shift+4 Capture sélection
Cmd+Shift+5 Capture vidéo / options de capture
Cmd+Ctrl+Q Verrouiller l'écran
F3 ou Ctrl+↑ Mission Control
Ctrl+← / Ctrl+→ Switch entre Spaces (bureaux virtuels)

Sensibilité à la casse et Git#

Pour éviter les ennuis en équipe avec des devs Linux :

  1. Ne jamais renommer un fichier en changeant juste la casse.
  2. Si nécessaire, faire le renommage en deux étapes via git mv.
  3. Garder core.ignorecase à true (le défaut) sur macOS pour éviter les bugs.

Secrets et variables#

  • Utiliser Keychain pour stocker les secrets système.
  • Pour les variables d'environnement de dev, un fichier .env à la racine du projet, chargé via direnv :
brew install direnv
# Ajouter à ~/.zshrc :
# eval "$(direnv hook zsh)"

# À la racine d'un projet :
echo 'export DATABASE_URL="postgresql://..."' > .envrc
direnv allow

Performance dev#

  • Désactiver Spotlight sur node_modules : Spotlight indexe tout et peut ralentir un projet avec 50k fichiers. Système Settings → Spotlight → Privacy → ajouter vos dossiers de projets.
# Via CLI (plus rapide)
sudo mdutil -i off /chemin/vers/projet
  • Docker : si vous faites du Docker intensif, utilisez Colima ou OrbStack plutôt que Docker Desktop pour de meilleures perfs I/O.

Backup du setup#

Sauvegarder votre Brewfile et vos dotfiles dans un repo Git :

brew bundle dump --file=~/dotfiles/Brewfile
# + copier ~/.zshrc, ~/.gitconfig, etc.

Permet de restaurer un Mac neuf en quelques minutes.


Cheatsheet — équivalences Windows → macOS#

Tâche Windows macOS
Installer un paquet winget install X brew install X
Installer une app winget install X brew install --cask X ou App Store
Shell PowerShell zsh
Variables d'env Panneau de config ~/.zshrc
Copier / coller Ctrl+C / Ctrl+V Cmd+C / Cmd+V
Recherche globale Win puis taper Cmd+Espace (Spotlight)
Gestionnaire des tâches Ctrl+Shift+Esc Cmd+Option+Esc (Force Quit) ou Moniteur d'activité
Terminal Windows Terminal iTerm2
PATH setx PATH "%PATH%;C:\bin" export PATH="$PATH:/bin" dans ~/.zshrc
Sudo / élévation UAC prompt sudo commande
Screen capture Win+Shift+S Cmd+Shift+4
Lock screen Win+L Cmd+Ctrl+Q
Bureau Win+D F11 (Show Desktop)
Explorer Explorer Finder
Editeur de code VS Code VS Code (identique)

Pour aller plus loin#

tech macos windows developpement productivite