Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Win32 emacs peut-il récupérer des infos dans la base de registre ?

20 réponses
Avatar
Nicolas Matringe
Bonjour
J'avais d=E9j=E0 pos=E9 la question sous une forme diff=E9rente il y a
quelques temps. J'utilise emacs sur un PC portable sous Windows XP et
je voudrais que les taille et position de d=E9marrage d'emacs d=E9pendent
du profil courant : PC mobile ou PC accoupl=E9 =E0 une station d'accueil
avec un second =E9cran.
Je sais o=F9 r=E9cup=E9rer l'info dans la base de registre, je sais comment
configurer emacs mais je ne sais pas faire le lien entre les deux.
Existe-t-il des fonctions de lecture de la base de registre ? Des
astuces ? Un meilleur endroit pour poser ma question ?

Merci d'avance
Nicolas

10 réponses

1 2
Avatar
Sébastien Kirche
Le 4 août 2009 à 17:06, nic o. a dit :

On Aug 4, 4:13 pm, Sébastien Kirche
wrote:
> Le 4 août 2009 à 15:37, nic o. vraute :
>
> > Explorations en cours, est-ce qu'il y a moyen de récupérer les
> > infos dans une variable au lieu de les afficher dans un buffer ?
> > On dirait pas, d'après la doc. Donc créer un buffer exprès pour et
> > travailler dedans puis le fermer.
>
> C'est comme ça que travaille tramp (où j'ai trouvé un autre cas
> d'appel de reg.exe), voici un extrait plus large qui parse le
> résultat d'un appel à reg (c'est dans tramp.el) : il crée un buffer
> temp, appelle reg et parse ce qui a été renvoyé.

J'ai un problème avec reg.exe parce que la seconde clé dont je veux
lire la valeur a un espace dans le nom. Sont vraiment cons chez MS...



Dans la console, ça marche si on utilise des doubles quotes autour du
nom de clé. Du coup dans Emacs ça donne un truc du genre (en échappant
les quotes)

(call-process "reg" nil t nil "query" ""HKLMsoftwareJava GDS Plugin"")

Du coup je n'utilise que la première valeur lue, c'est plus simple :

(call-process "reg" nil "tmp" nil "QUERY" "HKLMSYSTEM
CurrentControlSetControlIDConfigDB" "/v" "CurrentConfig")
(save-current-buffer
(set-buffer "tmp")
(goto-char (point-min))
(re-search-forward "0x(.+)")
(if (eq (string-to-number (match-string 1) 16) 2)
(setq default-frame-alist
'((top . 0) (left . 1280)
(width . 100) (height . 72)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")
))
(setq default-frame-alist
'((top . 0) (left . 0)
(width . 100) (height . 54)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")
))))
(kill-buffer "tmp")



Euh, (save-current-buffer) / (set-buffer "tmp) / (kill-buffer "tmp")
c'est un peu moche :o)

Pourquoi pas comme dans l'exemple avec with-temp-buffer (histoire de
chipoter) ?
Ça donne :

(with-temp-buffer
(call-process "reg" nil t nil "QUERY"
"HKLMSYSTEMCurrentControlSetControlIDConfigDB"
"/v"
"CurrentConfig")
(goto-char (point-min))
(re-search-forward "0x(.+)")
(if (eq (string-to-number (match-string 1) 16) 2)
(setq default-frame-alist
'((top . 0) (left . 1280)
(width .100) (height . 72)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")
))
(setq default-frame-alist
'((top . 0) (left . 0)
(width . 100) (height . 54)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")))))

C'est un peu plus beau comme code :)

Depuis le temps que je m'agaçais de devoir déplacer la fenêtre sur le
second écran à chaque ouverture d'emacs...



Ben suffisait de demander ;)

Ça fait du bien de refaire une peu d'elisp...
--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 4 août 2009 à 17:06, nic o. a dit :

On Aug 4, 4:13 pm, Sébastien Kirche
wrote:
> Le 4 août 2009 à 15:37, nic o. vraute :
>
> > Explorations en cours, est-ce qu'il y a moyen de récupérer les
> > infos dans une variable au lieu de les afficher dans un buffer ?
> > On dirait pas, d'après la doc. Donc créer un buffer exprès pour et
> > travailler dedans puis le fermer.
>
> C'est comme ça que travaille tramp (où j'ai trouvé un autre cas
> d'appel de reg.exe), voici un extrait plus large qui parse le
> résultat d'un appel à reg (c'est dans tramp.el) : il crée un buffer
> temp, appelle reg et parse ce qui a été renvoyé.

J'ai un problème avec reg.exe parce que la seconde clé dont je veux
lire la valeur a un espace dans le nom. Sont vraiment cons chez MS...



Dans la console, ça marche si on utilise des doubles quotes autour du
nom de clé. Du coup dans Emacs ça donne un truc du genre (en échappant
les quotes)

(call-process "reg" nil t nil "query" ""HKLMsoftwareJava GDS Plugin"")

Du coup je n'utilise que la première valeur lue, c'est plus simple :

(call-process "reg" nil "tmp" nil "QUERY" "HKLMSYSTEM
CurrentControlSetControlIDConfigDB" "/v" "CurrentConfig")
(save-current-buffer
(set-buffer "tmp")
(goto-char (point-min))
(re-search-forward "0x(.+)")
(if (eq (string-to-number (match-string 1) 16) 2)
(setq default-frame-alist
'((top . 0) (left . 1280)
(width . 100) (height . 72)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")
))
(setq default-frame-alist
'((top . 0) (left . 0)
(width . 100) (height . 54)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")
))))
(kill-buffer "tmp")



Euh, (save-current-buffer) / (set-buffer "tmp) / (kill-buffer "tmp")
c'est un peu moche :o)

Pourquoi pas comme dans l'exemple avec with-temp-buffer (histoire de
chipoter) ?
Ça donne (note le changement des paramètre du call-process) :

(with-temp-buffer
(call-process "reg" nil t nil "QUERY"
"HKLMSYSTEMCurrentControlSetControlIDConfigDB"
"/v"
"CurrentConfig")
(goto-char (point-min))
(re-search-forward "0x(.+)")
(if (eq (string-to-number (match-string 1) 16) 2)
(setq default-frame-alist
'((top . 0) (left . 1280)
(width .100) (height . 72)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")
))
(setq default-frame-alist
'((top . 0) (left . 0)
(width . 100) (height . 54)
;; (pointer-color . "yellow")
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "white")
(background-color . "black")
(font . "-*-courier new-medium-r-*-*-11-*-*-*-*-*-*-*")))))

C'est un peu plus beau comme code :)

Depuis le temps que je m'agaçais de devoir déplacer la fenêtre sur le
second écran à chaque ouverture d'emacs...



Ben suffisait de demander ;)

Ça fait du bien de refaire une peu d'elisp...
--
Sébastien Kirche
Avatar
nic_o_mat
On Aug 4, 6:06 pm, Sébastien Kirche
wrote:
Le 4 août 2009 à 17:06, nic o. a dit :

> J'ai un problème avec reg.exe parce que la seconde clé dont je veux
> lire la valeur a un espace dans le nom. Sont vraiment cons chez MS...

Dans la console, ça marche si on utilise des doubles quotes autour du
nom de clé. Du coup dans Emacs ça donne un truc du genre (en échapp ant
les quotes)

    (call-process "reg" nil t nil "query" ""HKLMsoftwareJava GDS Plugin"")



Faudra que j'essaie pour voir, mais ça marche déjà très bien comme ça.


Euh, (save-current-buffer) / (set-buffer "tmp) / (kill-buffer "tmp")
c'est un peu moche :o)



J'apprends, j'apprends... :-)
J'aurais dû mieux examiner le code que tu as posté.


Pourquoi pas comme dans l'exemple avec with-temp-buffer (histoire de
chipoter) ?
Ça donne (note le changement des paramètre du call-process) :



Vu, 't' pour le buffer courant.


C'est un peu plus beau comme code :)



Oui oui, en effet.


> Depuis le temps que je m'agaçais de devoir déplacer la fenêtre su r le
> second écran à chaque ouverture d'emacs...

Ben suffisait de demander ;)



J'avais demandé, il y a longtemps...


Ça fait du bien de refaire une peu d'elisp...



N'est-ce pas ? :-)
Bon je retourne m'amuser avec la lecture de la base de registre

Nicolas
Avatar
nic_o_mat
On Aug 4, 9:13 pm, "" wrote:

N'est-ce pas ? :-)
Bon je retourne m'amuser avec la lecture de la base de registre



Voilà, ça marche :
(with-temp-buffer
(call-process "reg" nil t nil "QUERY" "HKLMSYSTEM
CurrentControlSetControlIDConfigDB" "/v" "CurrentConfig")
(re-search-backward "0x(.+)")
(goto-char (point-max))
(call-process "reg" nil t nil "QUERY" (concat ""HKLMSYSTEM
CurrentControlSetControlIDConfigDBHardware Profiles" (format
"%04X" (string-to-number (match-string 1))) """) "/v" "FriendlyName")
(re-search-backward "REG_SZ.+?(w.+)")
(if (string= (match-string 1) "Docked Profile")
(setq default-frame-alist
... la suite n'a pas changé.

Je n'aime pas trop l'extension du numéro ("left padding" en VO) avec
la double conversion string->number->string, y a-t-il plus élégant ?

Nicolas
Avatar
Sébastien Kirche
Le 4 août 2009 à 22:31, nic o. s'est exprimé ainsi :

Je n'aime pas trop l'extension du numéro ("left padding" en VO) avec
la double conversion string->number->string, y a-t-il plus élégant ?



(Je me suis pourtant connecté sur l'ordi du boulot pour faire des tests
car je n'ai pas de windows sous la main ici :)

Tu peux t'épargner le concat et utiliser directement le format du nombre
avec le nom de clé pour avoir

(call-process "reg" nil t nil "QUERY"
(format
""HKLMSYSTEMCurrentControlSetControlIDConfigDBHardware Profiles%04X""
(string-to-number (match-string 1))) "/v"
"FriendlyName")

Mais je ne crois pas qu'on puisse faire plus court. Peut-être qu'un
autre elispien pourra me corriger ?
--
Sébastien Kirche
Avatar
nic_o_mat
On Aug 5, 1:15 am, Sébastien Kirche
wrote:

Tu peux t'épargner le concat et utiliser directement le format du nombr e
avec le nom de clé pour avoir

    (call-process "reg" nil t nil "QUERY"
                   (format
                    ""HKLMSYSTEMCurrentControlSe tControlIDConfigDBHardware Profiles%04X""
                    (string-to-number (match-string 1 ))) "/v"
                    "FriendlyName")

Mais je ne crois pas qu'on puisse faire plus court. Peut-être qu'un
autre elispien pourra me corriger ?




Bon sang mais c'est bien sûr.
Je suis vraiment rouillé; Déjà que je suis un petit joueur en
lisp... :-)

Nicolas
Avatar
Vincent Belaïche
Salut,

Pour étendre à gauche sur 4 caractères une string s avec des zéros tu peux
faire aussi (mais c'est un peu plus longuet):

(concat (make-string (- 4 (length s)) ?0) s)

ce qui causera une erreur si s fait plus de 4 caractère.

ou encore

(substring (concat "0000" s) -4)

Ce qui tronquera s, si s fait plus de 4 caractère.


Si tu utilises format avec %04X, si s fait plus de 4 caractères ça ne causera
pas d'erreur.

Le désavantage de `format' c'est que tu dois convertir s en entier, donc c'est
pas si trivial si s n'est pas en notation décimal, ou bien représente un
nombre supérieur à 2^28-1

À+
Vincent.



a écrit :
On Aug 5, 1:15 am, Sébastien Kirche
wrote:

Tu peux t'épargner le concat et utiliser directement le format du nombre
avec le nom de clé pour avoir

(call-process "reg" nil t nil "QUERY"
(format
""HKLMSYSTEMCurrentControlSetControlIDConfigDBHardware Profiles%04X""
(string-to-number (match-string 1))) "/v"
"FriendlyName")

Mais je ne crois pas qu'on puisse faire plus court. Peut-être qu'un
autre elispien pourra me corriger ?




Bon sang mais c'est bien sûr.
Je suis vraiment rouillé; Déjà que je suis un petit joueur en
lisp... :-)

Nicolas
Avatar
Sébastien Kirche
Le 17 août 2009 à 20:45, Vincent Belaïche a formulé :

Le désavantage de `format' c'est que tu dois convertir s en entier,
donc c'est pas si trivial si s n'est pas en notation décimal, ou bien
représente un nombre supérieur à 2^28-1



Le 2^28 - 1 (que je retrouve dans le manuel elisp) c'est pas plus depuis
Emacs22 ? Où c'était encore moins avant ?
Info n'est pas clair, il indique

« The range of values for an integer depends on the machine. The
minimum range is -268435456 to 268435455 (29 bits; i.e., -2**28 to
2**28 - 1), but some machines may provide a wider range. Many examples
in this chapter assume an integer has 29 bits. »

C'est dans (info "(elisp)Integer Basics")

--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 18 août 2009 à 20:58, Vincent Belaïche vraute :

Chez moi:

C-h v most-positive-fixnum <ret>

most-positive-fixnum is a variable defined in `C source code'.
Its value is 268435455

Documentation:
The largest value that is representable in a Lisp integer.



Je ne connaissais pas. C'est noté :)
--
Sébastien Kirche
Avatar
nic_o_mat
Salut
C'est malin de profiter de mes vacances pour continuer à discuter dans
mon dos ;-)

On Aug 17, 8:45 pm, Vincent Belaïche
wrote:
Salut,

Pour étendre à gauche sur 4 caractères une string s avec des zéro s tu peux
faire aussi (mais c'est un peu plus longuet):

(concat (make-string (- 4 (length s)) ?0) s)

ce qui causera une erreur si s fait plus de 4 caractère.

ou encore

(substring (concat "0000" s) -4)

Ce qui tronquera s, si s fait plus de 4 caractère.

Si tu utilises format avec %04X, si s fait plus de 4 caractères ça ne causera
pas d'erreur.

Le désavantage de `format' c'est que tu dois convertir s en entier, don c c'est
pas si trivial si s n'est pas en notation décimal, ou bien représente un
nombre supérieur à 2^28-1



Je note l'info pour le cas général. Pour ce qui concerne le cas
particulier qui servit de point de départ à cette passionnante
discussion je doute d'avoir plus de 10000 profils, ne parlons même pas
de 2^28-1 ;-)

Nicolas
1 2