Haga que emacs no elimine la lista de materiales de los archivos XML

8

Utilizo Emacs para editar un archivo XML que también es leído por otra aplicación. La otra aplicación requiere que el archivo comience con un marcador de orden de bytes (BOM). Sin embargo, Emacs parece eliminar la lista de materiales cada vez que edito el archivo. ¿Hay alguna manera de hacer que Emacs deje en paz la lista de materiales?

Vebjorn Ljosa
fuente
¿Es por eso que cuando edito un archivo xml para schtasks, cambia la codificación de unicode a big endian unicode y luego no funciona?
js2010

Respuestas:

9

Emacs escribirá una lista de materiales o no dependiendo de qué sistema de codificación esté utilizando. Emacs elige automáticamente el sistema de codificación que utiliza cuando visita un archivo.

Puede cambiar el sistema de codificación a utf-8-with-signature, que le indicará a Emacs que escriba la lista de materiales.

Para cambiar el sistema de codificación de un archivo visitado:

C-x RET r utf-8-with-signature RET

Puede configurar el sistema de codificación que Emacs usa para un archivo en particular configurando una variable de archivo . Consulte el manual de la sección 57.3.4 Variables locales en los archivos para aprender cómo hacerlo.

Richard Hoskins
fuente
¡Impresionante, exactamente el tipo de respuesta que esperaba! ¡Gracias!
Vebjorn Ljosa
5

Seguimiento de la respuesta de Richard Hoskins: si nunca desea que la BOM esté oculta por emacs, puede deshabilitar las codificaciones * con firma con este fragmento:

(setq auto-coding-regexp-alist
  (delete (rassoc 'utf-16be-with-signature auto-coding-regexp-alist)
  (delete (rassoc 'utf-16le-with-signature auto-coding-regexp-alist)
  (delete (rassoc 'utf-8-with-signature auto-coding-regexp-alist)
          auto-coding-regexp-alist))))

La lista de materiales es U + FEFF, el "espacio sin ruptura de ancho cero", y no aparece como un cuadro en mi emacs 23.1.1; en cambio, la línea superior del archivo se movió ligeramente hacia abajo, y un cuadro a veces aparece alrededor de la primera línea, pero puede ver que la lista de materiales está allí y eliminarla si es necesario.


fuente
1

Emacs "en sí" no debería meterse con la lista de materiales; si realmente está haciendo eso, entonces tendría que ser el código que implementa el "modo" de Emacs que está utilizando para editar sus archivos XML lo que elimina la lista de materiales. Como no dice cuál es, solo puedo remitirlo a la documentación de ese modo, o que abra los archivos fundamental-mode(o un modo no destructivo similar). O intente M-x find-file-literallysi todo lo demás falla.

Osito de peluche
fuente
uso xml-mode (es decir, sgml-mode), pero ese problema parece estar en otro lugar: si abro el archivo find-file-literallyy luego lo hago M-x sgml-mode, la lista de materiales no se elimina. Debido a que los caracteres especiales no están codificados con UTF-8 cuando se visita un archivo literalmente, sería bueno saber en qué parte de la conversión de formato subyacente y el código de conversión de código de caracteres se elimina la lista de materiales.
Vebjorn Ljosa
0

En mi prueba, editar un UTF-8archivo no cambia la codificación y la BOM permanece ( efbb bf). (modo nxml)

Bueno, esto puede variar entre xml-modey nxml-mode, o la versión de emacs (24 vs 26). Dice el modo en la parte inferior.

Si edita un Emacs un archivo XML codificado en unicode ( UTF-16little endian), cambiará la codificación a UTF-16big endian. Tal vez de eso está hablando.

Pero la lista de materiales sigue ahí, cambiada de fffea ffef, y los valores nulos están en el byte impar en lugar del byte par. Puedes verlo en modo hexl.

Archivo xml de muestra. El atributo de codificación dirige la codificación cuando emacs la guarda en modo xml o modo nxml. Se parcheará una versión futura para verificar primero la lista de materiales.

<?xml version="1.0" encoding="UTF-16"?>
<hi />

Parece que Emacs toma UTF-16como UTF-16BE, mientras que Windows lo toma como UTF-16LE(BE y LE no funcionan en Emacs para el atributo de codificación). El atributo de codificación es probablemente clave para los problemas aquí.

Guardarlo en powershell lo convertirá de nuevo a utf-16le.

[xml]$xml = get-content test.xml; $xml.save('test.xml')

Con encoding = "UTF-16LE" y encoding = "UTF-16BE", se elimina el bom, lo que hace que el archivo sea irreconocible en emacs. Este es un error confirmado que será parcheado: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

js2010
fuente