XMonad, tiling WM et plus si affinités

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 :

(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).

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
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

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

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 :

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…

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 et les sources ici

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
pour ajuster à nos souhaits et dans la partie main en bas du fichier,
on remplace :

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

par

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 :

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.

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.

    , ((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é

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.

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 :smiley:

-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.

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

[code]import XMonad.Config.Azerty

main = do
xmonad $ azertyConfig
[/code]