Configurer un Mac "comme j'aime"

Je n'y croyais plus… mais ça y est !

It's like the Mac is freaking back!

Apple fait à nouveau du hardware de qualité sans cette (putain) de TouchBar et se paye même deux points supplémentaires de réparabilité par rapport aux Macs de 2020 pour atteindre un délicieux 4/10 :D

En bon fanboy d'Apple je ne pouvais pas passer à côté du MacBook Pro M1 14 pouces de 2021 et je me suis fait un petit plaisir :

  • Puce Apple M1 Pro avec CPU 10 cœurs, GPU 16 cœurs et Neural Engine 16 cœurs
  • 32 Go de mémoire
  • SSD 1 To
  • Trois ports Thunderbolt 4, port HDMI, lecteur de carte SDXC, port MagSafe 3 !

Darwin, sa certification UNIX03 et son mix de NEXTSTEP, Mach, BSD, GNU, XFree86, etc. ne demandent qu'à chanter sur une telle machine.

Mac M1

Ce billet consigne quelques notes que j'ai prises pendant la configuration de mon nouveau Mac pour le faire "comme j'aime".

Préférences

Faire le tour et répliquer les préférences de l'ancien Mac.

Récupérer les mots de passe

  • Installer 1Password
  • Depuis l'ancien Mac dans 1Password : Préférences > Sauvegarder, "Afficher les fichiers" pour récupérer la dernière sauvegarde
  • Transférer la dernière sur le nouveau Mac (via AirDrop par exemple)
  • La restaurer en la plaçant en bon endroit (à trouver dans 1Password : Préférences > Sauvegarder)

Dotfiles et SSH

Récupérer les dotfiles importantes (je me suis toujours dit que je foutrais mes dotfiles dans un repo un jour)

  • .gitconfig
  • .inputrc
  • .profile

Pour récupérer les clés et la config SSH :

  • mkdir ~/.ssh
  • Y rapatrier la config SSH et les clés

MacPorts

Han… il n'y a pas de package manager sour macOS…

Ah bon ? Eh ben déjà t'as l'App Store hein ! On peut même y trouver de l'open source.

Pour du software disons, plus CLI, il y a d'autres possibilités.

Mon choix a toujours été MacPorts :

  • c'est une application native (C et Tcl), pas besoin d'installer Ruby
  • inspiré de FreeBSD Ports
  • depuis quelques années les installations sont beaucoup plus rapide car la plupart des paquets sont des binaires, il n'y a plus besoin de tout compiler depuis les sources
  • il évite autant que possible les conflits avec le système avec une hiérarchie sous /opt VS /usr/local désormais /opt/homebrew avec Apple Silicon pour Homebrew

Pour installer MacPorts :

  1. installer Xcode depuis l'App Store
  2. sudo xcodebuild -license (ou bien ouvrir Xcode) pour accepter la licence
  3. xcode-select --install pour installer les Xcode Command Line Tools
  4. installer MacPorts (ou suivre le guide de migration)

Je dirais que le seul inconvénient est d'avoir à installer Xcode, processus e⸱x⸱t⸱r⸱ê⸱m⸱e⸱m⸱e⸱n⸱t long (même pour les mises à jour).

Ports que j'installe à tous les coups :

  • bash
  • bash-completion
  • curl
  • ffmpeg
  • git
  • htop
  • jq
  • nodejs
  • npm
  • postgresql
  • postgresql-server
    • sudo port load postgresql14-server (pour configurer un lancement au démarrage du Mac)
  • python
  • the_silver_searcher
  • tig

Quelques routines avec MacPorts :

port installed
port outdated
sudo port -v selfupdate
sudo port upgrade outdated
sudo port -f uninstall inactive

port search <portname>
port deps <portname>
sudo port install <portname>
sudo port deactivate <portname>
sudo port uninstall <portname>

Configuration de Terminal

Maintenant qu'on a installé Bash on peut dégager Zsh (je sais, je vieillis).

  • Préférences > Général :
    • Au démarrage, ouvrir > Nouvelle fenêtre avec le profil > Pro
    • Ouvrir les shells avec > Commande > /opt/local/bin/bash
  • Préférences > Profils :
    • Choisir "Pro" dans la colonne de gauche et le mettre "Par défaut" en bas
  • Préférences > Profils > Fenêtre :
    • Taille de la fenêtre : 140 x 40
  • Préférences > Profils > Shell :
    • Lorsque le shell quitte > Fermer la fenêtre

Applications

Quelques applications que j'aime bien :

Il arrive que certaines applications nécessitent de toucher au Kernel pour y ajouter des extensions. C'est devenu un peu compliqué à modifier, mais ça se fait encore.

TextMate

J'ai déjà écrit une ode à TextMate en 2013 pour louer le minimalisme de son interface. Je l'utilise toujours.

Pire, j'utilise toujours le même thème à placer dans ~/Library/Application Support/TextMate/Bundles/RubyRobot.tmbundle.

Comme je bosse mes maths en ce moment et que l'état du rendering des formules de mathématiques sur le Web est pitoyable, j'utilise MathJax dans mes notes Markdown. Je mets juste à jour le JavaScript utilisé :

  • aller dans : Bundles > Edit Bundles… > Markdown (MathJax) > Support
  • clic droit sur append_mathjax_js puis "Show in Finder"
  • modifier le fichier avec :

    puts $stdin.read
    puts <<-SCRIPT
      <script>
        MathJax = {};
      </script>
      <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
    SCRIPT
    

Fichiers

Je n'ai pas poussé mes documents dans iCloud, alors je dois récupérer les fichiers à partir d'un backup.

Je gère toujours ma musique en MP3 (ne me jugez pas).

Or l'application Music est un peu chiante pour récupérer ses playlists. Il faut les exporter en XML une par une, puis les réimporter… Je n'ai pas trouvé mieux.

Synology

Activer le service SMB côté Synology avec credentials car la configuration UPnP de base est à chier.

Puis dans : Finder > Aller > Se connecter au serveur…, saisir smb://synology.

Je peux aussi me servir de VLC sur Apple TV comme d'un client SMB.

Remapper les raccourcis clavier pour la luminosité du clavier

Sur les Macs M1, il n'y a plus de touches de fonction Mac pour régler la luminosité du clavier. C'est hyper chiant d'avoir à le faire à la souris. Heureusement, on peut remapper les touches.

Créer un fichier com.local.KeyRemapping.plist :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.local.KeyRemapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/hidutil</string>
        <string>property</string>
        <string>--set</string>
        <string>{"UserKeyMapping":[
            {
              "HIDKeyboardModifierMappingSrc": 0xC000000CF,
              "HIDKeyboardModifierMappingDst": 0xFF00000009
            },
            {
              "HIDKeyboardModifierMappingSrc": 0x10000009B,
              "HIDKeyboardModifierMappingDst": 0xFF00000008
            }
        ]}</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Le placer dans ~/Library/LaunchAgents, puis :

launchctl load ~/Library/LaunchAgents/com.local.KeyRemapping.plist

Pour annuler :

launchctl unload ~/Library/LaunchAgents/com.local.KeyRemapping.plist
rm -f ~/Library/LaunchAgents/com.local.KeyRemapping.plist

Voir Remapping Keys in macOS 10.12 Sierra et HIDUTIL key remapping generator for MacOS.

Configurer le "tout clavier"

Je n'utilise pas les assistants vocaux pour le moment.

J'aime bien les écrans tactiles, mais quand je surfe sur le Web, il me faut un clavier au bout de deux minutes.

Je me suis habitué à faire énormément de choses au clavier sur mon laptop (Touch ID est une tuerie).

Pour cela je configure les choses suivantes.

Préférences

  • dans Clavier > Raccourcis : cocher "Utiliser la navigation clavier pour déplacer la cible sur les différentes commandes"
  • dans Clavier > Raccourcis > Mission Control : désactiver les raccourcis qui utilisent (ou ctrl) car ça entre en conflit avec par exemple :
  • utiliser le raccourci ⌘> pour "Déplacer la cible sur la fenêtre suivante" dans Clavier > Raccourcis
    • c'est une préférence personnelle

Raccourcis de texte

Typinator, c'est du keylogging bien fait :D

Il y un builtin un peu similaire dans : Préférences > Clavier > Texte, mais moins puissant.

Manipuler les fenêtres au clavier

Dans le temps, il y avait un petit utilitaire pour faire ça mais mon intellect constate qu'il est obsolète.

Du coup je me suis rabattu sur Phoenix, un truc génial qui m'a permis de réimplémenter les fonctionnalités de MercuryMover pour pouvoir déplacer et redimensionner les fenêtres de macOS au clavier.

Lancer Phoenix seulement après avoir fait un alias de la configuration :

  • récupérer le repo https://github.com/kemar/phoenix-mercury-mover dans /Users/kemar/code/
  • ln -s /Users/kemar/code/phoenix-mercury-mover/phoenix.js .phoenix.js

Voir aussi un tour d'horizon des Window Managers.

Commuter les touches de fonction

J'adore les touches de fonction Apple quand j'ai mon ordi sur les genoux. Par contre, quand je suis au bureau avec un clavier externe, je préfère les touches de fonction standard (F1, F2 etc.).

Dans le temps (oui encore), il y avait un petit utilitaire extra pour commuter les touches au cas par cas en fonction du clavier utilisé.

Le code source est dispo ici mais je ne connais pas Objective-C et je n'ai pas le temps d'apprendre là tout de suite.

Du coup j'ai écrit un AppleScript pour commuter "Utiliser les touches F1, F2 etc. comme des touches de fonction standard" dans :

dans : Preferences Système > Clavier.

Je le déclenche avec un raccourci configuré dans Quicksilver (voir l'étape d'après).

Quicksilver

C'est probablement mon application préférée sur Mac :

Quicksilver is, by far, the most useful utility made for OSX ever.

Elle commence quand même à prendre un peu la poussière, ce qui me fout un peu les chocottes d'ailleurs. Il a fallu installer Rosetta 2. Je pense quand même qu'on est proche d'une compilation M1.

Plugins à activer

  • Clipboard Plugin
  • Command Line Tool
  • Event Triggers
  • Extra Scripts Plugin
  • Keyboard Triggers
  • Shelf Plugin
  • Terminal Plugin
  • Text Manipulation Plugin
  • User Interface Plugin

Command Line Tool

  • Préférences > Command Line Tool : Install

Catalog

On peut ajouter des choses au catalogue de recherche. Ici on va le laisser voir un dossier dans lequel j'ai mis des scripts que je veux déclencher sur des combinaisons de raccourcis clavier :

  • Préférences > Catalog > Custom : ajouter /usr/local/bin et configurer "Contenu du dossier"

Raccourcis clavier personnels

Dans Préférences > Triggers :

  • Déclencher l'économiseur d'écran (pour verrouiller l'ordi)
    • Custom Triggers > Add > Keyboard > Select an item /usr/local/bin/launch_screensaver.sh > Action Run
    • Raccourci ⌃⌥⌘L
  • Commuter les touches de fonction
    • Custom Triggers > Add > Keyboard > Select an item /usr/local/bin/toggle_function_keys.scpt > Action Exécuter un AppleScript
    • Raccourci ⌃⌥⌘K
  • Afficher l'historique du presse papier remplacé par Maccy en 2023 (raccourci ⌃⌥⌘C)
    • Dans Général > Clipboard cocher Capture History 100 items + Hide after pasting + Paste on selection
    • Maintenant, "Shelf & Clipboard" doit appraître dans "Catalog > Quicksilver"
    • Vérifier que "Catalog > Quicksilver > Objets internes" est coché
    • Custom Triggers > Add > Keyboard > Select an item Show Clipboard > Action Run
    • Raccourci ⌃⌥⌘C
  • Voir tous les menus de l'application active
    • Custom Triggers > Add > Keyboard > Select an item Current Application > Action Show Menu Items
    • Raccourci ⌃⌥⌘M
  • Afficher l'élément sélectionné comme actif dans Quicksilver
    • Quicksilver > "Sélectionner Current Selection dans l'interface"
    • Raccourci ⌃⌥⌘Space

Scripts pour les raccourcis

Le script launch_screensaver.sh fait juste ça :

open /System/Library/CoreServices/ScreenSaverEngine.app

Dans le temps (oh bordel, c'est la troisième fois que j'utilise cette formule, je suis dans une faille temporelle ou quoi ?), il y avait un truc de fou pour contrôler iTunes au clavier.

Maintenant c'est mort, j'ai l'impression de ne kiffer que des trucs de niche…

Du coup j'ai quelques scripts shell affectés à des raccourcis Quicksilver pour émuler les choses les plus importantes permettant de contrôler Music (iTunes n'existe plus) :

# music_current.sh
osascript <<EOF
tell application "Music"
  set CurrentTrack to name of current track
  set CurrentAlbum to album of current track
  set CurrentArtist to artist of current track
end tell
display notification with title CurrentTrack subtitle CurrentArtist & " – " & CurrentAlbum
EOF

# music_next.sh
osascript -e 'tell application "Music" to next track'

# music_playpause.sh
osascript -e 'tell application "Music" to playpause'

# music_prev.sh
osascript -e 'tell application "Music" to back track'

# music_set_rating_to_0.sh
osascript <<EOF
tell application "Music"
  set rating of current track to 0
  set CurrentTrack to name of current track
end tell
display notification with title CurrentTrack subtitle "☆☆☆☆☆"
EOF

# music_set_rating_to_100.sh
osascript <<EOF
tell application "Music"
  set rating of current track to 100
  set CurrentTrack to name of current track
end tell
display notification with title CurrentTrack subtitle "★★★★★"
EOF

Références Quicksilver

Avant Programmation asynchrone en JavaScript Après La description de Pull Request parfaite

Tag Kemar Joint