# XMonad, tiling WM et plus si affinités

**URL:** <https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207>\
**Category:** Trucs et Astuces\
**Created:** [Février 20, 2016, 8:11 UTC](https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207 "2016-02-20T20:11:40Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 20, 2016, 8:11 UTC](https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207/1 "2016-02-20T20:11:40Z")

</div>

Quand on installe Xmonad, on se retrouve avec un tiling WM semblable à DWM.  
Un des intérets des tiling WM est que l’on peut se passer presque totalement  
de la souris (à part pour gimp et deux trois autres trucs pas conçus pour ça),  
on peut aussi noter que l’espace disponible sur l’écran est totalement utilisé.  
C’est très léger et procure déja un grand confort d’utilisation.

Les dépendances :`~$ aptitude show xmonad | grep Dépend 
Dépend: libc6 (>= 2.3), libffi5 (>= 3.0.4), libgmp3c2, libx11-6, libxext6,`

Les recommandations :`$ aptitude show xmonad | grep Recommande
Recommande: libghc6-xmonad-dev, libghc6-xmonad-doc`

Une des grandes différence avec DWM, mis à part le langage utilisé pour l’écrire,  
(-DWM est écrit en moins de 2000 lignes de C,  
-Xmonad en ~400 lignes d’Haskell pour les mêmes fonctionnalités)  
est la manière dont on peut le configurer et l’étendre.

Si vous avez installé le paquet libghc6-xmonad-doc, vous pouvez voir  
un exemple de fichier de configuration en tapant :

```auto

```

(si ça ne marche pas décommentez la ligne  
[-x /usr/bin/lesspipe] && eval "$(SHELL=/bin/sh lesspipe)"  
dans votre ~/.bashrc).  
Il suffit de le décompresser dans le répertoire ~/.xmonad/ et de l’éditer  
à nos souhaits. Jusque là pas de grandes différences avec DWM,  
édition d’un fichier puis recompilation.

Certain vont penser que des connaissances en Haskell sont nécessaires,  
c’est sur que ça doit encore agrandir les possibilités, mais on peut  
aussi très bien faire sans.

Il suffit pour cela d’installer les paquets suivants :

libghc6-xmonad-contrib-dev et libghc6-xmonad-contrib-doc

(le mot contrib n’a ici pas le même sens que celui des dépots Debian,  
ces deux paquets sont dans la section main, je tiens à rajouter  
que les dépendances quittent le domaine du léger)

Le premier contient les bibliothèques d’extensions et le second la doc  
Même pour les utilisateurs de Lenny, je recommande d’installer  
la version Sid ou Squeeze,  
(edit en ce moment (mai 2009) j’ai des soucis avec le compilateur haskell de sid (ghc6 6.10.3-1),  
c’est plus prudent d’installer la version de squeeze)  
les dépendances ne devraient pas  
déstabiliser votre système et vous profiterez d’extensions plus récentes.

C’est maintenant que les différences avec DWM vont apparaître.

Pour avoir une vue d’ensemble des possibilités,  
ouvrir avec son navigateur préféré le fichier

/usr/share/doc/libghc6-xmonad-contrib-doc/html/index.html

(Si vous n’avez pas installé le paquet il y a la même chose [ici](http://xmonad.org/xmonad-docs/xmonad-contrib/)).

et là, on tombe sur une jolie collection d’extensions  
contenant des actions, des layouts, des prompts et des utilitaires.  
Du pré-cuit pour les cuisiniers sans imagination,  
une vraie mine d’or pour moi.

Une autre mine d’or :  
[http://www.haskell.org/haskellwiki/Xmonad/Config\_archive](http://www.haskell.org/haskellwiki/Xmonad/Config_archive)  
comme son nom l’indique, une archive des configurations  
des utilisateurs.

Une des premières choses à faire sera de faire en sorte de pouvoir  
changer de bureau virtuel avec un clavier français,  
ce qui n’est pas possible par défaut car on n’a pas les chiffres  
en accès direct. Il faut choisir parmi ces trois possibilités :

1. les touches de fonctions

2. le pavé numérique

3. le code des touches de chiffres.

4. C’est la plus simple, il suffit de remplacer 1 et 9 par F1 et F9  
dans la ligne suivante de votre ~/.xmonad/xmonad.hs

```auto

```

1. Pas beaucoup plus compliqué on remplace la même ligne que précedemment par

```auto

```

et on ajoute

`numPadKeys = [ xK_KP_End, xK_KP_Down, xK_KP_Page_Down -- 1, 2, 3
             , xK_KP_Left, xK_KP_Begin, xK_KP_Right -- 4, 5, 6
             , xK_KP_Home, xK_KP_Up, xK_KP_Page_Up -- 7, 8, 9
             , xK_KP_Insert] -- 0`

dans la section main du ~/.xmonad/xmonad.hs ( vers le bas du fichier)

1. On lance xev dans un terminal et on récupère le code des touches  
qui nous interesse, et on remplace toujours la même ligne par :

```auto

```

Jusque là, c’est encore bien minimaliste, il n’y a même pas une petite barre  
pour nous montrer la date et l’heure, sur quel bureau virtuel on se situe,  
sur lesquels il y a des fenêtres d’ouvertes, etc…

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 20, 2016, 8:11 UTC](https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207/2 "2016-02-20T20:11:40Z")

</div>

Pour y remédier on peut ajouter une barre de notification en mode texte  
ou un panel d’environnement de bureau que l’on pourra faire apparaître et disparaître  
à volonté avec le clavier.

Comme barre de notification en mode texte, il existe xmobar et dzen2,  
pour les panels, chaque environnement de bureau a un paquet séparé pour le sien.

J’ai essayé avec xmobar et le panel de xfce.

À noter, on peut associer xmobar avec trayer sur la même ligne en leur donnant  
à chacun une largeur fixe, pratique pour ceux qui veulent loger une petite applet  
pour le réseau par exemple.

On peut obtenir xmobar en binaire [ici](http://code.haskell.org/~arossato/xmobar/xmobar-0.9.2.bin) et les sources [ici](http://hackage.haskell.org/packages/archive/xmobar/0.9.2/xmobar-0.9.2.tar.gz)

une fois xmobar installé il faut créer un fichier ~/.xmobarrc  
dont on peut trouver un exemple dans le répertoire des sources  
sous l’appelation xmobar.config-sample, ne pas oublier d’ajouter

`, Run StdinReader` à la suite de tous les , Run … dans ~/.xmobarrc  
afin d’éviter de boucher le pipe, et éditer son ~/.xmonad/xmonad.hs.

On commence par importer les modules nécessaires en les ajoutant

`import XMonad.Hooks.DynamicLog 
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import System.IO`  
dans les imports en haut du fichier et on se refère à la doc  
/usr/share/doc/libghc6-xmonad-contrib-doc/html/XMonad-Hooks-ManageDocks.html  
ou [http://www.xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-ManageDocks.html](http://www.xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-ManageDocks.html)  
pour ajuster à nos souhaits et dans la partie main en bas du fichier,  
on remplace :

```auto

```

par :

`main = do
    xmproc <- spawnPipe "xmobar"
    xmonad $ defaults
        { manageHook = manageDocks <+> myManageHook
        , layoutHook = avoidStruts $ layoutHook defaultConfig { layoutHook = myLayout }
        , logHook = dynamicLogWithPP $ xmobarPP 
                        { ppOutput = hPutStrLn xmproc
                        , ppTitle = xmobarColor "green" "" . shorten 90
                        }
        }`  
ou par autre chose qui vous convient mieux, 90 désigne le nombre de caractères  
utilisés pour afficher le nom de la fenêtre qui a le focus dans la barre.

Pour valider les changements une fois le fichier enregistré, c’est mod q  
avec mod = alt de gauche par défaut, mais que l’on peut changer en touche logo  
en remplaçant

```auto

```

par

```auto

```

dans ~/.xmonad/xmonad.hs

Si on a pas fait d’erreurs de syntaxe, xmonad applique les changements à la volée,  
si on a fait des erreurs, une fenêtre s’affiche en indiquant où on peut les trouver,  
très pratique.

Pour le panel xfce  
Même méthode,

`import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import System.IO`  
Un petit tour dans la doc pour y voir plus clair,  
et dans la section main en bas du fichier on remplace :

```auto

```

par :

`main = xmonad defaults 
        { manageHook = manageDocks <+> myManageHook
        , layoutHook = ewmhDesktopsLayout $ avoidStruts $ layoutHook defaultConfig { layoutHook = myLayout }
        , logHook = ewmhDesktopsLogHook
        }`  
et on écrit quelque part avant xmonad dans ~/.xsession

`xfce4-panel&
xfdesktop4& # seulement pour ceux qui veulent le menu de xfce, de toute façon vous ne verrez plus jamais votre bureau à moins d'avoir des xterms transparents.`  
Maintenant on a quelque chose pour se repérer.

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 20, 2016, 8:11 UTC](https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207/3 "2016-02-20T20:11:41Z")

</div>

Pour faire apparaître ou disparaître la barre de notification / panel avec le clavier,  
il faut rajouter la section key bindings du ~/.xmonad/xmonad.hs

` -- cache ou fait apparaître la barre de notification
    , ((modMask , xK_b ), sendMessage ToggleStruts)`

Je ne vais pas parler de tous les modules, parce que déjà, il y en plein que je n’utilise pas,  
mais je vais détailler quelques unes des possibilités qu’ils offrent.  
(quand on les associe entre-eux, c’est encore mieux)

Dans tous les exemples suivants, l’autocompletion ne demande aucune action de l’utilisateur,  
même pas appuyer sur tab. À partir du moment où suffisament de caractères ont été saisis,  
autocomplétion immédiate et execution de l’action. Si il y trop de proposition  
avec des noms longs et similaire, on peut quand même circuler à travers avec tab.

Tout ce qui est après – est un commentaire.  
modMask signifie le modificateur choisi dans ~/.xmonad/xmonad.hs  
0 signifie pas de modificateurs.

-La démultiplication des raccourcis claviers avec le module XMonad.Actions.Submap :  
Avec ce genre de WM, on se retrouve rapidement à avoir toutes les combinaisons  
de touches prises par un raccourci clavier, le module sus-cité  
permet le sous mapping des raccourcis claviers, quand on l’associe avec des modules  
de la série XMonad.Prompt et de la série XMonad.Action on peut par exemple:

[code]  
, ((modMask, xK\_p ), submap . M.fromList $  
– Va dans le bureau contenant la fenêtre choisie dans la liste de toutes les  
– fenêtres de tous les bureaux.  
[ ((0, xK\_g ), windowPromptGoto defaultXPConfig { autoComplete = Just 100000 } )

```
  -- Amène la fenêtre choisie dans le bureau actuel
  , ((0, xK_b ), windowPromptBring defaultXPConfig { autoComplete = Just 100000 } )

  -- Prompt shell , propose une invite en bas de l'écran, je n'ai pas mis l'autocompletion
  -- sinon on n'a pas le temps de taper un argument à la commande avant qu'elle ne s'éxécute 
  , ((0, xK_x), shellPrompt defaultXPConfig )

  -- Prompt pour le manuel, chez moi le ? est sur la même touche que la virgule 
  , ((0, xK_comma), manPrompt defaultXPConfig { autoComplete = Just 100000 } )

  -- Prompt pour un fichier à lancer dans l'application sous-désignée
  , ((0, xK_v), AL.launchApp defaultXPConfig { autoComplete = Just 100000 } "gvim") 
  , ((0, xK_i), AL.launchApp defaultXPConfig { autoComplete = Just 100000 } "iceweasel") 

  -- Rajoute la ligne écrite dans le prompt à un fichier prédéfini
  , ((0, xK_n), appendFilePrompt defaultXPConfig "/home/user/notes")

  -- lance un programme ou ramène une session existante du programme selon le contexte     
  , ((0, xK_r), runOrRaisePrompt defaultXPConfig { autoComplete = Just 100000 })

  -- choisit dans quel bureau envoyer la fenêtre ayant le focus 
  , ((0, xK_w ), workspacePrompt defaultXPConfig { autoComplete = Just 100000 } (windows . W.shift))      

  -- lance l'url passée à partir de n'importe quel programme dans la selection X avec Iceweasel.
  , ((0, xK_f), promptSelection "iceweasel") 
  ])    

  -- celui là, je voulais l'avoir en accès direct, donc en dehors du sous-mappage des raccourcis claviers.
  -- Permet de changer le répertoire courant de chaque bureau indépendament, par exemple chaque 
  -- terminal ouvert par la suite aura le répertoire courant choisi précedemment par défaut. 
, ((0, xK_F1 ), changeDir defaultXPConfig { autoComplete = Just 100000})[/code]

```

Dans l’exemple du dessus, il suffit de mod-p et on a accès aux raccourcis qui suivent la première ligne.  
J’ai fait ça avec les prompts mais on peu le faire avec tout et n’importe quoi, par exemple avec une liste  
d’urls favorites on peu démarrer directement le navigateur sur celle qui nous plaît, …  
on n’est limité que par notre imagination.

-La première ligne des exemples suivants propose un prompt dont l’entrée sera cherchée dans le moteur de recherche choisi parmi ceux détaillés plus bas, il en a quelques uns par défaut mais on peut en rajouter d’autres.  
-la deuxième ligne fait la même chose sans prompt mais avec la selection de X. Ça veut dire par exemple: une sortie de commande intrigante? je la selectionne, mod-shift-s puis d, voila les résultats de la recherche sur le forum, je n’ai pas trouvé ce que je voulais? mod-shift-s g, la même recherche sur google.

```auto
    , ((modMask, xK_s ), SM.submap $ searchEngineMap $ S.promptSearch defaultXPConfig) 
    , ((modMask .|. shiftMask, xK_s), SM.submap $ searchEngineMap $ S.selectSearch) 
```

définition d’un moteur de recherche ajouté

```auto
deb = searchEngine "deb" "http://forum.debian-fr.org/search.php?keywords="
```

exemple d’une liste de moteurs de recherche, ceux avec S après method étaient en standard  
pour ceux que l’on rajoute soi-même, il ne faut pas mettre le S.

```auto
searchEngineMap method = M.fromList $
       [ ((0, xK_g), method S.google)
       , ((0, xK_h), method S.hoogle)
       , ((0, xK_w), method S.wikipedia)
       , ((0, xK_y), method S.youtube)
       , ((0, xK_d), method deb)
       , ((0, xK_l), method littre) 
       ]
```

Voilà, c’était quelques petits exemples pour vous donner envie d’aller creuser  
un petit peu plus vous mêmes dans ce WM, qui recèle des possibilités insoupçonnées.  
Si vous avez des questions, n’hésitez pas.  
Peut-être que j’en posterai encore plus tard.

P.S: Les critiques sont les bienvenues 😃

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 20, 2016, 8:13 UTC](https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207/4 "2016-02-20T20:13:14Z")

</div>

-Afficher dans xmobar le titre que mpc est en train de lire

1. Un mini scipt, par exemple ~/scripts/mpc.sh : `#!/bin/bash
echo -n "$(mpc --format "%file%" | head -n 1)"`  
(Merci à kna de m’avoir donner l’idée de relire le man mpc, la première fois j’étais passé par dessus l’option --format sans la voir pourtant elle est tout en haut.)

2. Éditer votre ~/.xmobarrc en ajoutant : `, Run Com "bash" ["~/scripts/mpc.sh"] "mpc" 10`  
avec les autres ,Run et `%mpc%` dans la ligne template =  
selon l’endroit ou vous placez %mpc% dans template =  
le titre joué par mpc sera plus ou moins à gauche ou à droite sur xmobar.

---

<div class="post-metadata">

**Author:** ![thuban](https://www.debian-fr.org/user_avatar/www.debian-fr.org/thuban/32/4177_2.png) [@thuban](https://www.debian-fr.org/u/thuban)\
**Post date:** [Février 21, 2016, 12:12 UTC](https://www.debian-fr.org/t/xmonad-tiling-wm-et-plus-si-affinites/20207/5 "2016-02-21T12:12:24Z")

</div>

Pour les chiffres, il y a une solution plus simple :

[code]import XMonad.Config.Azerty

main = do  
xmonad $ azertyConfig  
[/code]
