为什么我的ESS R会话回退到C语言环境?

时间:2015-05-15 16:33:33

标签: r macos emacs environment-variables ess

我在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字符都会出错,从而产生错误。如何设置正确的区域设置?

2 个答案:

答案 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

将变量设置为dict中的键值

例如,要解决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中使用。