强制 Emacs 使用特定的编码,当且仅当这不会导致问题
Posted
技术标签:
【中文标题】强制 Emacs 使用特定的编码,当且仅当这不会导致问题【英文标题】:Force Emacs to use a particular encoding if and only if that causes no trouble 【发布时间】:2011-05-16 18:42:35 【问题描述】:在我的 .emacs 文件中,我使用该行
'(setq coding-system-for-write 'iso-8859-1-unix)
让 Emacs 以 iso-8859-1-unix 编码保存文件。当我 输入无法以这种方式编码的字符(“Łódź” 例如),我被提示选择不同的编码,但在 在 minibuffer 中输入“iso-8859-1-unix”,文件被保存并 冒犯的角色丢失了。
如果我只是在提示符下按回车,文件将以 Unicode 格式保存,并且 当我关闭并重新打开 Emacs 时,它被解释为 Unicode 文件 再次。如果我然后删除有问题的字符,请保存文件并 再次关闭并重新打开 Emacs,它仍然被解释为 Unicode 文件——我从中推断它仍然保存在 Unicode,即使保存在 iso-8859-1-unix 中 可能。
那么有没有办法强制 Emacs 在 iso-8859-1 中写入文件 尽可能,如果这样做,切勿将其保存在该编码中 会狼吞虎咽吗?
非常感谢,
杜尔·杜尔森
【问题讨论】:
【参考方案1】:根据coding-system-for-write
的文档字符串,您不应该全局设置它。
也许您正在寻找的是(prefer-coding-system 'iso-8859-1-unix)
?
【讨论】:
【参考方案2】:我会尝试编写一个保存时间挂钩函数来检查缓冲区的内容并相应地设置编码。通过使用 find-coding-system-region 应该不会有太多工作。
【讨论】:
【参考方案3】:试试
(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)
完全相同的行为。【参考方案4】:
以下内容应该让 Emacs 询问何时缓冲区编码是 not 设置 emacs 以保存文件。然后,Emacs 会提示您从“安全”编码中选择一种。
(setq select-safe-coding-system-accept-default-p
'(lambda (coding)
(string=
(coding-system-base coding)
(coding-system-base buffer-file-coding-system))))
【讨论】:
以上是关于强制 Emacs 使用特定的编码,当且仅当这不会导致问题的主要内容,如果未能解决你的问题,请参考以下文章
当且仅当有新的提交时,如何在一天中的特定时间构建 XCode 机器人?
当且仅当它在 React Native 中返回 null 时,如何使函数再次运行?
当且仅当 ContactsContract.Contacts.CONTENT_URI 更改时,ContentObserver 应该调用