2009-04-08 29 views
53

A veces necesito leer archivos de registro que tengan^M (control-M) en los finales de línea. Puedo hacer una sustitución global para deshacerme de ellos, pero luego se registra algo más en el archivo de registro y, por supuesto, todos vuelven.Ocultar^M en emacs

Establecer la codificación al final del estilo estilo unix o estilo dos no parece hacer mucha diferencia (pero el estilo unix es mi predeterminado). Estoy usando el sistema de codificación indeciso (unix | dos).

Estoy en Windows, leyendo archivos de registro creados por log4net (aunque log4net obviamente no es la única fuente de esta molestia).

¿Alguna pista?

+1

Desafortunadamente, set-buffer-file-codificación del sistema no lo hace. El búfer se abre con la línea de modo que dice UNIX. Dando C-x RET f UNIX RET acaba marcando el buffer como modificado sin ocultar los molestos^M's. –

+0

Los correos electrónicos en GNUS son otro lugar donde puede encontrar almacenamientos intermedios con codificación mixta de fin de línea. Por ejemplo, si uno está enviando desde una institución centrada en Windows, tal vez Outlook. La información del encabezado es obtener la codificación EOL de Unix. –

Respuesta

3

Creo que se puede cambiar el sistema de codificación de la línea del archivo está utilizando para el formato Unix con

C-x RET f UNIX RET 

Si lo hace, la línea de modo debe cambiar para añadir la palabra "(Unix)", y todos esos^M's deberían desaparecer.

+0

No es útil, creo. set-buffer-file-coding-system parece cambiar el contenido real del archivo editado. – hillu

+0

única solución que funcionó para mí. Gracias –

+0

Especificar el sistema de codificación 'unix' no funcionó para mí, pero especificando' dos' did (después de revertir el buffer). –

4

Si desea ver los archivos de registro y simplemente esconder los^M en lugar de reemplazarlos, puede usar Drew Adam's highlight extension para hacerlo.

Usted puede escribir elisp código o hacer una macro de teclado para hacer lo siguiente

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

Esto primera resaltar el^M y luego ocultarlos. Si quieres que vuelvan a usar `hlt-show-default-face '

+0

Gracias por el enchufe, Justin. Agregué otra (diferente) solución, a continuación. Más de una forma de desollar un gato ... – Drew

6

¿Qué tal?

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

Hice un archivo que tiene dos líneas, y el segundo tiene un retorno de carro. Emacs abriría el archivo en codificación Unix, y el sistema de codificación de conmutación no hace nada. Sin embargo, el anterior universal-coding-system-argument funciona.

+4

Modificado ligeramente para un archivo ya abierto: 'C-x RET c dos RET M-x revertir-buffer RET' – Shelvacu

20

Las versiones modernas de emacs saben cómo manejar terminaciones de línea UNIX y DOS, por lo que cuando^M aparece en el archivo, significa que hay una mezcla de ambos en el archivo. Cuando existe tal mezcla, emacs se establece de manera predeterminada en el modo UNIX, por lo que los^Ms son visibles. La verdadera solución es arreglar el programa creando el archivo para que use finales de línea consistentes.

+3

Emacs está equivocado. La verdadera solución es arreglar Emacs. P.ej. git crea archivos de conflicto que no tienen^M s en las líneas de "control" (por ejemplo, líneas que comienzan con <<<<<<). Es perfectamente válido para git ignorar cualquier línea que tenga el archivo, ya que las líneas de control son '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 [])) 

Solución de Johan Bockgård. Lo encontré here.

+0

funciona encantadoramente. ¿Por qué TS no acepta esta respuesta? gracias – swdev

+4

Si desea que se ejecute esta función, casi siempre agregue lo siguiente a su '.emacs' (me tomó un tiempo encontrarlo):' (add-hook 'text-mode-hook' remove-dos-eol) ' – Henrik

+1

AÑOS He estado sufriendo el^M. Gracias. – EoghanM

1

Puede cambiar la entrada de la tabla de visualización del carácter Control-M (^M), para que se muestre como espacios en blanco o incluso desaparezca totalmente (vacía). Consulte el código en la biblioteca pp-c-l.el (Pretty Control-L) para obtener inspiración. Muestra ^L caracteres de forma arbitraria.

Editado: Vaya, acabo de notar que @binOr ya mencionó este método.

3

La respuesta de Edric debería llamar más la atención. La solución de Johan Bockgård aborda la queja del afiche, en la medida en que hace que los^M sean invisibles, pero eso simplemente enmascara el problema subyacente y fomenta una mayor mezcla de terminación de línea DOS y Unix.

La solución adecuada sería hacer un M-x replace-regexp global para convertir todas las terminaciones de línea en DOS (o Unix, según sea el caso). A continuación, cierre y vuelva a abrir el archivo (no estoy seguro de si M-x revert-buffer sería suficiente) y las^M serán invisibles o desaparecerán todas.

+3

Mx reemplazar cadena Cq Cm RET (de http://lists.netisland.net/archives/plug/plug-1999-06/msg00365.html) –

2

poner esto en su .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 ""))) 

Ahora sólo tiene que llamar dos2unix y eliminar todas las ^M caracteres.

0

Si se encuentra con ^M s en el correo recibido en ñus, puede utilizar W c (lavado CR), o

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

respuesta de sudeepdino008 no funcionaba para mí (que no puedo comentar en su respuesta, por lo que Tuve que agregar mi propia respuesta.).

pude solucionarlo utilizando este código:

(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

En el futuro, use un '@' antes del nombre de una persona: @RMK – Czipperz