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
Vincent Belaïche
Je te conseille de lire le noeud d'info "(emacs) Environment". À mon avis une
meilleure solution consiste à configurer des variables d'environnement qui
sruchargeront le registre. L'avantage c'est que tu peux les lire en Emacs-lisp
avec la fonction getenv.

Vincent.

PS: s'il s'agit de distinguer juste entre deux machines sous MSWindows, le
plus simple c'est peut-être de tester une variable d'environment comme
COMPUTERNAME ou LOGONSERVER.




Nicolas Matringe a écrit :
Bonjour
J'avais déjà posé la question sous une forme différente 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émarrage d'emacs dépendent
du profil courant : PC mobile ou PC accouplé à une station d'accueil
avec un second écran.
Je sais où récupérer 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
Avatar
nic_o_mat
Bonjour Vincent et merci de ta réponse
Je vais donc plutôt aller chercher des infos sur Windows XP et comment
accéder à la base de registre. Ça doit pas être trop compliqué en VB.

Pour préciser, il s'agit bien du même ordinateur portable mais avec ou
sans second écran

Nicolas

On Jul 29, 5:18 pm, Vincent Belaïche
wrote:
Je te conseille de lire le noeud d'info "(emacs) Environment". À mon av is une
meilleure solution consiste à configurer des variables d'environnement qui
sruchargeront le registre. L'avantage c'est que tu peux les lire en Emacs -lisp
avec la fonction getenv.

    Vincent.

PS: s'il s'agit de distinguer juste entre deux machines sous MSWindows, l e
plus simple c'est peut-être de tester une variable d'environment comme
COMPUTERNAME ou LOGONSERVER.

Nicolas Matringe a écrit :

> Bonjour
> J'avais déjà posé la question sous une forme différente 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émarrage d'emacs dépende nt
> du profil courant : PC mobile ou PC accouplé à une station d'accuei l
> avec un second écran.
> Je sais où récupérer l'info dans la base de registre, je sais com ment
> 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
Avatar
nic_o_mat
Bonjour
Suite de mon problème.
J'ai un script VBS qui crée une variable mais sa valeur n'est pas mise
à jour dans process-environment.

J'essaie d'exécuter le script au démarrage grâce à cette ligne au
début du .emacs:
(call-process "HW_profile.vbs")
mais ça ne marche pas, j'ai le message suivant

An error has occurred while loading `d:/Documents/.emacs':
File error: Searching for program, permission denied, HW_profile.vbs

J'ai essayé diverses options de chemin d'accès, rien à faire.
Peut-être devrais-je appeler un interpréteur VB au lieu d'appeler le
script ?

(vous me dites si je vous saoule avec Windows, hein ?)

Nicolas

On Jul 30, 9:13 am, "" wrote:
Bonjour Vincent et merci de ta réponse
Je vais donc plutôt aller chercher des infos sur Windows XP et comment
accéder à la base de registre. Ça doit pas être trop compliqué en VB.

Pour préciser, il s'agit bien du même ordinateur portable mais avec o u
sans second écran

Nicolas

On Jul 29, 5:18 pm, Vincent Belaïche
wrote:

> Je te conseille de lire le noeud d'info "(emacs) Environment". À mon avis une
> meilleure solution consiste à configurer des variables d'environnemen t qui
> sruchargeront le registre. L'avantage c'est que tu peux les lire en Ema cs-lisp
> avec la fonction getenv.

>     Vincent.

> PS: s'il s'agit de distinguer juste entre deux machines sous MSWindows, le
> plus simple c'est peut-être de tester une variable d'environment comm e
> COMPUTERNAME ou LOGONSERVER.

> Nicolas Matringe a écrit :

> > Bonjour
> > J'avais déjà posé la question sous une forme différente 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émarrage d'emacs dépen dent
> > du profil courant : PC mobile ou PC accouplé à une station d'accu eil
> > avec un second écran.
> > Je sais où récupérer l'info dans la base de registre, je sais c omment
> > 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
Avatar
Sébastien Kirche
Le 3 août 2009 à 21:43, nic o. a formulé :

Bonjour



Bonjour,

Suite de mon problème.
J'ai un script VBS qui crée une variable mais sa valeur n'est pas mise
à jour dans process-environment.



Ça c'est normal, un processus fils hérite de l'environnement de son
parent, il peut le modifier pour lui même ou pour les processus qu'il
lancera à son tour mais il ne peut pas faire en sorte qu'une
modification remonte à son parent. C'est vrai au moins sur les sytèmes
que je pratique (Linux, Windows, MacOS X), je ne sais pas si ça peut
exister sur d'autres.

J'essaie d'exécuter le script au démarrage grâce à cette ligne au
début du .emacs:
(call-process "HW_profile.vbs")
mais ça ne marche pas, j'ai le message suivant

An error has occurred while loading `d:/Documents/.emacs':
File error: Searching for program, permission denied, HW_profile.vbs

J'ai essayé diverses options de chemin d'accès, rien à faire.
Peut-être devrais-je appeler un interpréteur VB au lieu d'appeler le
script ?



Pas le temps de tester tout de suite, mais est-ce que ça peut aider de
lancer le script avec wscript (Windows script host) ?
Voir wscript /? pour les options.

(vous me dites si je vous saoule avec Windows, hein ?)



Non non, je suis aussi une partie de mon temps sur Windows, et parfois
c'est le genre de questions qui peuvent se poser à un programmeur.

Pour info, on peut interroger (au moins sur XP) la base de registre et
même la modifier en utilisant des commandes, donc on doit pouvoir le
faire depuis Emacs, j'essaie de regarder ça ASAP.

--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 4 août 2009 à 13:11, Sébastien Kirche s'est exprimé ainsi :

Pour info, on peut interroger (au moins sur XP) la base de registre et
même la modifier en utilisant des commandes, donc on doit pouvoir le
faire depuis Emacs, j'essaie de regarder ça ASAP.



Bon, j'ai fait une pause elisp et j'ai un exemple :
(call-process "reg" nil t nil "QUERY" "HKCUSoftware7-Zip" "/v"
"Path")

Le "reg" c'est l'appel à la commande reg.exe qui permet d'aller jouer
dans le registre (sur XP et suivants, peut-être sur 2000 également).
Attention à ce qu'on fait avec (on peut modifier et supprimer) :o)

Le t dans les arguments ça lui fait insérer le résultat de l'appel dans
le buffer courant. Si tu testes ça dans le scratch avec un C-j après la
dernière parenthèse tu auras le résultat juste après. Ya moyen de faire
mieux (parser le résultat) ça dépend de tes besoins, il y a un exemple
dans le code de tramp.

Il faut placer chaque argument dans une chaîne séparée et non dans une
chaîne unique avec des espaces car sinon ça cause des problèmes d'appel
de la commande (erreurs de parsing). Je me demande si ton problèème
d'appel du script vbs ne vient pas de là ?

Hopant que ça helpe...
--
Sébastien Kirche
Avatar
nic_o_mat
Bonjour et merci beaucoup, ça me donne plein de super pistes à
explorer.
J'ai résolu mon problème de lancement de script en mettant
(call-process "cscript" nil nil t "HW_profile.vbs //B")
à la place de ce que j'avais mis avant, mais ça ne change rien au
problème de récupération de la valeur lue.

Avec l'interrogation de la bdr directement depuis emacs je n'ai plus
besoin de VBS, je n'ai qu'à traduire le script.
Je préfère, je trouvais très laid de passer par VBS?

Nicolas

On Aug 4, 1:42 pm, Sébastien Kirche
wrote:
Le 4 août 2009 à 13:11, Sébastien Kirche s'est exprimé ainsi :

> Pour info, on peut interroger (au moins sur XP) la base de registre et
> même la modifier en utilisant des commandes, donc on doit pouvoir le
> faire depuis Emacs, j'essaie de regarder ça ASAP.

Bon, j'ai fait une pause elisp et j'ai un exemple :
    (call-process "reg" nil t nil "QUERY" "HKCUSoftware7-Zip" "/v "
    "Path")

Le "reg" c'est l'appel à la commande reg.exe qui permet d'aller jouer
dans le registre (sur XP et suivants, peut-être sur 2000 également).
Attention à ce qu'on fait avec (on peut modifier et supprimer) :o)

Le t dans les arguments ça lui fait insérer le résultat de l'appel dans
le buffer courant. Si tu testes ça dans le scratch avec un C-j après la
dernière parenthèse tu auras le résultat juste après. Ya moyen de faire
mieux (parser le résultat) ça dépend de tes besoins, il y a un exem ple
dans le code de tramp.

Il faut placer chaque argument dans une chaîne séparée et non dans une
chaîne unique avec des espaces car sinon ça cause des problèmes d'a ppel
de la commande (erreurs de parsing). Je me demande si ton problèème
d'appel du script vbs ne vient pas de là ?

Hopant que ça helpe...
--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 4 août 2009 à 14:40, nic o. vraute :

Bonjour et merci beaucoup, ça me donne plein de super pistes à
explorer.



Merci.

J'ai résolu mon problème de lancement de script en mettant
(call-process "cscript" nil nil t "HW_profile.vbs //B")


^
Attention...

Avec un (call-process "cscript" nil t nil "HW_profile.vbs" "/B") c'est
pas mieux ? (après, faut voir s'il n'y a pas un problème de répertoire
courant qui ne serait pas le bon pour appeler le .vbs)

à la place de ce que j'avais mis avant, mais ça ne change rien au
problème de récupération de la valeur lue.

Avec l'interrogation de la bdr directement depuis emacs je n'ai plus
besoin de VBS, je n'ai qu'à traduire le script.
Je préfère, je trouvais très laid de passer par VBS?



Bah, déjà le vbs en soi, hein... ;o)

--
Sébastien Kirche
Avatar
nic_o_mat
On Aug 4, 2:53 pm, Sébastien Kirche
wrote:
Le 4 août 2009 à 14:40, nic o. vraute :

> Bonjour et merci beaucoup, ça me donne plein de super pistes à
> explorer.
Merci.



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.


> J'ai résolu mon problème de lancement de script en mettant
> (call-process "cscript" nil nil t "HW_profile.vbs //B")
                                                   ^
Attention...
Avec un (call-process "cscript" nil t nil "HW_profile.vbs" "/B") c'est
pas mieux ? (après, faut voir s'il n'y a pas un problème de réperto ire
courant qui ne serait pas le bon pour appeler le .vbs)



Ça marche très bien comme ça en une seule string. Le double / est
intentionnel, c'est la syntaxe normale de la commande cscript.
De toute façon j'abandonne cette solution, je préfère la tienne avec
reg.exe.


> Je préfère, je trouvais très laid de passer par VBS
Bah, déjà le vbs en soi, hein... ;o)



:-)

Nicolas
Avatar
Sébastien Kirche
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é.

Je recopie le code qui semble intéressant pour donner des pistes de
codage :

(defun tramp-parse-putty (registry)
"Return a list of (user host) tuples allowed to access.
User is always nil."
;; On Windows, there are problems in completion when
;; `default-directory' is remote.
(let ((default-directory (tramp-compat-temporary-file-directory))
res)
(with-temp-buffer
(when (zerop (tramp-local-call-process "reg" nil t nil "query"
registry))
(goto-char (point-min))
(while (not (eobp))
(push (tramp-parse-putty-group registry) res))))
res))

(defun tramp-parse-putty-group (registry)
"Return a (user host) tuple allowed to access.
User is always nil."
(let ((result)
(regexp (concat (regexp-quote registry) "\(.+)")))
(narrow-to-region (point) (tramp-compat-line-end-position))
(when (re-search-forward regexp nil t)
(setq result (list nil (match-string 1))))
(widen)
(forward-line 1)
result))

--
Sébastien Kirche
Avatar
nic_o_mat
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 info s
> 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 e t
> travailler dedans puis le fermer.

C'est comme ça que travaille tramp (où j'ai trouvé un autre cas d'a ppel
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 r eg
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...
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")

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

Encore merci
Nicolas
1 2