Forzar a Emacs a usar una codificación particular si y solo si eso no causa problemas

En mi archivo .emacs, uso la línea

'(setq coding-system-for-write 'iso-8859-1-unix)

para que Emacs guarde archivos en la codificación iso-8859-1-unix. Cuando ingreso caracteres que no se pueden codificar de esa manera ("Łódź" por ejemplo), se me solicita que seleccione una codificación diferente, pero al ingresar `iso-8859-1-unix 'en el minibúfer, el archivo se guarda y el los personajes se pierden.

Si presiono enter en el indicador, el archivo se guarda en Unicode, y cuando cierro y vuelvo a abrir Emacs, se vuelve a interpretar como un archivo Unicode. Si luego elimino los caracteres ofensivos, guardo el archivo y cierro y vuelvo a abrir Emacs en otro momento, todavía se interpreta como un archivo Unicode, del cual deduzco que aún se ha guardado en Unicode, aunque lo guardo en iso-8859- 1-unix habría sido posible.

Entonces, ¿hay alguna manera de obligar a Emacs a escribir un archivo en iso-8859-1 siempre que sea posible, y nunca guardarlo en esa codificación si al hacerlo engulliría caracteres?

Muchas gracias de antemano,

Thure Dührsen

preguntado el 16 de mayo de 11 a las 18:05

4 Respuestas

Según la cadena de documentos para coding-system-for-write, no debería configurarlo globalmente.

Quizás lo que buscas es (prefer-coding-system 'iso-8859-1-unix)?

Respondido 22 ago 11, 16:08

Intentaría escribir una función de gancho de ahorro de tiempo que verificaría el contenido del búfer y establecería la codificación correspondiente. Al usar find-coding-system-region no debería haber mucho trabajo.

contestado el 17 de mayo de 11 a las 20:05

Trata

(setq-default buffer-file-coding-system 'iso-8859-1)

Edit:

Incorporando la sugerencia de AProgrammer, obtenemos

(defun enforce-coding-system-priority ()
  (let ((pref (car (coding-system-priority-list)))
        (list (find-coding-systems-region (point-min) (point-max))))
    (when (or (memq 'undecided list) (memq pref list))
      (setq buffer-file-coding-system pref))))

(add-hook 'before-save-hook 'enforce-coding-system-priority)

(prefer-coding-system 'iso-8859-1)

contestado el 18 de mayo de 11 a las 15:05

Me temo que da exactamente el mismo comportamiento que con '(setq coding-system-for-write 'iso-8859-1-unix). - Thure Dührsen

Lo siguiente debería hacer que Emacs pregunte cuándo la codificación del búfer es no es eso con lo que emacs está configurado para guardar el archivo. Entonces, Emacs le pedirá que elija una entre las codificaciones "seguras".

(setq select-safe-coding-system-accept-default-p
      '(lambda (coding)
         (string=
          (coding-system-base coding)
          (coding-system-base buffer-file-coding-system))))

Respondido 14 ago 11, 01:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.