【问题标题】:Why does my ESS R session fall back to C locale?为什么我的 ESS R 会话回退到 C 语言环境?
【发布时间】:2015-07-27 16:11:30
【问题描述】:

我在运行 Emacs 24.5 和 R 3.2 的 OSX Yosemite 上

我的 ~/.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 时没有出现问题,这导致我找到了解决方案,见下文

标签: r macos emacs environment-variables ess


【解决方案1】:

好的,所以问题不在 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>

(当然并非所有变量都是严格要求的)

【讨论】:

  • 只在 emacs 上设置变量就可以解决问题吗?像这样 ";; -- 环境设置 (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")
【解决方案2】:

我刚发现你只需要添加

(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")) 对我有用。
猜你喜欢
  • 2021-10-08
  • 2012-10-04
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多