我在OSX Yosemite上运行Emacs 24.5和R 3.2
我在〜/ .bash_profile中有这个:
export LANG=en_US.UTF-8
export LANGUAGE=en_US:en
export LC_CTYPE="en_US.UTF-8"
export LC_NUMERIC="en_US.UTF-8"
export LC_TIME="en_US.UTF-8"
export LC_COLLATE="en_US.UTF-8"
export LC_MONETARY="en_US.UTF-8"
export LC_MESSAGES="en_US.UTF-8"
export LC_PAPER="en_US.UTF-8"
export LC_NAME="en_US.UTF-8"
export LC_ADDRESS="en_US.UTF-8"
export LC_TELEPHONE="en_US.UTF-8"
export LC_MEASUREMENT="en_US.UTF-8"
export LC_IDENTIFICATION="en_US.UTF-8"
export LC_ALL=en_US.UTF-8
这在我的emacs设置中:
(setq current-language-environment "UTF-8")
(add-hook 'ess-R-post-run-hook
(lambda () (set-buffer-process-coding-system
'utf-8-nfd-unix 'utf-8-nfd-unix)))
我甚至在系统范围内设置了以下内容:
defaults write org.R-project.R force.LANG en_US.UTF-8
当我从命令行或RStudio运行R时,它使用正确的语言环境。当我在emacs中运行R进程时,我收到以下警告:
During startup - Warning messages:
1: Setting LC_CTYPE failed, using "C"
2: Setting LC_COLLATE failed, using "C"
3: Setting LC_TIME failed, using "C"
4: Setting LC_MESSAGES failed, using "C"
5: Setting LC_MONETARY failed, using "C"
任何非ASCII字符都会出错,从而产生错误。如何设置正确的区域设置?
答案 0 :(得分:3)
好的,问题不在于Emacs,ESS或R,而是在通过launchd启动的OSX进程中,不会继承.profile,.bash_profile或.bashrc中的任何环境变量。相反,必须通过launchd设置环境。
这样做解决了我的问题:
/bin/launchctl setenv LANG en_US.UTF-8
/bin/launchctl setenv LC_ALL en_US.UTF-8
/bin/launchctl setenv LC_CTYPE en_US.UTF-8
/bin/launchctl setenv LC_COLLATE en_US.UTF-8
/bin/launchctl setenv LC_MESSAGES en_US.UTF-8
/bin/launchctl setenv LC_TIME en_US.UTF-8
/bin/launchctl setenv LC_MONETARY en_US.UTF-8
要在重新启动后保留环境变量,请在/Library/LaunchDaemons/中添加一个条目(OSX> 10.9)。 对于早期版本,请将其添加到/etc/launchd.conf中。
以上将为通过launchd启动的所有进程设置环境变量。如果不希望这样,可以编辑单个.app文件中的Info.plist文件,并使用键LSEnvironment
例如,要解决Emacs中的问题,我编辑了文件:
/usr/local/Cellar/emacs/24.5/Emacs.app/Contents/Info.plist
在顶级字典中添加以下条目:
<key>LSEnvironment</key>
<dict>
<key>LANG</key>
<string>en_US.UTF-8</string>
<key>LC_ALL</key>
<string>en_US.UTF-8</string>
<key>LC_CTYPE</key>
<string>en_US.UTF-8</string>
<key>LC_COLLATE</key>
<string>en_US.UTF-8</string>
<key>LC_PAPER</key>
<string>en_US.UTF-8</string>
<key>LC_ADDRESS</key>
<string>en_US.UTF-8</string>
<key>LC_MONETARY</key>
<string>en_US.UTF-8</string>
<key>LC_NUMERIC</key>
<string>en_US.UTF-8</string>
<key>LC_TELEPHONE</key>
<string>en_US.UTF-8</string>
<key>LC_MESSAGES</key>
<string>en_US.UTF-8</string>
<key>LC_IDENTIFICATION</key>
<string>en_US.UTF-8</string>
<key>LC_MEASUREMENT</key>
<string>en_US.UTF-8</string>
<key>LC_TIME</key>
<string>en_US.UTF-8</string>
<key>LC_NAME</key>
<string>en_US.UTF-8</string>
</dict>
(当然并非所有变量都是严格要求的)
答案 1 :(得分:2)
我刚刚发现你只需要添加
(unless (getenv "LANG") (setenv "LANG" "en_US.UTF-8"))
到您的.emacs.el文件。
如果尚未设置,则在emacs中设置环境变量LANG
。这似乎是R所需要的全部。
这是一种不那么具有侵入性的方法,可以在emacs中使用。