Entries Tagged as 'lisp'

Meilleure gestion des groupes avec StumpWM

StumpWM est un gestionnaire de fenêtres en mosaïque, comme awesome, écrit entièrement en Common Lisp. Pour plus d’informations, je vous recommande d’aller voir sa documentation.

Un des seuls points négatifs que j’y ait trouvé, est la gestion des groupes (l’équivalent des bureaux virtuels). Si vous voulez mettre une fenêtre dans un autre groupe, il faut d’abord créer le groupe (C-t g c), nommer le groupe, ensuite déplacer la fenêtre vers le groupe (C-t g m suivis du nom du groupe). Le fait que StumpWM soit écrit entièrement en Common Lisp nous permet d’implémenter un peu toutes les fonctionnalitées que l’on veut. J’ai donc développé une gestion des groupes similaires à wmii ou awesome.

Il faut donc modifier le .stumpwmrc situé dans le home. Tout d’abord, on va créer 5 groupes, nommés de 0 à 4, puis supprimer le groupe créée automatiquement au démarrage (« Default »). On se déplace ensuite sur le premier groupe (groupe 0), et finalement on bind des raccourcis pour changer de groupe, et pour déplacer une fenêtre d’un groupe à l’autre. Les raccourcis seront C-t [1,2,3,4,5] Pour changer de groupe, et C-t C-[1,2,3,4,5] pour déplacer une fenêtre.

Voilà le code :

;; Modification des groupes : 5 groupes crées par défaut (nommés 0, 1, 2, 3, 4)
; On crée les 5 groupes si ils n'existent pas déjà (appel de loadrc par ex.)
(loop for n in '("0" "1" "2" "3" "4") do
      (if (not (find-group (current-screen) n))
	  (add-group (current-screen) n)))
; On supprime le groupe Default s'il existe (groupe au démarrage)
(let ((default-group (find-group (current-screen) "Default")))
  (if default-group
      (kill-group default-group (find-group (current-screen) "0"))))
 
; On se place bien sur le groupe 0
(switch-to-group (find-group (current-screen) "0"))
 
;; Meilleurs raccourcis pour la gestion des groupes
; C-t 1, C-t 2, ... -> va au groupe 0, 1, ...
; C-t C-1, ... -> bouge la fenêtre dans le groupe 0, ...
; Les touches &, é, ", ', ( sont les caractères présents
; sur les touches 1, 2, 3, 4, 5 sur un clavier belge,
; à adapter selon le clavier
(let ((keys '("&" "eacute" "\"" "'" "(")))
  (loop for key in keys ; Les touches 1, 2, ...
	do
	(progn
	  (define-key *root-map* (kbd key)
	    (concatenate 'string
			 "gselect "
			 (write-to-string (position key keys))))
	  (define-key *root-map*
	    (kbd (concatenate 'string "C-" key))
	    (concatenate 'string
			 "gmove "
			 (write-to-string (position key keys))))
	)))

Et en « bonus », une autre feature à la wmii : pour se déplacer entre les fenêtres, on bind C-t [h,j,k,l], et pour déplacer les fenêtres, C-t C-[h,j,k,l] :

;; Utilisation de C-t h,j,k,l pour se déplacer dans les fenêtres
;; Si controle pressé, ça déplace la fenêtre dans cette direction
;; Si controle pressé, ça déplace la fenêtre dans cette direction
(let ((directions '(("h" "left")
		    ("l" "right")
		    ("k" "up")
		    ("j" "down"))))
  (dolist (dir directions)
     (define-key *root-map* (kbd (car dir))
      (concatenate 'string "move-focus " (cadr dir)))
    (define-key *root-map* (kbd (concatenate 'string "C-" (car dir)))
      (concatenate 'string "move-window " (cadr dir)))
    ))

Sur ce, bon amusement avec StumpWM :)

Éxécuter un script lisp avec SBCL en bash

Voilà une petite astuce pour lancer un fichier lisp (ou un .fasl) avec SBCL à partir d’un prompt bash :

sbcl --noinform --load fichier.lisp --eval '(quit)'

C’est vraiment très simple, on peut aussi faire ça ainsi

sbcl --noinform --eval '(load "fichier.lisp")' --eval '(quit)'

Vous l’aurez compris, les –eval sont évalués dans l’ordre dans lequel ils sont passé en argument.
Avec ça, on peut aussi définir une commande pour compiler un fichier :

sbcl --noinform --eval '(compile-file "fichier.lisp")' --eval '(quit)'

Et donc, pour lancer le fichier compilé (un .fasl) :

sbcl --noinform --load fichier.fasl --eval '(quit)'

Évidemment, si on ne spécifie pas le (quit), une fois l’éxécution du fichier terminée, on se retrouve dans la boucle REPL de sbcl.