让Emacs ESS遵循R风格指南

aL3*_*3xa 15 emacs coding-style elisp r ess

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

是否有人甚至不愿意遵循这种风格指南?恕我直言,官方风格的建议相当谦虚,他们对风格一无所知.Google R风格指南与我在JavaScript中编码时使用的类似,所以这是禁忌.

长话短说:有没有(e)LISP技能愿意为ESS实施(哈德利)风格指南的人?

Dir*_*tel 24

我不写Elisp,我不同意Hadley关于下划线的风格优点.此外,Hadley仍然在不使用OneTrueEditor的沙漠中迷失,所以在这个问题上我们可以期待他没有这方面的帮助.

但是如果您愿意跟随R Core而不是Hadley,下面是R Internals手册,第8节"R编码标准"的建议.对我而言,R Core首先定义R风格.谷歌和哈德利的风格是很好的辅助推荐.

无论如何,回到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)))
Run Code Online (Sandbox Code Playgroud)

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

我认为我经常添加的唯一补充是遵循最后一个已注释掉的代码段:

;; or even
(setq ess-nuke-trailing-whitespace-p t)
Run Code Online (Sandbox Code Playgroud)

如果你真的需要用下划线编码,你当然可以关闭下划线切换.

  • +1我和Hadley在同一个沙漠中迷路了,但是我会给你+1链接到XKCD. (6认同)
  • 啊,这一切都只是友好的混蛋.我几乎和下一个人一样爱Hadley,但是下划线仍然让我在晚上保持清醒.更不用说ggplot中的柔和色彩了.哎哟. (3认同)
  • [我无法抗拒......](http://www.cs.bgu.ac.il/~orlovm/code/emacs/viman.gif) (3认同)
  • ==:-) 我知道有人会从中受益。无论如何,编辑战争和风格问题都是个人的方式,需要认真对待。也就是说,是时候切换到 Emacs 了,孩子!;-) (2认同)
  • 也就是说,我会为*某人*为他的风格和/或谷歌编写ESS设置.越多越好.在此之前,我对R Core所提供的内容非常满意. (2认同)
  • @Andrie,起初看起来似乎势不可挡,但过了一段时间你会习惯这个......该死的,你甚至会开始自己添加!!! =) (2认同)

Lio*_*nry 17

随着ESS的开发版本(将于2015年9月发布),只需添加到您的ess-mode-hook:

(ess-set-style 'RStudio)
Run Code Online (Sandbox Code Playgroud)

RStudio还有一个默认设置的"垂直对齐参数"复选框.如果要在未选中此设置时重现行为(如Hadley的代码中所示),则需要更改ess-offset-argumentsprev-line:

(setq ess-offset-arguments 'prev-line)
Run Code Online (Sandbox Code Playgroud)

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


Vit*_*hKa 5

Hadley指南的优点是在运算符之间隔开(可能在/周围)

有一个智能操作员程序包,几乎可以为每个操作员实施。

这是我的设置(您要使用不常用的运算符):

(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'.")
Run Code Online (Sandbox Code Playgroud)

这里也可以看到有关R样式的精彩讨论。

[编辑]我也正在使用全局代码的defacto camelCase风格的R代码。下划线分隔的局部变量名称-易于区分。

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

(global-subword-mode)
Run Code Online (Sandbox Code Playgroud)