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?
8
Respuestas:
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:
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.
fuente
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:
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
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 intenteM-x find-file-literally
si todo lo demás falla.fuente
find-file-literally
y luego lo hagoM-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.En mi prueba, editar un
UTF-8
archivo no cambia la codificación y la BOM permanece (efbb bf
). (modo nxml)Bueno, esto puede variar entre
xml-mode
ynxml-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-16
little endian), cambiará la codificación aUTF-16
big endian. Tal vez de eso está hablando.Pero la lista de materiales sigue ahí, cambiada de
fffe
affef
, 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.
Parece que Emacs toma
UTF-16
comoUTF-16BE
, mientras que Windows lo toma comoUTF-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.
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
fuente