Change Emacs Default Coding System

2019-03-09 18:36发布

问题:

My problem stems from Emacs inserting the coding system headers into source files containing non-ascii characters:

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

My coworkers do not like these headers being checked into our repositories. I don't want them inserted into my files because Emacs automatically detects that the file should be UTF-8 regardless so there doesn't seem to be any benefit to anyone.

I would like to simply set Emacs to use UTF-8 automatically for all files, yet it seems to disagree with this idea. In an effort to fix this, I've added the following to my .emacs:

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

This does not seem to solve my problem. Emacs still inserts the coding-system headers into my files. Anyone have any ideas?

EDIT:

I think this problem is specifically related to ruby-mode. I still can't turn it off though.

回答1:

By default, Emacs will not write file variables into your files. You must have asked it to do so somewhere in your .emacs. Try running emacs -q and see if the file variables get inserted.



回答2:

This works for me:

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

As suggested here

I believe you're correct that it only happens in ruby-mode. It seems ruby-mode is trying to be helpful by adding the line, which makes Ruby detect the source file encoding automatically.



回答3:

Update: I must admit, that I overlooked your actual question concerning the insertion of the variables, so I only answered the "howto setup UTF-8 part", sorry about this. Concerning your actual question I have nothing to add, normally emacs doesn't do this.

maybe this blog entry helps you. Reading the documentation of coding-system-for-read and coding-system-for-write doesn't suggest that you should use it:

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.
...


回答4:

You can also use directory local variables to set up the variables: http://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html

If you put a file with a special name .dir-locals.el in a directory, Emacs will read it when it visits any file in that directory or any of its subdirectories, and apply the settings it specifies to the file's buffer. Emacs searches for .dir-locals.el starting in the directory of the visited file, and moving up the directory tree. (To avoid slowdown, this search is skipped for remote files.)



回答5:

First, I agree with the the original answer, but I would also add that if I had your issue I would use something like the following:

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


回答6:

I had this problem today. For me, the problem was that I copied and pasted some TODO text from an email. When I removed that text, [ # -- coding: utf-8 -- ] was no longer inserted by emacs.



回答7:

In root of your project create file called .dir-locals.el with content:

((nil . ((buffer-file-coding-system . utf-8))))

It will apply this coding to any mode and file. You may see more info here https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html