2009-04-08 3 views
53

Parfois, j'ai besoin de lire les fichiers journaux qui ont^M (contrôle-M) dans les fins de ligne. Je peux faire un remplacement global pour se débarrasser d'eux, mais alors quelque chose de plus est enregistré dans le fichier journal et, bien sûr, ils reviennent tous.Masquage^M dans emacs

La définition d'un codage de fin de ligne de type unix ou dos ne semble pas faire beaucoup de différence (mais unix-style est mon choix par défaut). J'utilise le système de codage indécis (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 cette nuisance).

Des indices?

+1

Malheureusement, set-buffer-file-encodage système ne fonctionne pas. Le tampon s'ouvre avec la ligne de mode indiquant UNIX. En lui donnant C-x RET f UNIX RET finit par marquer le tampon comme modifié sans cacher le satageux^M's. –

+0

Les e-mails dans GNUS sont un autre endroit où vous pouvez rencontrer des buffers avec un codage de fin de ligne mixte. Par exemple, si l'on envoie à partir d'une institution centrée sur Windows, peut-être Outlook. Les informations d'en-tête obtiennent l'encodage Unix EOL. –

Répondre

3

Je crois que vous pouvez changer la ligne système de codage du fichier utilise 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 ceux-là devraient partir.

+0

Pas utile, je pense. set-buffer-file-coding-system semble changer le contenu actuel du fichier édité. – hillu

+0

Seule solution qui a fonctionné pour moi. Merci –

+0

La spécification du système de codage 'unix' ne fonctionnait pas pour moi - mais en spécifiant' dos' (après avoir rétabli le tampon). –

4

Si vous souhaitez afficher les fichiers journaux et simplement masquer les^M au lieu de les remplacer réellement, vous pouvez utiliser highlight extension de Drew Adam pour le faire.

Vous pouvez écrire elisp code ou une macro clavier pour effectuer les opérations suivantes

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

Ce sera d'abord mettre en évidence le^M et puis de les cacher. Si vous voulez les utiliser, utilisez `hlt-show-default-face '

+0

Merci pour le plug, Justin. J'ai ajouté une autre solution (différente), ci-dessous. Plus d'une façon d'habiller un chat ... – Drew

6

Qu'en est-il? J'ai fait un fichier qui a deux lignes, avec le second ayant un retour chariot. Emacs ouvrirait le fichier dans le codage Unix, et le système de codage de commutation ne fait rien. Cependant, le universal-coding-system-argument ci-dessus fonctionne.

+4

Légèrement modifié pour un fichier déjà ouvert: 'C-x RET c dos RET M-x retour-tampon RET' – Shelvacu

20

Les versions modernes d'emacs savent comment gérer les fins de ligne UNIX et DOS, donc quand^M apparaît dans le fichier, cela signifie qu'il y a une combinaison des deux dans le fichier. Quand il y a un tel mélange, emacs utilise par défaut le mode UNIX, ainsi les^Ms sont visibles. Le vrai problème consiste à corriger le programme créant le fichier afin qu'il utilise des fins de ligne cohérentes.

+3

Emacs est faux. Le vrai problème est de réparer Emacs. Par exemple. git crée des fichiers de conflit qui n'ont pas de^M s dans les lignes 'control' (par exemple les lignes commençant par <<<<<<). Il est parfaitement possible pour git d'ignorer toute ligne ayant la fin du fichier, car les lignes de contrôle sont 'meta'. – EoghanM

68
(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é here.

+0

cela fonctionne avec charme. Pourquoi TS n'accepte-t-il pas cette réponse? merci – swdev

+4

Si vous voulez que cette fonction soit exécutée presque toujours ajouter ce qui suit à votre '.emacs' (m'a pris un certain temps pour savoir):' (ajouter-crochet 'texte-mode-crochet' remove-dos-eol) ' – Henrik

+1

ANNÉES J'ai souffert le^M. Je vous remercie. – EoghanM

0

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

1

Vous pouvez modifier l'entrée de la table d'affichage du caractère Control-M (^M), afin de l'afficher en tant qu'espacement ou même de disparaître totalement (vide). Voir le code dans la bibliothèque pp-c-l.el (Pretty Control-L) pour l'inspiration. Il affiche ^L caractères de manière arbitraire.

Modifié: Oops, je viens de remarquer que @binOr a déjà mentionné cette méthode.

3

La réponse d'Edric devrait retenir davantage l'attention. La solution de Johan Bockgård répond à la plainte de l'annonceur, dans la mesure où elle rend les^M invisibles, mais cela ne fait que masquer le problème sous-jacent et encourage un mélange plus poussé des fins de ligne Unix et DOS.

La bonne solution serait de faire un M-x replace-regexp global pour transformer toutes les fins de ligne en celles de DOS (ou Unix, selon le cas). Ensuite, fermez et rouvrez le fichier (pas sûr si M-x revert-buffer suffirait) et les^M seront soit tous invisibles, ou tout sera parti.

+3

Mx remplacer-chaîne Cq Cm RET (sur http://lists.netisland.net/archives/plug/plug-1999-06/msg00365.html) –

2

mettre 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 ^M caractères.

0

Si vous rencontrez ^M s dans le courrier reçu à gnous, vous pouvez utiliser W c (laver SNPC), ou

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

réponse de sudeepdino008 ne fonctionnait pas pour moi (je ne pouvais pas commenter sa réponse, je a 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

Dans le futur, utilisez un '@' avant le nom d'une personne: @RMK – Czipperz