强制Emacs使用特定编码,但仅在不会引起问题的情况下。

6
在我的.emacs文件中,我使用以下代码行:
'(setq coding-system-for-write 'iso-8859-1-unix)

如何让 Emacs 以 iso-8859-1-unix 编码保存文件。当我输入无法用该编码表示的字符(例如“Łódź”)时,会提示选择不同的编码,但是在输入 `iso-8859-1-unix' 到迷你缓冲区后,文件被保存了并且出现问题的字符丢失了。

如果我只是在提示后按回车键,则文件将以 Unicode 格式保存,并在关闭和重新打开 Emacs 时再次解释为 Unicode 文件。然后,如果我删除有问题的字符、保存文件并关闭并重新打开 Emacs,它仍将被解释为 Unicode 文件——从中可以推断出,它仍然以 Unicode 格式保存,即使在可能的情况下进行 iso-8859-1-unix 的保存。

那么是否有一种方法可以强制 Emacs 将文件写入 iso-8859-1(只要可能),并且在这样做会导致字符丢失时不以该编码保存呢?

非常感谢您的帮助,

Thure Dührsen

4个回答

1
根据coding-system-for-write的文档字符串,您不应该在全局范围内设置它。
也许您要找的是(prefer-coding-system 'iso-8859-1-unix)

0
下面的代码可以让Emacs在缓冲区编码与保存文件时设置的编码不一致时询问。Emacs会提示你从“安全”的编码中选择一个。
(setq select-safe-coding-system-accept-default-p
      '(lambda (coding)
         (string=
          (coding-system-base coding)
          (coding-system-base buffer-file-coding-system))))

0

尝试

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

编辑:

采纳 AProgrammer 的建议,我们得到以下内容

(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)

我担心这会产生与 '(setq coding-system-for-write 'iso-8859-1-unix) 完全相同的行为。 - Thure Dührsen

0
我会尝试编写一个节省时间的钩子函数,它将检查缓冲区的内容并相应地设置编码。通过使用 find-coding-system-region 函数,这不应该需要太多工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接