web-dev-qa-db-fra.com

Cacher ^ M dans Emacs

Parfois, j'ai besoin de lire les fichiers journaux contenant ^ M (control-M) dans les fins de ligne. Je peux effectuer un remplacement global pour les éliminer, mais quelque chose de plus est enregistré dans le fichier journal et, bien sûr, ils reviennent tous.

Définir un encodage de fin de ligne de style unix ou de style dos ne semble pas faire beaucoup de différence (mais le style unix est ma valeur par défaut). J'utilise le système de codage undecided- (unix | dos).

Je suis sur Windows, en train de lire les fichiers journaux créés par log4net (bien que log4net ne soit évidemment pas la seule source de ce désagrément).

Des allusions?

54
Russell
(defun remove-dos-eol ()
  "Do not show ^M in files containing mixed UNIX and DOS line endings."
  (interactive)
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M []))

Solution de Johan Bockgård. Je l'ai trouvé ici .

72
binOr

Les versions modernes d’emacs savent comment gérer les fins de ligne UNIX et DOS. Ainsi, lorsque ^ M apparaît dans le fichier, cela signifie qu’il existe un mélange des deux. Quand il y a un tel mélange, emacs passe par défaut en mode UNIX, ainsi les ^ Ms sont visibles. La vraie solution consiste à corriger le programme créant le fichier afin qu'il utilise des fins de ligne cohérentes.

19
Edric

Qu'en est-il de?

C-x RET c dos RET C-x C-f FILENAME RET

J'ai fait un fichier qui a deux lignes, la seconde ayant un retour chariot. Emacs ouvrirait le fichier en codage Unix, et changer de système de codage ne fait rien. Cependant, le universal-coding-system-argument ci-dessus fonctionne.

6
ashawley

Si vous souhaitez afficher les fichiers journaux et simplement masquer les ^ M plutôt que de les remplacer, vous pouvez utiliser l'extension highlight de Drew Adam pour le faire. 

Vous pouvez écrire du code elisp ou créer une macro de clavier pour effectuer les opérations suivantes:

select the whole buffer
hlt-highlight-regexp-region
C-q C-M
hlt-hide-default-face

Cela mettra d’abord en évidence les ^ M, puis les cachera. Si vous voulez les récupérer, utilisez `hlt-show-default-face '

4
justinhj

La réponse d'Edric devrait attirer davantage l'attention. La solution de Johan Bockgård répond effectivement à la plainte de l'affiche, dans la mesure où elle rend l'invisible ^ M, mais elle masque le problème sous-jacent et encourage un mélange plus poussé des fins de ligne Unix et DOS.

La solution appropriée serait de faire un M-x replace-regexp global pour transformer les fins de lignes all en positions DOS (ou Unix, selon le cas). Fermez et rouvrez ensuite le fichier (vous ne savez pas si M-x revert-buffer serait suffisant) et les ^ M seront tous invisibles ou disparaîtront.

3
SABBATINI Luca

Je crois que vous pouvez changer le système de codage de ligne utilisé par le fichier au format Unix avec 

C-x RET f UNIX RET

Si vous faites cela, la ligne de mode devrait changer pour ajouter le mot "(Unix)", et tous ces ^ M devraient disparaître.

3
T.E.D.

Vous pouvez modifier l’entrée de la table d’affichage du caractère Control-M (^M) pour la rendre affichable sous forme d’espace ou même de disparaître totalement (vide). Voir le code dans la bibliothèque pp-c-l.el ( Pretty Control-L ) pour trouver l'inspiration. Il affiche les caractères ^L de manière arbitraire.

Édité: Oups, je viens de remarquer que @binOr a déjà mentionné cette méthode.

2
Drew

Mettez ceci dans votre .emacs:

(defun dos2unix ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
    (goto-char (point-min))
      (while (search-forward "\r" nil t) (replace-match "")))

Maintenant, vous pouvez simplement appeler dos2unix et supprimer tous les caractères ^M.

2
sudeepdino008

qu'en est-il de dos2unix, unix2dos (maintenant tofrodos )?

0
Massagran

la réponse de sudeepdino008 n'a pas fonctionné pour moi (je ne pouvais pas commenter sa réponse, j'ai donc dû ajouter ma propre réponse.). 

J'ai pu le réparer en utilisant ce code:

(defun dos2unix ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
    (goto-char (point-min))
      (while (search-forward (string ?\C-m) nil t) (replace-match "")))
0
RMK

Si vous rencontrez ^Ms dans le courrier reçu en Gnus, vous pouvez utiliser W c (wash CRs) ou 

(setq gnus-treat-strip-cr t)
0
Brady Trainor

Comme binOr l'a dit, ajoutez ceci à votre% APPDATA% .emacs.d\init.el sous Windows ou à un endroit quelconque de votre configuration.

;; Windows EOL
(defun hide-dos-eol ()
  "Hide ^M in files containing mixed UNIX and DOS line endings."
  (interactive)
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M []))

(defun show-dos-eol ()
  "Show ^M in files containing mixed UNIX and DOS line endings."
  (interactive)
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M ?\^M))

(add-hook 'text-mode-hook 'hide-dos-eol)