18

我使用 Emacs/ESS 已经有一段时间了,我熟悉Hadley 的 R 风格推荐。我想在 ESS 中遵循这些约定,比如运算符周围的漂亮空格、逗号和if语句之后的空格、大括号之前的空格等。

有没有人费心去遵循这个风格指南?恕我直言,官方的风格建议是相当谦虚的,他们对风格只字未提。Google R 风格指南与我在 JavaScript 中编码时使用的风格指南太相似了,所以这是一个禁忌。

长话短说:是否有具有 (e)LISP 技能的人愿意为 ESS 实施(Hadley 的)风格指南?

4

5 回答 5

29

我不写 Elisp,我不同意 Hadley 关于下划线的风格优点。此外,Hadley 仍然迷失在不使用OneTrueEditor的沙漠中,因此我们不能指望他在这个问题上提供任何帮助。

但是,如果您愿意遵循 R Core 而不是 Hadley,以下是R Internals 手册第 8 节“R 编码标准”的建议。对我来说,首先定义 R 风格的是 R Core。Google 和 Hadley 的风格是不错的次要推荐。

无论如何,回到 Elisp。以下内容多年来一直为我们服务,我确实喜欢基本的 R 行为类似于 Emacs C++ 风格的事实,因为我碰巧经常查看两种模式下的代码。

[...]

以允许其他人理解的方式编写代码也很重要。这对于解决问题特别有用,包​​括使用自我描述的变量名称、注释代码以及正确格式化代码。R 核心团队建议对 R 和 C(很可能还有 Perl)代码使用基本缩进 4,对 Rd 格式的文档使用 2。Emacs(21 或更高版本)用户可以通过将以下内容放入他们的一个启动文件中来实现这种缩进样式,并使用自定义设置c-default-style' to“bsd”'和c-basic-offset' to4'。)

 ;;; ESS
 (add-hook 'ess-mode-hook
           (lambda ()
             (ess-set-style 'C++ 'quiet)
             ;; Because
             ;;                                 DEF GNU BSD K&R  C++
             ;; ess-indent-level                  2   2   8   5  4
             ;; ess-continued-statement-offset    2   2   8   5  4
             ;; ess-brace-offset                  0   0  -8  -5 -4
             ;; ess-arg-function-offset           2   4   0   0  0
             ;; ess-expression-offset             4   2   8   5  4
             ;; ess-else-offset                   0   0   0   0  0
             ;; ess-close-brace-offset            0   0   0   0  0
             (add-hook 'local-write-file-hooks
                       (lambda ()
                         (ess-nuke-trailing-whitespace)))))
 (setq ess-nuke-trailing-whitespace-p 'ask)
 ;; or even
 ;; (setq ess-nuke-trailing-whitespace-p t)
 ;;; Perl
 (add-hook 'perl-mode-hook
           (lambda () (setq perl-indent-level 4)))

(Emacs 的 C 和 R 模式的 `GNU' 样式使用基本缩进 2,这已被确定为在使用窄字体时不能足够清楚地显示结构。)

我认为我经常做的唯一补充是遵循最后一个注释掉的片段:

;; or even
(setq ess-nuke-trailing-whitespace-p t)

如果您确实需要使用下划线进行编码,您当然可以关闭下划线切换。

于 2011-09-21T15:44:18.003 回答
22

使用 ESS 的开发版本(将于 2015 年 9 月发布),只需添加ess-mode-hook

(ess-set-style 'RStudio)

RStudio 还有一个默认设置的“垂直对齐参数”复选框。如果您想在未选中此设置时重现该行为(如在 Hadley 的代码中),您需要更改ess-offset-argumentsprev-line

(setq ess-offset-arguments 'prev-line)

如果您发现 ESS 和 RStudio 缩进之间存在重要差异,请在https://github.com/emacs-ess/ESS上提出问题。

于 2014-08-09T13:26:39.483 回答
6

Hadley 指南的优点是在运算符周围间隔(除了 / 周围)

有一个smart-operator包可以为几乎每个操作员实现它。

这是我的设置(您要使用的取消注释运算符):

(setq smart-operator-mode-map
  (let ((keymap (make-sparse-keymap)))
    (define-key keymap "=" 'smart-operator-self-insert-command)
    ;; (define-key keymap "<" 'smart-operator-<)
    ;; (define-key keymap ">" 'smart-operator->)
    ;; (define-key keymap "%" 'smart-operator-%)
    (define-key keymap "+" 'smart-operator-+)
    ;; (define-key keymap "-" 'smart-operator--)
    ;; (define-key keymap "*" 'smart-operator-*)
    ;; (define-key keymap "/" 'smart-operator-self-insert-command)
    (define-key keymap "&" 'smart-operator-&)
    (define-key keymap "|" 'smart-operator-self-insert-command)
    ;; (define-key keymap "!" 'smart-operator-self-insert-command)
    ;; (define-key keymap ":" 'smart-operator-:)
    ;; (define-key keymap "?" 'smart-operator-?)
    (define-key keymap "," 'smart-operator-,)
    ;; (define-key keymap "." 'smart-operator-.)
    keymap)
  "Keymap used my `smart-operator-mode'.")

另请参阅此处关于 R 样式的精彩讨论。

[编辑] 我也使用 R 代码的 defacto camelCase 样式作为全局变量。局部变量的下划线分隔名称 - 很容易区分。

emacs 中有一种特殊subword模式,它重新定义了所有用于大写子词的编辑和导航命令

(global-subword-mode)
于 2011-10-25T14:30:25.493 回答
4

具有与 OP 相同的风格偏好,我跳到这里,感谢@lionel 的有效建议,但我在设置 RStudio 风格时遇到了问题~/emacs.d/init.el

(ess-set-style 'RStudio)

Emacs/ESS 拒绝应用该样式(4 个空格缩进而不是 2 个空格,这里不讨论样式:))。

我对新手的建议,在您的 中使用以下钩子~/emacs.d/init.el

(add-hook 'find-file-hook 'my-r-style-hook)
(defun my-r-style-hook ()
  (when (string-match (file-name-extension buffer-file-name) "[r|R]$")
    (ess-set-style 'RStudio)))

会成功的。

于 2016-01-19T09:29:27.330 回答
1

到目前为止还没有在这里介绍的样式指南的另一个组成部分是当函数运行在多行时的缩进。样式指南说要使用缩进

long_function_name <- function(a = "a long argument", 
                               b = "another argument",   # X
                               c = "another long argument") {
  # As usual code is indented by two spaces.
}

但是使用任何默认样式似乎都会将行缩进X一些固定数量的空格,而不是最多(. 解决方案是设置 ess-arg-function-offset为一些非数字,例如

(set 'ess-arg-function-offset t)

这应该放在类似于@Dirk Eddelbuettel 的答案的模式挂钩中。此外,它必须任何调用之后进行,ess-set-style否则它将被覆盖。

于 2015-03-10T17:00:57.943 回答