首先,您需要学习使用 emacs 操作的基本文本。由于 emacs 非常复杂,因此找出如何简单地选择文本和复制可能是一个挑战。因此,花一些时间来找出如何有效地做到这一点。阅读手册可能会有所帮助。对于 Mac OS X 使用 Aquamacs,它支持原生快捷方式。
使用 ESS 与使用 R 没有区别。应该适用相同的代码组织规则。在我的例子中,每个项目都有自己的目录,它位于名为 R 的父目录中,它位于我的主目录中(对于 Windows,我建议将 emacs 主目录指向所有源代码所在的目录)。因此,当我使用 ESS 处理项目时,我总是这样做M-x R并选择我的项目目录的起始目录。
启动 R 进程后,我通常将 emacs 分为两个窗口(emacs 术语)。然后在左边我有一个源代码,我将它发送到右边的 R 进程。相关的快捷方式(这些是 emacs 快捷方式)C-x 3用于垂直拆分窗口、C-x 1使当前缓冲区成为唯一窗口以及C-x 2水平拆分窗口。
在向 R 发送代码时,我会区分函数和 R 语句。为此,我将所有函数保存在一个通常称为10code.R. 然后我可以使用加载 ESS 文件选项(快捷方式C-c C-l)简单地加载此文件。这种方法的优点是它获取所有函数并且在 R 缓冲区中不产生任何内容。如果您的代码中有错误,那么 ESS 会在 minibuffer 中显示一条消息,您可以通过按C-c` 进行调查。
另一个代码是 R 语句,我尽量保持不言自明:加载数据、清理数据、拟合统计模型、检查结果、生成最终结果。这些语句的源代码是项目的当前状态。目的是在项目完成后,使用此代码获取文件,重现项目(我也使用 git 来跟踪历史记录)。在处理这个文件时,我通常只使用一个 R 语句,我通过 eval 函数、段落、语句命令将其发送到 R 进程,快捷方式是C-c C-c. 该命令将段落发送给 R 处理,即由换行符分隔的文本。这很方便,因为您可以将 R 语句分组到任务中,并将整个任务发送到 R 进程。它也不需要选择文本,这也很方便。捷径C-c C-c优点是将光标移动到 R 窗口,因此您可以立即检查发送的 R 语句的结果。
所以我的基本工作流程在窗口和缓冲区之间移动了很多。为方便起见,我在 .emacs 文件中使用了以下快捷方式:
(define-key global-map [f1] 'Control-X-prefix)
(define-key global-map [f3] 'find-file)
(define-key global-map [f2] 'save-buffer)
(define-key global-map [f8] 'kill-buffer)
(define-key global-map [f5] 'switch-to-buffer)
(define-key global-map [f6] 'other-window)
(define-key global-map [f9] 'ess-load-file)
我很少使用f1,但其他所有的都非常频繁。我使用的其他特定 ESS 设置如下:
(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)
这告诉 ESS 将制表符设为 4 个字符宽(默认为 2 个),这是我个人的偏好,并扩展了 ESS 保存为历史记录的您发出的命令的数量。
对于直接使用 R 进程,我发现以下快捷方式非常有用:
(add-hook 'inferior-ess-mode-hook
'(lambda nil
(define-key inferior-ess-mode-map [\C-up] 'comint-previous-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-down] 'comint-next-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-x \t] 'comint-dynamic-complete-filename)
)
)
这会从您的 R 语句历史记录中调用 R 语句,但它会尝试将其与您的行中已经存在的语句相匹配。因此,例如输入plR 进程并按下\C-up(即控制和向上箭头)将循环浏览所有以 开头的语句pl,因此将调用例如所有plot(...命令。
我与 ESS 一起使用的最终设置如下:
(setq ess-ask-about-transfile t)
这样,ESS 总是询问将文本保存在 R 进程的缓冲区中的哪个位置。我通常根据日期对这些文件进行编号,所以我总是有另一种方法来跟踪我到底在做什么。此选项的唯一警告是,出于某种原因,ESS 在加载 R 后将 R 缓冲区设置为只读。使缓冲区可写的快捷方式是C-x C-q.
因此,这些是我用于与 ESS 合作的设置,我对它们感到满意,而且几年来我觉得不需要添加任何东西。在向初次使用 ESS 的用户介绍 ESS 时,我通常会给出这个概述。
我将以最后一个快捷方式结束,这对我来说是使用 Emacs 时最常用的快捷方式,尤其是使用 ESS 时,C-g它会退出迷你缓冲区中的命令。在我使用 Emacs 和 ESS 的这些年里,我仍然设法调用了一些我不想要的 Emacs 命令,C-g在这些情况下非常有帮助。