OVH Cloud OVH Cloud

Modification de la modeline

23 réponses
Avatar
Jérémy JUST
Bonjour,

Sous XEmacs, je voudrais gagner un peu de place dans la modeline. J'ai
déjà trouvé comment retirer le « Xemacs: » avec

(setf (cdar modeline-buffer-identification) "%N")
; au lieu de "XEmacs%N:"


Maintenant, je voudrais réduire le nombre d'espaces (et tirets) un peu
partout. Les bouts de code que j'ai trouvés dans les news réécrivent
entièrement la liste modeline-format, et ça ne me plaît pas trop (ce
serait pour y remettre les valeurs par défaut, la plupart du temps).

Mon idée est plutôt de parcourir modeline-format et de retirer ou
modifier ce qui ne me convient pas. Mais mes trop vagues notions de Lisp
ne m'ont pas mené bien loin. Voilà mes essais:

; La chaîne " " est ce que renvoie (elt modeline-format 4).
; Mais ce code semble ne rien faire.
(setq modeline-format
(mapcar (lambda (x) (if (equal x " ") "A" x)) modeline-format))


; Avec une regexp, j'essaie de supprimer tous les espaces
; Pas plus de succès
(setq modeline-format
(mapcar (lambda (x) (cond (string-match "\\s" x)
(replace-match "")))
modeline-format))


; Alors que le code suivant modifie bien la modeline immédiatement
(setq modeline-format (reverse modeline-format))


Voilà.
Je suis preneur de suggestions.

--
Jérémy JUST <jeremy_just@netcourrier.com>

3 réponses

1 2 3
Avatar
Olve
Imagines ce qui se passe si modeline-format est ("---i--" "--") : on
passe deux fois sur "--" ce qui est un peu ridicule et somme toute
difficile à lire. Il vaut mieux, au lieu du my-replace-modeline-format
interne, un my-modify-string qui ne s'occupe que de la chaine en question.



Est-ce le fait que l'on récurse une dernière fois lorsqu'il n'y a
plus de remplacement à faire (« on passe deux fois sur "--" ») ?



Non ! La premiere fois est lors de l'appel interne de my-replace-modeline-format
et là, comme on commence plus loin, on ne modifie pas, parce qu'on ne voit
pas le premier "-" :-) Bon, on finira par le voir, mais c'est un peu tordu.
Bien sur, on peut dire "c'est un point fixe, peu importe comment on
y arrive". :-)

Ce que j'imagine, c'est

(defun my-replace-string (x start)
(if (string-match "(s s +|--+)" x start)
(my-replace-string
(replace-match (substring (match-string 0 x) 0 1) t t x)
(1+ start))
x))

et

(my-replace-string (replace-match replacement t t x) 1)

a la place de

(my-replace-modeline-format (replace-match replacement t t x) (1+ start))

Voilà, j'ai fini de pinailler :-p
Amitiés,
Olivier
Avatar
drkm
drkm writes:

Olve writes:

Tu pinailles, là ;-) Mais cela m'a fait découvrir une petite erreur.
Il faut remplacer :

(1+ start))))

par :

(1+ (match-beginning 0)))))



Non ! Tu enleves la chaine !!! C'est bien (1+ start).



Oops. En effet. Voilà ce que c'est que de se corriger à la va-vite
$-). Merci.



Bon. Je reviens une dernière fois sur la correction de changement
de modification ;-) C'est bien

(1+ (match-beginning 0))

qu'il faut utiliser. Prenons le cas de "A--B--". Lors du premier
appel, `START' vaut 0. (match-beginning 0) vaut 1. Le second appel
reçoit "A-B--" comme `X'. On veut bien 2 comme `START'. On sait
qu'il n'y a plus rien d'intéressant avant (match-beginning 0), y
compris.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
Avatar
drkm
Olve writes:

Non ! La premiere fois est lors de l'appel interne de my-replace-modeline-format
et là, comme on commence plus loin, on ne modifie pas, parce qu'on ne voit
pas le premier "-" :-) Bon, on finira par le voir, mais c'est un peu tordu.
Bien sur, on peut dire "c'est un point fixe, peu importe comment on
y arrive". :-)

Ce que j'imagine, c'est



[...]

Nous avons vraiment un problème de compréhension, aujourd'hui.
Enfin, j'ai un problème de compréhension ;-) La seule différence que
je vois entre ce que tu imagines et le code initial, c'est l'abscence
du test `stringp()' et du caractère `&optional' de `START'.

Je suis sûr qu'il y a quelque chose que je ne vois pas, mais quoi ?

D'après ton paragraphe cité ci-dessus, j'ai l'impression que l'on ne
voit pas le même chemin d'exécution. Ce que je vois, avec le code
initial (et également avec le code que tu proposes), avec la chaîne
"--", est ceci :

· 1er appel : `X' vaut "--", `START' vaut nil, et sera donc
remplacé par 0 ; une correpsondance est trouvée, et un
remplacement est effectué et passé à un appel récursif ;

· appel récursif : `X' vaut "-", `START' vaut 1 ; aucune
correspondance n'est trouvée, on retourne donc "-", qui est
lui-même retourné du premier appel.

Mais est-ce bien là que nous divergeons ? Je n'en suis même pas
sûr ... J'aimerais vraiment comprendre ce que tu dis.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
1 2 3