更改Emacs默认编码系统

25

我的问题源于Emacs将编码系统头插入包含非ASCII字符的源文件中:

# -*- coding: utf-8 -*-

我的同事不喜欢将这些标头提交到我们的代码库中。我不想把它们插入到我的文件中,因为Emacs会自动检测文件应该使用UTF-8编码,所以似乎没有任何人会受益。

我希望能够简单地设置Emacs自动对所有文件使用UTF-8编码,但它似乎不赞成这个想法。为了解决这个问题,我在我的.emacs文件中添加了以下内容:

(prefer-coding-system 'utf-8)
(setq coding-system-for-read 'utf-8)
(setq coding-system-for-write 'utf-8)

这并不能解决我的问题。Emacs仍然会把编码系统的头信息插入到我的文件中。有没有人有什么想法?

编辑:

我认为这个问题特别关联到Ruby模式。但是我仍然无法关闭它。


实际上,您的配置对我很有效。它阻止了Emacs 24一直要求使用UTF-8保存文件。 - Truong Ha
您放置的elisp片段对于在Emacs上默认设置utf-8非常有用,非常感谢您的帮助! - pr00thmatic
当Python文件中存在ASCII字符超出0-127范围时,我在使用elpy模式编辑文件时遇到了问题:'error in process sentinel: elpy-rpc--default-error-callback: peculiar error: "exited abnormally with code 1"'. 您的三行代码解决了这个问题 :-) - AstroFloyd
7个回答

11

这个对我起作用:

(setq ruby-insert-encoding-magic-comment nil)

这里所建议的那样。

我认为你是正确的,这只会发生在ruby-mode中。看起来ruby-mode试图通过添加该行来提供帮助,从而使Ruby能够自动检测源文件编码。


9

默认情况下,Emacs不会将文件变量写入您的文件中。您必须在.emacs文件中的某个地方要求它这样做。尝试运行emacs -q并查看是否插入了文件变量。


1

更新:我必须承认,我忽略了你实际的问题,关于变量的插入,所以我只回答了“如何设置UTF-8部分”,对此我很抱歉。关于你实际的问题,我没有什么可补充的,通常emacs不会这样做。

也许这篇博客文章可以帮助你。阅读coding-system-for-readcoding-system-for-write的文档并不建议你使用它:

coding-system-for-write is a variable defined in `C source code'.
Its value is nil

Documentation:
Specify the coding system for write operations.
Programs bind this variable with `let', but you should not set it globally.
...

1

您还可以使用目录本地变量来设置变量:http://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html

如果您在目录中放置一个名为.dir-locals.el的特殊文件,当Emacs访问该目录或其任何子目录中的任何文件时,它将读取该文件,并将其指定的设置应用于文件的缓冲区。 Emacs从访问的文件所在的目录开始搜索.dir-locals.el,并向上移动目录树。(为避免减速,远程文件会跳过此搜索。)


0

首先,我同意原始回答,但我还想补充一下,如果我遇到了您的问题,我会使用类似以下代码:

(defun java-setup ()
  (setq tab-stop-list
        '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92)
        indent-tabs-mode nil
        tab-width 4
    fill-column 96
    buffer-file-coding-system 'utf-8-unix
    c-comment-start-regexp "\\(@\\|/\\(/\\|[*][*]?\\)\\)"))

(add-hook 'java-mode-hook 'java-setup)

大部分都是无关紧要的吧?我认为你真正想表达的是:(defun set-coding-system () (setq buffer-file-coding-system 'utf-8-unix)) (add-hook 'find-file-hook 'set-coding-system) ... 当然,我还没有尝试过,但这似乎是你所说的重要部分。 - quodlibetor
1
从狭义上讲,是的,你是正确的。然而,我认为展示一个真实世界的例子(使用emacs hook函数设置缓冲区本地变量的解决方案)可能更有效,并且可能更容易理解。有时这样做是有效和有帮助的,有时会增加混淆。但既然你提出了这个问题,我会注意在未来的回答中更清楚地说明什么是多余的,什么不是。谢谢。 - pajato0

0
今天我遇到了这个问题。对我来说,问题是我从电子邮件中复制并粘贴了一些TODO文本。当我删除该文本时,emacs不再插入[ # -- coding: utf-8 -- ]。

-1

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