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

^M dans le résultat de commandes shell

9 réponses
Avatar
Vincent Poinot
Je viens d'installer Emacs sur Windows (NT Emacs donc), et il y a un
détail agaçant : le résultat de chaque commande cygwin que je lance
depuis Emacs est envahi de ^M (enfin, à chaque fin de ligne).

J'ai bien trouvé ça :
(add-hook 'comint-output-filter-functions
'comint-strip-ctrl-m)

mais ça ne change rien.

(Exemple concret : M-x grep, chaque ligne du buffer résultat se termine
par un ^M, idem pour M-x compile, etc.)

Avez-vous une idée ?

(A noter que le problème ne se pose pas dans un buffer *shell*,
c'est-à-dire lancé avec M-x shell).

9 réponses

Avatar
Vincent Poinot
Vincent Poinot wrote:
Je viens d'installer Emacs sur Windows (NT Emacs donc), et il y a un
détail agaçant : le résultat de chaque commande cygwin que je lance
depuis Emacs est envahi de ^M (enfin, à chaque fin de ligne).

J'ai bien trouvé ça :
(add-hook 'comint-output-filter-functions
'comint-strip-ctrl-m)

mais ça ne change rien.

(Exemple concret : M-x grep, chaque ligne du buffer résultat se termine
par un ^M, idem pour M-x compile, etc.)

Avez-vous une idée ?

(A noter que le problème ne se pose pas dans un buffer *shell*,
c'est-à-dire lancé avec M-x shell).



Personne, vraiment ?
Avatar
Sébastien Kirche
Le 24 novembre 2005 à 16:11, Vincent Poinot s'est exprimé ainsi :

Personne, vraiment ?



J'ai bien vu ta question, mais personnellement je n'utilise quasiment
pas Emacs sous win.

Bon, puisque personne ne t'a répondu (peut-être que drkm aurait une
idée, ile me semble qu'il est sous win), je veux bien faire un essai
plus tard ce soir, il me semble qu'un emacs 21.3 traîne sur la machine
de ma femme.

--
Sébastien Kirche
Avatar
drkm
Sébastien Kirche wrote:

Bon, puisque personne ne t'a répondu (peut-être que drkm aurait une
idée, ile me semble qu'il est sous win



En effet (ce n'est d'ailleurs pas un choix personnel,
malheureusement). Et j'utilise egalement Cygwin. Pour Emacs,
j'utilise la version CVS compilee pour Win, sur crasseux.com.
Normalement, il detecte pour chaque buffer s'il utilise <CR>, <LF> ou
<CR><LF>. Par defaut, il utilise <CR><LF>.

Le probleme, c'est lorsque l'on en mixe deux. Cela arrive par
exemple lorsque l'on fait depuis un shell Cygwin un "echo >
fichier-cree-par-emacs". Le fichier contient donc initialement des
<CR><LF>, mais l'echo n'ajoute qu'un <LF>. Donc Emacs pense qu'on se
trouve dans le cas Unix, avec des <CR> en plus (affiches "^M").

Pour ce qui est d'une solution, je n'ai jamais vraiment cherche. Ca
m'arrive somme toute peu souvent. Soit on passe en Unix avec un "M-%
C-q C-m <RET> <RET> !", soit en Win en se positionnant a la fin des
lignes sans "^M" et "C-q C-m" (et reouverture du fichier).

Mais il doit exister un equivalent de 'dos2unix' et/ou de 'unix2dos'
sous forme de commande dans Emacs (ce qui ne serait de toute facon pas
tres complique). Car si je me souviens bien, le probleme arrive dans
un buffer shell (donc pas dans un fichier). Si je me souviens bien, le
probleme arrive lors de l'insertion de la sortie d'un programme Cygwin
dans un buffer. Sans doute existe-t-il un moyen simple de regler
automatiquement le probleme. Mais ca, je ne connais pas.

Peut-etre sur EmacsWiki. Ou comp.emacs.

--drkm
Avatar
Vincent Poinot
drkm wrote:

Car si je me souviens bien, le probleme arrive dans
un buffer shell (donc pas dans un fichier). Si je me souviens bien, le
probleme arrive lors de l'insertion de la sortie d'un programme Cygwin
dans un buffer. Sans doute existe-t-il un moyen simple de regler
automatiquement le probleme. Mais ca, je ne connais pas.



Merci pour ces explications détaillées : ce sont effectivement les
symptômes que j'observe.

Le problème survient bien dans un buffer shell, et je pensais que le
petit hook que je mentionnais au début ferait l'affaire :

(add-hook 'comint-output-filter-functions
'comint-strip-ctrl-m)

Mais non. Pourtant, après avoir jeté un oeil à la fonction
comint-strip-ctrl-m, elle ne m'a pas l'air mal : il doit y avoir autre
chose.

Peut-etre sur EmacsWiki. Ou comp.emacs.



Je jetterai un oeil demain.
Avatar
drkm
Vincent Poinot wrote:

(add-hook 'comint-output-filter-functions
'comint-strip-ctrl-m)

Mais non. Pourtant, après avoir jeté un oeil à la fonction
comint-strip-ctrl-m, elle ne m'a pas l'air mal : il doit y avoir autre
chose.



Mh, d'apres un coup d'oeil rapide aux docstring ca ressemble en effet
a ce qu'il te faut. Es-tu sur que ton mode shell utilise 'comint' ?
Et qu'il execute bien les fonctions de cette variable au moment
opportun ?

Par contre, je ne comprend pas vraiment la fonction. Elle accepte
l'argument STRING, dont elle ne se sert pas. Alors que ce semble etre
le but des filtres de cette variable. Que donne plutot :

(require 'cl)
(add-hook 'comint-output-filter-functions
(lambda (str) (delete* ?C-m str)))

?

--drkm
Avatar
Vincent Poinot
drkm wrote:
Vincent Poinot wrote:


(add-hook 'comint-output-filter-functions
'comint-strip-ctrl-m)




Mais non. Pourtant, après avoir jeté un oeil à la fonction
comint-strip-ctrl-m, elle ne m'a pas l'air mal : il doit y avoir autre
chose.




Mh, d'apres un coup d'oeil rapide aux docstring ca ressemble en effet
a ce qu'il te faut. Es-tu sur que ton mode shell utilise 'comint' ?



J'avoue que je n'en sais trop rien, je n'ai jamais très bien compris ce
qu'était comint au juste...

Et qu'il execute bien les fonctions de cette variable au moment
opportun ?



Je me pose aussi la question. Comment faire pour le savoir ?

Que donne plutot :

(require 'cl)
(add-hook 'comint-output-filter-functions
(lambda (str) (delete* ?C-m str)))



Rien de mieux.

J'avais suivi bêtement la FAQ NTEmacs qui recommandait, pour utiliser
Cygwin/bash, de faire :

(setq process-coding-system-alist '(("bash" . undecided-unix)))
(setq shell-file-name "bash")
(setenv "SHELL" shell-file-name)
(setq explicit-shell-file-name shell-file-name)

Je viens de trouver un truc en fouillant un peu la doc. Si je fais plutôt :

(setq process-coding-system-alist '(("bash" . (undecided-dos .
undecided-unix))))

tout fonctionne parfaitement (pour l'instant au moins) : mes M-x grep
n'ont plus de ^M, mon shell bash fonctionne correctement.

A noter que je n'ai plus besoin d'utiliser comint-strip-ctrl-m ou
quoique ce soit d'autre... Je suppose que ça résout mon problème.

Merci pour votre aide.

Vincent.
Avatar
bruno.boirel
(defun dos-to-unix ()
"Eliminate ^M (r) from end of line."
(interactive)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "r$" nil 1)
(replace-match "" nil nil))))

utilisateur de (X)Emacs sous Win NT, je viens d'aller sur crasseux.com
pour télécharger mais le débit est de 0.2kb, n'y aurait-il pas un
miroir ou un horaire plus efficace ?
Avatar
Leopold BAILLY
"drkm" writes:

Sébastien Kirche wrote:

Bon, puisque personne ne t'a répondu (peut-être que drkm aurait une
idée, ile me semble qu'il est sous win



En effet (ce n'est d'ailleurs pas un choix personnel,
malheureusement). Et j'utilise egalement Cygwin. Pour Emacs,
j'utilise la version CVS compilee pour Win, sur crasseux.com.
Normalement, il detecte pour chaque buffer s'il utilise <CR>, <LF> ou
<CR><LF>. Par defaut, il utilise <CR><LF>.



Mais Emacs est dans Cygwin, pourquoi ne pas l'utiliser ?

J'utilise couramment Cygwin au bureau, en particulier le serveur X et
Emacs. Tout ça marche parfaitement bien et est facilement mis à jour pa r le
système de gestion de paquetage.

Bref, je ne vois que des avantages et pourtant j'ai l'impression que beauco up
préfèrent NT-Emacs.

Un détail m'aurait-il échappé ?

--
Léo.
Avatar
drkm
Leopold BAILLY writes:

Mais Emacs est dans Cygwin, pourquoi ne pas l'utiliser ?



À la base, je pense que c'était pour avoir la version CVS. Je
ne sais pas si elle est disponible sous Cygwin. Et comme je n'ai
jamais eu à m'en plaindre ...

--drkm