emacs与vi的文件编码;unicad
root@localhost:/usr/share/emacs/site-lisp# pwd
/usr/share/emacs/site-lisp
root@localhost:/usr/share/emacs/site-lisp# ll
总用量 308
drwxr-xr-x 2 root root 4096 7月 25 23:07 autoconf
-rw-r--r-- 1 root root 11709 7月 2 21:41 cmake-mode.el
-rw-r--r-- 1 root root 5625 12月 3 2012 debian-startup.el
-rw-r--r-- 1 root root 7814 8月 27 2012 desktop-entry-mode.el
drwxr-xr-x 2 root root 4096 7月 27 14:44 dictionaries-common
-rw-r--r-- 1 root root 21800 4月 6 04:53 ipython.el
-rw-r--r-- 1 root root 253583 4月 9 2010 unicad.el
http://ebkk.blog.163.com/blog/static/1941350852008544334185/
Unicad 可以帮助 Emacs 在打开文件的时候猜测语言编码,用正确的编码系统打开文件,避免乱码现象。
1.下载最新版的 unicad.el,复制到你的 Emacs load path,例如 site-lisp 目录:/usr/share/emacs/site-lisp/
2.在 ~/.emacs 文件里加上:(require 'unicad)
3.如果文件夹是中文名,文件夹中的文件可能不能正常打开,则在 ~/.emacs 文件里加上:(setq file-name-coding-system 'utf-8)
http://hi.baidu.com/limp_t/item/ce70872eb077169ab632631e
使用.emacs.d目录管理Emacs配置文件
第一启动emacs会在~目录下创建.emacs.d目录
使用.emacs.d目录管理Emacs配置文件
参考:Declaring .emacs Bankruptcy
Emacs的默认配置文件是.emacs,Emacs启动时会读取并执行.emacs中的LISP代码,用户使用.emacs达到自己的Emacs初始化配置目的。
不过单独使用.emacs有一个问题,因为时间一久,Emacs的初始化配置会变得很多很乱,各种mode的配置都放在.emacs中,.emacs文件中的代
码就变得很长,不利于管理、更改和阅读。其实Emacs建议了另外一种管理初始化配置的方式,我们新安装的Emacs都有一个.emacs.d目录,
就是利用这个目录实现按分类逐个加载初始配置文件来管理Emacs初始配置的方式。
使用.emacs.d目录管理Emacs初始化配置文件,如下设置:
在默认配置文件.emacs中使用:add-to-list,将自己的配置文件路径,通常就使用.emacs.d,加入到load-path,并使用:require,加入配
置文件提供的特性(Feature),一般来说将配置文件名和其提供的Feature命名相同。例如,下面的.emacs配置文件:
1
;; This is the main Emacs initialization file - .emacs.
2
3
(add-to-list 'load-path (expand-file-name "~/.emacs.d"))
4
(require 'feature_1)
5
(require 'feature_2)
6
(require 'feature_3)
在.emacs中加入的load-path配置文件路径中,即上面的.emacs.d目录,放入自己的配置文件。这些配置文件可以按照功能分类组织,例如,
在.emacs.d中放入:feature_1.el、feature_2.el、feature_3.el。注意:要在每个配置文件中使用provide定义其提供的Feature,比如:
feature_1.el这个配置文件,它提供feature_1特性,即是.emacs中使用require命令要求的feature_1特性,那么要在feature_1.el中加入
provide,则feature_1.el内容如下:
1
;; This is my Emacs customization file feature_1.el providing feature_1.
2
3
(provide 'feature_1)
4
5
;; customization code ...
这样按功能分类组织Emacs的初始化配置文件就清晰多了,原来的默认配置文件.emacs现在只是一个调入其它配置文件的入口,它的内容也少
多了,更容易扩展和管理。关于Feature、require、provide的详细功能参考Emacs的GNU官方文档:15.7 Features。
另外提一句,目前很多Linux下的开源的软件都支持这种:.xxx.d目录的方式管理配置文件,其中xxx是软件相关的名字。
2010/7/2 Limp_T <>
emacs-23.exe解压该文件,解压后进入相应的文件夹,文件夹下包含以下子文件夹:bin、data、etc、info、leim、lisp、lock、site-lisp、
var.bin文件夹中是一些可执行程序,info文件夹中是帮助信息,site-lisp文件夹中是一些扩展的包(Emacs的插件一般都是一个以el为后缀名
的文件).
在bin文件夹中,运行addpm.exe,注册系统变量ComSpec,在我的电脑图标上点击右键,选择"属性",然后选择"高级"选项卡,在"高级"选项卡
下面选择"环境变量",在"系统变量"栏中可以看到有一个变量叫做"ComSpec",它的值为C:\WINDOWS\system32\cmd.exe(和%SystemRoot%
\system32\cmd.exe一样).该变量的作用是指示emacs调用系统的shell,在windows下一般用的都是cmd,当然也可以使用cgywin等其它的shell,
使用cgywin等作为emacs默认的shell时可能会需要一些其它的设置,这些可以参考emacs的在线帮助.运行addpm.exe后,会给emacs添加开始菜
单.运行runemacs.exe可以启动emacs。
emacs安装好了以后应该对它进行配置,只有经过一些必要的配置,它才配得上"能煮咖啡"这个称号.
首先在“环境变量”中添加“HOME”变量,例如值为“E:\ erlang” (erlang工程);
接着在“HOME”变量的路径下的目录建立一个文件名为".emacs"的文件(如果不设置HOME变量,可以在根目录C:\目录下建立这
个".emacs"文件),如果直接在windows下建立一个".emacs"文件,windows会提示请输入文件名,建立不成功,我们最好直接就用emacs来建立这
个文件,在emacs下通过菜单File->Visit New File...来建立一个文件,文件名就是".emacs".".emacs"文件是emacs的配置文件,emacs在启动
的时候会从".emacs"文件中读取配置信息,来打开或者关闭各种功能,初始化扩展包或者配置界面上的一些显示(去掉菜单栏,工具栏,改变背景
颜色等).
最后创建一个Emacs的快捷方式,放在桌面或者任务栏快速启动,右击快捷方式选“属性”,将“起始位置”设为"E:
\erlang“或"%HOME% "(HOME环境变量)。这样Emacs启动后可以直接定位到erlang工程的目录。
Windows下设置Emacs的HOME目录
总的来说,Emacs的默认配置文件放在变量HOME所指的路径下,所以,只要我们把.emacs扔到HOME所指向的目录就可以了,下面就简单介绍一
下在Windows下设置home目录的几种方法,并进行简单的对比。
第一种方法,改变home环境变量的值。
这种方法,改变了$home变量,也会影响Cygwin或是其他一些应用程序,因为有一些程序会根据Windows的home环境变量来寻找数据存放的路
径。
第二种方法,不改变Windows默认的home值,设置默认的.emacs文件读取你自己的Emacs配置文件,并重新设定Emacs的home目录。
你可以在Emacs中输入C-x C-f,然后打开路径~(即当前的home环境变量所指的路径,一般来说是这样的路径:C:/Documents and
Settings/water/Application Data)。
看看显示的是哪个目录,如果此目录下没有.emacs,可以创建一个.emacs或_emacs,然后在这个.emacs文件里,加入如下语句:
?View Code LISP
(load-file "E:/water/.emacs")
文件 E:/water/.emacs 才是我们真正的Emacs配置文件,我们可以在这个真正的配置文件里用如下语句设置我们的home目录:
?View Code LISP
1
2
3
4
5
(setenv "HOME" "E:/water")
(setenv "PATH" "E:/water")
;;set the default file path
(setq default-directory "~/")
(add-to-list 'load-path "~/emacs/site-lisp")
这个方法的优点是比较简单同样也方便对.emacs文件备份,不会对其它应用程序产生任何影响。
第三种方法,修改注册表,在注册表中进行如下设置:
HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\HOME=%emacs_dir%
以上三种方法都可以设置好Emacs的Home目录,但是,系统是按什么顺序来解析它们的呢?大体上的顺序是这样的:
如果设置了环境变量HOME,则使用HOME指定的目录。
如果设置了注册表里的值HKCU\SOFTWARE\GNU\Emacs\HOME,则使用这个值所指定的目录作为home目录。并不是太推荐使用这种方法,因为会
导致用户共享一个home目录。
如果 C:\.emacs 文件存在,则使用 C:\.emacs 这个文件。这个是为了向低版本的Emacs兼容,因为低版本的Emacs就是默认用这个文件作为
配置文件。
把用户的AppData目录作为home目录(通常来说,就是类似这样的目录 C:/Documents and Settings/water/Application Data ),这个用户
的数据目录根据Windows版本的不同而有所不同。
我个人比较喜欢用第二种方法,即简单又方便备份。
其实,如果你只是想要Emacs能找到你的.emacs的话,也可以不用管HOME目录的,写个批处理文件emacs.bat:
path-of-emacs.exe -q -l path-of-your.emacs
以后执行这个批处理文件就可以用你的配置打开Emacs了。
5、加载.el文件
lisp目录下存放着lisp源文件(*.el)和已编译的lisp文件(*.elc),以后你也可以将自己的.el文件放在这个目录下,然后还要在.emacs文件插入相关语句。比如你有一个文件叫做abcd.el,将它复制到lisp目录下,然后打开.emacs文件插入一句(require 'abcd)就可以了(包括圆括号,不需要扩展名.el)。
如果你不喜欢lisp文件夹,也可以自己新建一个,比如在home目录下建一个文件夹叫做xyz,然后把abcd.el放在xyz目录下,在.emacs文件插入以下两句:
(setq load-path (cons "~/xyz" load-path))
(require 'abcd)
第一句告诉emacs先加载你的xyz目录,第二句再加载abcd.el。注意“~/”是linux系统的用法,表示home目录。
https://code.google.com/p/unicad/wiki/FAQ_Chinese
什么是 Unicad?Unicad 自动编码识别器的缩写。他是基于一个 Mozilla 语言/编码识别扩展的 Emacs-Lisp 程序。 Unicad 能做什么?Unicad 可以帮助 Emacs 在打开文件的时候猜测语言编码,用正确的编码系统打开文件,避免乱码现象。 Unicad 支持什么语言/编码系统?
谁应该使用 Unicad?
怎样使用 Unicad?下载最新版的 unicad.el, 复制到你的 Emacs load path (例如 site-lisp 目录), 在你的 ~/.emacs 文件里加上: (require'unicad) 推荐 byte-compile 这个文件来加速检测编码和打开文件的速度。 Unicad 和 Mozilla 语言/编码识别扩展有什么不同?虽然 Unicad 是基于 Mozilla 语言/编码识别扩展的,但还是有一些不同之处:
|
http://edyfox.codecarver.org/html/vim_fileencodings_detection.html
在 Vim 中,有四个与编码有关的选项,它们是:fileencodings
、fileencoding
、encoding
和 termencoding
。在实际使用中,任何一个选项出现错误,都会导致出现乱码。因此,每一个 Vim 用户都应该明确这四个选项的含义。下面,我们详细介绍一下这四个选项的含义和作用。
1 encoding
encoding
是 Vim 内部使用的字符编码方式。当我们设置了 encoding
之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim 在工作的时候,如果编码方式与它的内部编码不一致,它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。
由于 encoding
选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改encoding
会造成非常多的问题。如果没有特别的理由,请始终将 encoding
设置为 utf-8
。为了避免在非 UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置:
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
2 termencoding
termencoding
是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding
没有设置,则直接使用encoding
不进行转换。
举个例子,当你在 Windows 下通过 telnet 登录 Linux 工作站时,由于 Windows 的 telnet 是 GBK 编码的,而 Linux 下使用 UTF-8 编码,你在 telnet 下的 Vim 中就会乱码。此时有两种消除乱码的方式:一是把 Vim 的 encoding
改为 gbk
,另一种方法是保持 encoding
为 utf-8
,把 termencoding
改为 gbk
,让 Vim 在显示的时候转码。显然,使用前一种方法时,如果遇到编辑的文件中含有 GBK 无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。
对于图形界面下的 GVim,它的显示不依赖 TERM,因此 termencoding
对于它没有意义。在 GTK2 下的 GVim 中,termencoding
永远是 utf-8
,并且不能修改。而 Windows 下的 GVim 则忽略 termencoding
的存在。
3 fileencoding
当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding
选项设置为文件的编码。当 Vim 存盘的时候,如果 encoding
和fileencoding
不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding
,我们可以将文件由一种编码转换为另一种编码。但是,由前面的介绍可以看出,fileencoding
是在打开文件的时候,由 Vim 进行探测后自动设置的。因此,如果出现乱码,我们无法通过在打开文件后重新设置 fileencoding
来纠正乱码。
4 fileencodings
编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding
设置为这个值,如果失败的话,就继续试验下一个编码。
因此,我们在设置 fileencodings
的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。
例如,latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。因此,如果你把 latin1
放到了 fileencodings
的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。
以下是滇狐推荐的一个 fileencodings
设置:
其中,ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为 ucs-bom,因此放在第一位。
utf-8 也相当严格,除了很短的文件外(例如许多人津津乐道的 GBK 编码的“联通”被误判为 UTF-8 编码的经典错误),现实生活中一般文件是几乎不可能被误判的,因此放在第二位。
接下来是 cp936 和 gb18030,这两种编码相对宽松,如果放前面的话,会出现大量误判,所以就让它们靠后一些。cp936 的编码空间比 gb18030 小,所以把 cp936 放在 gb18030 前面。
至于 big5、euc-jp 和 euc-kr,它们的严格程度和 cp936 差不多,把它们放在后面,在编辑这些编码的文件的时候必然出现大量误判,但这是 Vim 内置编码探测机制没有办法解决的事。由于中国用户很少有机会编辑这些编码的文件,因此我们还是决定把 cp936 和 gb18030 前提以保证这些编码的识别。
最后就是 latin1 了。它是一种极其宽松的编码,以至于我们不得不把它放在最后一位。不过可惜的是,当你碰到一个真的 latin1 编码的文件时,绝大部分情况下,它没有机会 fall-back 到 latin1,往往在前面的编码中就被误判了。不过,正如前面所说的,中国用户没有太多机会接触这样的文件。
如果编码被误判了,解码后的结果就无法被人类识别,于是我们就说,这个文件乱码了。此时,如果你知道这个文件的正确编码的话,可以在打开文件的时候使用 ++enc=encoding
的方式来打开文件,如:
:e ++enc=utf-8 myfile.txt
5 fencview
根据前面的介绍,我们知道,通过 Vim 内置的编码识别机制,识别率是很低的,尤其是对于简体中文 (GBK/GB18030)、繁体中文 (Big5)、日文 (euc-jp) 和韩文 (euc-kr) 之间的识别。而对于普通用户而言,肉眼看出一个文件的编码方式也是很不现实的事情。因此,滇狐强烈推荐水木社区的 mbbill 开发的 fencview 插件。该插件使用词频统计的方式识别编码,正确率非常高。点击这里 下载。
http://cels.me/blog/2013/05/01/emacs-auto-determine-gb18030/
emacs 自动检测文档编码
前段时间从网上下了个 文档, 由于 文档编码为 gb18030
, emacs 默认以 utf-8
编码方式打开文档, 所以出现的尽是乱码.
采用正确编码重载文档
emacs
提供了选择文档编码的命令: revert-buffer-with-coding-system
.
M-x revert-buffer-with-coding-system gb18030
, 之后 emacs
就会以 gb18030 encoding
重新加载文档.
不幸的是, 虽然现在文件编码已经正确, 可是有些中文, 却意外得变成了方块.
后来在终于在 emacser 找到了解决的方法.
emacs
添加如下配置:
1 2 3 4 5 6 |
|
:family
选择自己喜欢的中文字体即可.
自动选取对应编码打开文档
其实 emacs
在打开文档的时候, 会自动检测并选取对应的编码,
可是 emacs
对中文编码检测的优先级较低, 于是 gb18030
编码往往会识别成其他的编码形式.
使用 C-h C
命令, 可以查看当前文档使用的编码以及 emacs
自动识别编码的优先级.
当然我们可以自己配置 emacs
编码优先级:
1 2 |
|
prefer-coding-system
命令的作用是将 选定的编码 设置为最高优先级.
如此配置之后, 使用 emacs
处理 gb18030
编码就方便许多了.
https://groups.google.com/forum/#!topic/cn.bbs.comp.emacs/zbctuRJZZZo
装个自动识别编码的插件unicad
http://bbs.chinaunix.net/thread-2006256-1-1.html
emacs 和X程序间粘贴复制乱码解决方法
2007-05-17 07:37(一)今天终于解决了emacs中文乱码问题
历经沧桑。
过程 :
1 开始以为是因为clipboard的问题就修改
(set-clipboard-coding-system 'ctext)
(set-clipboard-coding-system 'chinese-gb2312)
都不能解决问题
2后来发现
在http://www.linuxsir.org/bbs/showthread.php?t=237956中有:
除了转换非 ASCII 字符的不同表示之外,编码系统还进行换行符的转换。Emacs 处理三种文件中换行的方式:新行符,回车换行,或者仅仅回车。
C-h C coding
描述编码系统 coding
C-h C
描述当前使用的编码系统
M-x list-coding-systems
显示所有支持的编码系统的列表
命令 C-h C(describe-coding-system) 显示特定编码系统的信息。您可以指定编码系统名称作为参数;或者,不指定参数,它将描述当前使用的各种编码系统,包括当前缓冲区、默认值,以及识别编码系统的优先级列表(参见识别编码)。
要显示所有支持的编码系统,输入 list-coding-systems。列表中包含了各种编码系统的信息,包括用在状态行中的代表字母(参见状态行)。
当 Emacs 无法自动选择正确的编码系统时,您可以用这些命令来指定一个:
C-x f coding
使用编码系统 coding 来查看当前缓冲区中的文件。
C-x c coding
指定下一个命令的编码系统为 coding。
C-x k coding
设置键盘输入的编码系统为 coding。
C-x t coding
设置终端输出的编码系统为 coding。
C-x p input-coding output-coding
使用编码系统 input-coding 和 output-coding 作为当前缓冲区中子进程的输入和输出。
C-x x coding
在窗口系统中与其它程序传递选中文本时使用编码系统 coding。
C-x X coding
在窗口系统中与其它程序传递下一次选中文本时(仅一次)使用编码系统 coding。
经过复制网页的文本到emacs发现开始不能识别,保存时还提示找不到合适的coding(prefer 中设置的)。保存后再打开时就正确了。通过C-h C 查寻该缓冲区的字符编码。发现是iso-2022-8bit-ss2-unix 的,而prefer中没有设置该项。
通过增加prefer coding后。保存时,果然没有提示了。
但还是出现粘贴的时候是乱码。必须保存后才可以。(这时我都有写一个函数的想法了)
3 还有几个参数没有设置,
set-buffer-file-coding-system
set-selection-coding-system
setq default-process-coding-syste
分别设置了一下发现是set-selection-coding-system 是原因所在。
设置了
(set-selection-coding-system 'iso-2022-8bit-ss2-dos)
(set-clipboard-coding-system 'iso-2022-8bit-ss2-dos)
后果然就ok了
其实(set-selection-coding-system ) 与 (set-clipboard-coding-system )都是指定一个值,设定一个就可以了。如果两个都设置了,就不要矛盾。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/17248/showart_1783772.html
#################################################################
http://kittenll.blog.163.com/blog/static/6180062420127252039842
Emacs只能指定新建buffer的默认编码,和读取文件时候的编码寻找顺序。文件写入编码 Emacs会根据文件内容来猜测,并保持原有的编码不变。如想改变写入编码,需手动改变。
(set-buffer-file-coding-system 'utf-8-unix) ;;指定当前buffer的写入编码,只对当前buffer有效,即此命令写在配置文件中无效,只能 通过M-x来执行 (setq default-buffer-file-coding-system 'utf-8-unix) ;;指定新建buffer的默认编码为utf-8-unix,换行符为unix的方式 (prefer-coding-system 'utf-8) ;;将utf-8放到编码顺序表的最开始,即先从utf-8开始识别编码,此命令可以多次使用,后 指定的编码先探测 (set-language-environment 'utf-8) ;;指定Emacs的语言环境,按照特定语言环境设置前面的两个变量
Windows默认情况下,可以识别中文,也可以输入中文,但是新建文件的编码为 chinese-gbk-dos,为了改为utf-8,并且换行符为unix格式,在配置文件中加入下面这行。
(setq default-buffer-file-coding-system 'utf-8-unix)
附上手动修改编码的方法:
- M-x set-buffer-file-coding-system coding 保存后,文件即是coding编码
- C-x RET f coding 保存后,文件为coding编码
- C-x RET r coding 以coding编码重新读取文件
- C-x RET c coding 以coding编码执行接下去输入的命令,如
C-x <RET> c utf-8 <RET> C-x C-f a.txt <RET> 用utf-8编码打开a.txt文件
thanks!
阁下功德无量!彻底解决了一直困扰在下的emacs编码问题!
一个问题,当启用 unicad 时候,如果新建一个文件,写入两个中文字符: "起点" ,保存退出再重新打开就是乱码。 实现步骤:
~/.emacs 文件中加入如下配置:
(add-to-list 'load-path "~") (require 'unicad)
打开 emacs ,确保正确加载了 unicad ,新建一个文件,仅仅输入两个中文字符“起点”。保存退出再重新打开即可见到乱码。
严重感谢.
如何在打开文件的标题栏或buffer状态栏位置显示文件当前的编码呢?
阁下功德无量!
thanks.
我遇到了和(lijian....@gmail.com, Mar 31, 2010)一样的问题,我测试好像只要是cp936编码的,好像都认不出来。