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>

10 réponses

1 2 3
Avatar
Jérémy JUST
On Mon, 09 Aug 2004 18:10:37 +0200
drkm wrote:

J'ai l'impression que ce que veut le PO est un « remplacement
récursif », c'est à dire que chaque suite de plusieures espaces (ou
"-") soit remplacée.



Idéalement, oui. Mais j'ai renoncé à ça (quand j'essayais encore
d'écrire la fonction moi-même) en constatant que c'était inutile en
pratique (il se trouve que la première série de " " est la seule utile à
remplacer).


Que pensez-vous de :
(defun my-replace-modeline-format (x &optional start) .....



Ben... Je vais l'imprimer pour le lire dans le RER...
C'est marrant cette idée d'appliquer des regexps récursivement.
J'imagine que c'est très lispien. En Perl, on aurait fait ça
itérativement (d'ailleurs, l'opérateur de regexp s'en charge, avec la
bonne option).

Merci pour ta suggestion.


(string-match "(s s +|--+)" x start))
Notez que le remplacement n'est fait que pour les sous-chaînes de
deux ou plus occurences d'une espace



Ça par contre, je le prends tout de suite. Tu as raison, il était
stupide, de remplacer "s +".
Merci!

--
Jérémy JUST
Avatar
Olve
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).

Si je suis d'accord pour `X', je maintiens par contre le `START'.
Ce n'est pas un compteur (ce que pouvait laisser supposer la petite
erreur), mais bien une position de départ dana la chaîne. Et plus
important, c'est le nom qu'utilisent les fonctions de correspondance
de modèles, comme `string-match()'.



Les variables sont notées en capitales dans les explications, mais pas
dans le code. Oui c'est bizarre et parfois je n'y sacrifie pas, mais
c'est la convention, plutot que de les backquoter ce qui pourrait sembler
bizarre pour le touriste :-)

Amities,
Olivier
Avatar
Olve
(defun my-replace-modeline-format (x &optional start)
""
(unless start
(setq start 0))
(cond ((and (stringp x)
(string-match "(s s +|--+)" x start))
(let ((replacement (substring (match-string 0 x) 0 1)))
(my-replace-modeline-format (replace-match replacement t t x)
(1+ start))))
(t x)))
(setq-default modeline-format
(mapcar 'my-replace-modeline-format modeline-format))








En fait, le mieux serait d'avoir une recursion sur x uniquement, bon ça
fait écrire un chouia plus de code, mais perd moins a l'execution.
Amities,
Olivier
Avatar
drkm
Olve writes:

En fait, le mieux serait d'avoir une recursion sur x uniquement, bon ça
fait écrire un chouia plus de code, mais perd moins a l'execution.



Que veux tu dire par « recursion sur x uniquement » ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
Avatar
drkm
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.

Si je suis d'accord pour `X', je maintiens par contre le `START'.
Ce n'est pas un compteur (ce que pouvait laisser supposer la petite
erreur), mais bien une position de départ dana la chaîne. Et plus
important, c'est le nom qu'utilisent les fonctions de correspondance
de modèles, comme `string-match()'.



Les variables sont notées en capitales dans les explications, mais pas
dans le code. Oui c'est bizarre et parfois je n'y sacrifie pas, mais
c'est la convention, plutot que de les backquoter ce qui pourrait sembler
bizarre pour le touriste :-)



Heu, je n'arrive pas à comprendre ce que tu veux dire, exactement.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
Avatar
Olve
drkm wrote:
Olve writes:
En fait, le mieux serait d'avoir une recursion sur x uniquement, bon ça
fait écrire un chouia plus de code, mais perd moins a l'execution.



Que veux tu dire par « recursion sur x uniquement » ?



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.

Voilà, j'espère que c'est plus clair !
Mais le code initial fonctionne très bien.
Amitiés,
Olivier
Avatar
Olve
Les variables sont notées en capitales dans les explications, mais pas
dans le code. Oui c'est bizarre et parfois je n'y sacrifie pas, mais
c'est la convention, plutot que de les backquoter ce qui pourrait sembler
bizarre pour le touriste :-)



Heu, je n'arrive pas à comprendre ce que tu veux dire, exactement.



Bon, ce n'est pas ma journée clarté on dirait :-)
Voici du code extrait de subr.el (distribution standard) :
--------------------------------------------------------------
(defun make-temp-file (prefix &optional dir-flag)
"Create a temporary file.
The returned file name (created by appending some random characters at the end
of PREFIX, and expanding against `temporary-file-directory' if necessary,
is guaranteed to point to a newly created empty file.
You can then use `write-region' to write new data into the file.

If DIR-FLAG is non-nil, create a new empty directory instead of a file."
(let (file)
(while (condition-case ()
(progn
(setq file
(make-temp-name
(expand-file-name prefix temporary-file-directory)))
(if dir-flag
(make-directory file)
(write-region "" nil file nil 'silent nil 'excl))
nil)
(file-already-exists t))
;; the file was somehow created by someone else between
;; `make-temp-name' and `write-region', let's try again.
nil)
file))
---------------------------------------------------------------
Les variables sont prefix et dir-flag mais dans l'explication, elles
sont notées PREFIX et DIR-FLAG. J'ai tendance à les noter 'prefix
et 'dir-flag, c'est tout.

Amitiés,
Olivier
Avatar
drkm
Olve writes:

drkm wrote:

Olve writes:

En fait, le mieux serait d'avoir une recursion sur x uniquement, bon ça
fait écrire un chouia plus de code, mais perd moins a l'execution.



Que veux tu dire par « recursion sur x uniquement » ?



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.

Voilà, j'espère que c'est plus clair !



Heu ... C'est peut-être un problème dans mes connexions neuronalles
;-) Mais je ne comprend toujours pas ce que tu veux dire ...

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 "--" ») ? Si
c'est cela, je pense que c'est normal. Chaque étape consiste soit à
modifier une partie de la chaîne, soit à dire qu'il n'y pas (plus) de
modification à faire. Non ?

Mais peut-être ai-je tout simplement mal compris ?

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

Les variables sont notées en capitales dans les explications, mais pas
dans le code. Oui c'est bizarre et parfois je n'y sacrifie pas, mais
c'est la convention, plutot que de les backquoter ce qui pourrait sembler
bizarre pour le touriste :-)



Heu, je n'arrive pas à comprendre ce que tu veux dire, exactement.



Bon, ce n'est pas ma journée clarté on dirait :-)



Ni ma journée compréhension ;-)

[...]

Les variables sont prefix et dir-flag mais dans l'explication, elles
sont notées PREFIX et DIR-FLAG. J'ai tendance à les noter 'prefix
et 'dir-flag, c'est tout.



Ok. J'ai moi-même une notation un peu personnelle. En fait, dans
les docstrings de GNU Emacs, il me semble que les attributs sont
écrits en majuscules, et les variables et fonctions entre ` et '.
J'utilise en fait toujours ` et ', tout en mettant également les
attributs en majuscules et en ajoutant () pour différencier les
fonctions des variables :

· `UN-ATTRIBUT' ;

· `une-variable-globale' ;

· `une-fonction()'.

Je pense que je devrais éviter ces petites différences de notation
sur Usenet, mais la force de l'habitude étant ce qu'elle est ...

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
Avatar
drkm
Jérémy JUST writes:

On Mon, 09 Aug 2004 18:10:37 +0200
drkm wrote:

Que pensez-vous de :
(defun my-replace-modeline-format (x &optional start) .....



Ben... Je vais l'imprimer pour le lire dans le RER...
C'est marrant cette idée d'appliquer des regexps récursivement.
J'imagine que c'est très lispien. En Perl, on aurait fait ça
itérativement (d'ailleurs, l'opérateur de regexp s'en charge, avec la
bonne option).



En tant que langage fonctionel, le Lisp utilise énormément la
récursion. Il serait possible d'utiliser ici une boucle, mais la
récursion est ce qu'il y a de plus « naturel », AMHA. Je suis par
contre étonné qu'il n'existe pas une fonction de remplacement global,
comme le s///g de Perl (celui que tu évoques, si je ne m'abuse).

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