Concepts

Plans, étiquettes, ardoises gather/summon, l'aperçu, ancres, marques, règles de fenêtres et groupes — les primitives que vous composez en un flux de travail.

Le modèle mental couvre un seul plan : rangées, colonnes, cellules, divisions, onglets, flottants. Cette page est tout ce que vous bâtissez par-dessus — les primitives qui transforment atlaswm d'un simple tuileur en une boîte à outils. Aucune n'est un mode dans lequel vous êtes enfermé ; elles se composent.

Plans

Un seul plan infini suffit rarement. Un plan est un canevas indépendant complet — ses propres fenêtres, sa propre position de panoramique, son propre zoom. atlaswm maintient un pool de plans et n'en affiche qu'un à la fois : le plan actif remplit la vue, les autres restent inactifs en arrière-plan. Le changement est instantané et sans perte — chaque plan se souvient de l'endroit où vous l'avez laissé, vous retrouvez donc les mêmes fenêtres au même panoramique et au même zoom. Pensez aux espaces de travail i3/sway ou aux espaces nommés de niri, sauf que chacun est un atlas 2D complet plutôt qu'un plein écran.

Le point d'entrée quotidien est le sous-mode planes (Mod+o) : l/h changent, n crée, q ferme un plan vide, Shift+l/Shift+h déplacent la fenêtre ciblée vers le plan suivant/précédent et la suivent. Plus des raccourcis rapides en dehors du sous-mode : Mod+period / Mod+comma.

Deux autres actions, pour des raccourcis ou atlasctl action :

  • plane-switch:<n> — sauter au n-ième plan (indexé à partir de 1), en créant au passage tous les plans nécessaires (la sensation des espaces de travail dynamiques niri/sway : plane-switch:3 depuis un seul plan vous amène au plan 3, ayant discrètement créé les plans 2 et 3).
  • plane-close — détruire le plan actif, mais seulement s'il est vide. Sur un plan non vide, c'est sans effet (un plan contenant des fenêtres n'est jamais démoli silencieusement).

Les identifiants de fenêtre restent globalement uniques d'un plan à l'autre, et déplacer une fenêtre entre plans conserve son identifiant — même client, même contenu, nouveau foyer. Par IPC, atlasctl query planes liste le pool et un champ plane par fenêtre vous indique le foyer de chaque fenêtre.

Étiquettes

Une étiquette est un libellé libre que vous collez sur une fenêtre — work, chat, mail, ce qui nomme un ensemble de travail. Les étiquettes sont indépendantes des plans et de la géométrie de disposition : étiqueter ne déplace jamais une fenêtre, et le même nom peut être porté par des fenêtres dispersées sur différents plans. Une fenêtre peut porter un nombre quelconque d'étiquettes ; elles l'accompagnent par identifiant (la déplacer, la rendre flottante, la passer en plein écran ne touche pas aux étiquettes) et disparaissent à sa fermeture.

Quatre verbes agissent sur la fenêtre ciblée :

  • tag-toggle:<name> — ajoute si absente, retire si présente.
  • tag-add:<name> / tag-remove:<name> — ajout / retrait explicite.
  • tag-clear — retire toutes les étiquettes d'un coup.

Il n'y a aucun raccourci d'étiquette par défaut — les noms d'étiquettes sont les vôtres, la configuration ne peut donc pas les deviner. Définissez les vôtres ("Mod+F1" "tag-toggle:work") ou pilotez-les via atlasctl. Les étiquettes sont aussi ce sur quoi opèrent gather/summon, et ce que les règles de fenêtre peuvent apposer à l'ouverture.

Ardoises : gather et summon

Une étiquette nomme un ensemble de travail ; gather (rassembler) et summon (invoquer) vous laissent voir tout cet ensemble d'un coup — temporairement, sans rien déplacer. Les deux sont un emprunt vivant : rien ne quitte son plan d'origine, et la fermeture restaure tout exactement comme c'était.

Gather

gather-toggle:<tag> rassemble toutes les fenêtres portant <tag> — où qu'elles vivent — dans une vue tuilée temporaire qui remplace votre vue actuelle, et cette vue est pleinement interactive : focus, redimensionnement, déplacement, onglets, plein écran y fonctionnent tous. Fermez-la (la même étiquette de nouveau, ou gather-dismiss) et chaque plan est restauré, chaque fenêtre à sa place. Lancer une application pendant un gather la fait atterrir sur le vrai plan actif (donc un terminal ouvert en plein gather n'est pas perdu à la fermeture) ; fermer une fenêtre rassemblée la ferme partout ; tout changement de plan ferme d'abord le gather.

Summon

Là où gather remplace votre vue, summon-toggle:<tag> la superpose : il fait flotter au-dessus de votre plan actuel toutes les fenêtres portant <tag> qui vivent sur un autre plan — un coup d'œil sur l'ensemble de travail sans quitter l'endroit où vous êtes. Une fenêtre étiquetée déjà sur le plan actuel reste tuilée ; summon la complète. Les fenêtres invoquées sont des flottants ordinaires, pleinement interactifs. Basculez la même étiquette (ou summon-dismiss) pour les masquer.

Gather et summon sont mutuellement exclusifs — une seule vue d'ardoise à la fois. Il n'y a de raccourci par défaut pour aucun des deux ; définissez les vôtres ou utilisez atlasctl.

Aperçu

Un plan remplit la vue ; l'aperçu les montre tous à la fois. Basculez-le avec overview-toggle, ou continuez simplement de dézoomer — un cran au-delà du fit-plane (Mod+z de nouveau au dernier échelon) l'ouvre, l'échelle parcourant donc 100% → 50% → fit → overview. Chaque plan devient un mini-canevas vivant à l'échelle dans une grille (les fenêtres continuent de s'afficher — un watch date continue de tourner), et le plan actif arbore un cadre d'accentuation.

C'est de la navigation pure : cliquez sur une fenêtre pour sauter sur son plan avec elle au focus, ou cliquez sur un plan vide pour y sauter — l'aperçu se ferme et vous atterrissez sur un vrai plan. Tant qu'il est ouvert, les raccourcis normaux sont inertes ; seules les sorties agissent (Escape, zoom, ou de nouveau overview-toggle). Vous pouvez aussi glisser une fenêtre de la cellule d'un plan vers la cellule d'un autre plan pour l'y déplacer — la cellule de destination se surligne pendant le glissement ; un simple clic continue de sauter.

Il n'y a pas de raccourci par défaut : dézoomer au-delà du fit-plane est le chemin de découverte.

Ancres

Une ancre est un signet de vue nommé sur un plan — un endroit où vous revenez d'un saut.

  • anchor-set:<name> enregistre le centre de la vue actuelle du plan actif.
  • anchor-jump:<name> recentre la vue dessus (indépendant du zoom — la valeur stockée est une coordonnée de plan).
  • anchor-clear:<name> la supprime.

Les ancres sont par plan : le même nom sur le plan 2 est un endroit différent que sur le plan 1. Vous pouvez ensemencer des ancres sur le plan 1 depuis la configuration — utile pour une disposition fixe à laquelle vous revenez toujours :

anchors {
    "hub"  x=0    y=0
    "mail" x=4000 y=0
}

binds {
    "Mod+a" "anchor-jump:hub"
    "Mod+e" "anchor-jump:mail"
}

C'est la colonne vertébrale d'un flux de travail en moyeu et satellites : dispersez des ensembles de travail sur un grand plan et sautez de l'un à l'autre par leur nom.

Marques

Les marques sont à la manière de vim : posez une marque sur une fenêtre, et revenez-y d'un saut plus tard. La casse du nom choisit la portée :

  • minuscules = locale (par plan) : le même nom est une fenêtre différente sur chaque plan.
  • MAJUSCULES = globale : une seule table à l'échelle de la session ; le saut suit la fenêtre d'un plan à l'autre.
mark-set:<name>     marquer la fenêtre ciblée
mark-jump:<name>    cibler la fenêtre marquée (change de plan si besoin)
mark-clear:<name>   supprimer la marque

Il n'y a pas de raccourci de marque par défaut ; la configuration typique est un sous-mode mark pour poser et un sous-mode jump pour sauter (ainsi Mod+m a marque, Mod+' a saute). Les marques n'existent qu'à l'exécution (l'identité d'une fenêtre n'est pas stable d'un redémarrage à l'autre, elles ne sont donc pas ensemencées depuis la configuration). Les marques s'effacent automatiquement à la fermeture de leur fenêtre.

À rapprocher : jump-to-window (jump-to-window) appose sur chaque fenêtre actuellement à l'écran un badge avec une lettre ; appuyez sur la lettre pour cibler cette fenêtre. C'est un « cible celle-là » rapide sans avoir à mémoriser une marque.

Règles de fenêtre

Faites correspondre une fenêtre par app-id et/ou titre (regex) à son ouverture, et redéfinissez où et comment elle atterrit. Plusieurs règles correspondantes se cumulent dans l'ordre du document (la dernière l'emporte sur un scalaire ; les étiquettes de toutes les correspondances s'unionnent). Les règles s'appliquent aux fenêtres ouvertes après un (re)chargement.

rules {
    rule {
        match app-id="^(firefox|chromium)$"
        plane 2
        tag "web"
    }
    rule {
        match title=".*Picture-in-Picture.*"
        float #true
        size 480 270
    }
    rule {
        match app-id="Slack"
        open-as-tab #true
        tag "comms"
    }
}

Redéfinitions disponibles : plane <n> (plan cible indexé à partir de 1, ouvert en arrière-plan — vous restez en place), tag "<name>" (répétable, s'unionnent), float #true, size <w> <h> (pour les flottants), open-as-tab #true (rejoindre le conteneur ciblé en tant qu'onglet). Une regex incorrecte est une erreur de configuration — la dernière configuration valide continue de s'exécuter, et vous la corrigez par rechargement à chaud. Les règles correspondent aussi aux fenêtres XWayland (X11), par leur WM_CLASS / titre.

Pas encore : l'étiquetage automatique se fait via les verbes manuels tag-* plus ces règles ; il n'y a pas encore de « toujours ouvrir à l'ancre Y » par application (le spawn-at-anchor est reporté). Utilisez une règle plane <n> plus un raccourci anchor-jump pour l'équivalent le plus proche aujourd'hui.

Groupes

Un groupe est un amas tuilé connexe. Un plan peut contenir plusieurs groupes déconnectés — des amas de tuiles posés à l'écart sur le canevas, le modèle d'ensembles de travail à la driftwm.

  • spawn-new-group démarre un amas neuf en haut à gauche de la vue.
  • group-next / group-prev basculent entre les amas d'un plan (en restaurant le focus de chaque groupe).
  • group-to-plane-next / group-to-plane-prev / group-to-plane:<n> déplacent le groupe ciblé entier vers un autre plan, intact (et le suivent). Les identifiants de fenêtre sont inchangés, les étiquettes suivent donc.
  • group-tag-toggle:<name> (et -add / -remove / group-tag-clear) étiquettent toutes les fenêtres du groupe d'un coup. Comme cela réutilise le magasin d'étiquettes, gather/summon sur cette étiquette devient « afficher temporairement tout ce groupe » gratuitement.

Une configuration naturelle associe ces verbes à un sous-mode groups à action unique :

binds {
    "Mod+g" "submap:groups"
}

submaps {
    groups oneshot=#true {
        "n" "spawn-new-group"
        "l" "group-next"
        "h" "group-prev"
        "L" "group-to-plane-next"
        "t" "group-tag-toggle:work"
        "Escape" "submap-exit"
    }
}

Pas encore : déplacer des fenêtres individuelles entre groupes, repositionner un groupe, et le focus géométrique inter-groupes ne sont pas implémentés — les groupes se déplacent et s'étiquettent en bloc, mais vous ne brassez pas de fenêtres au-delà des frontières de groupe aujourd'hui.

Et ensuite

Ces primitives sont délibérément petites pour que vous puissiez les combiner. Les recettes de flux de travail montrent quatre façons de faire exactement cela, chacune avec une configuration prête à copier-coller.