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

5

我正在运行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 字符都会导致错误,使其格式不正确。我该如何设置正确的语言环境?


当从终端运行Emacs时,问题不会出现,这导致我找到了解决方案,请参见下文。 - kliron
2个回答

6

好的,问题不在于Emacs、ESS或R,而是在于OSX通过launchd启动的进程不会继承.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>

当然,并不是所有变量都是严格要求的。


只需在emacs上设置变量就可以了吗?像这样 ";; -- environment set (setenv "LANG" "UTF-8") (setenv "LC_CTYPE" "UTF-8") (setenv "LC_NUMERIC" "UTF-8") (setenv "LC_TIME" "UTF-8") (setenv "LC_COLLATE" "UTF-8") (setenv "LC_MONETARY" "UTF-8") (setenv "LC_MESSAGES" "UTF-8") - Emmanuel Goldstein

3
我刚刚发现,您只需添加
(unless (getenv "LANG") (setenv "LANG" "en_US.UTF-8"))

将以下内容添加到您的.emacs.el文件中。
如果尚未设置,这将在emacs中设置环境变量LANG。这似乎是R所需的全部。
这是一种非常不具侵入性的方法,并且可以在emacs中使用。

添加额外的 (unless (getenv "LC_ALL") (setenv "LC_ALL" "en_US.UTF-8")) 对我来说是有效的。 - Fangquan Shi

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