【问题标题】:Make Emacs ESS follow R style guide使 Emacs ESS 遵循 R 风格指南
【发布时间】:2011-09-21 15:35:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: r emacs coding-style elisp ess


    【解决方案1】:

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

    但如果您愿意关注 R Core 而不是 Hadley,以下是 R Internals manual, section 8. "R Coding Standards" 的建议。对我来说,首先定义 R 风格的是 R Core。 Google 和 Hadley 的风格是不错的次要推荐。

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

    [...]

    同样重要的是,代码的编写方式允许 别人理解它。这对于修复特别有帮助 问题,包括使用自我描述的变量名, 注释代码,并正确格式化。 R核心团队 建议对 R 和 C 使用基本缩进 4(以及大多数 可能还有 Perl) 代码,以及 2 用于 Rd 格式的文档。 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、已确定不清晰显示结构 使用窄字体就足够了。)

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

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

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

    【讨论】:

    • +1 我和 Hadley 在同一个沙漠中迷路了,但我会给你 +1 链接到 XKCD。
    • ==:-) 我知道有人会从中受益。无论如何,编辑器之争和风格问题都是个人的方式,需要认真对待所有。也就是说,是时候切换到 Emacs 了,儿子! ;-)
    • 啊,这只是友好的开玩笑。我几乎和下一个人一样爱哈德利,但下划线仍然让我夜不能寐。更不用说 ggplot 中的柔和颜色了。哎哟。
    • 也就是说,我完全支持某人为他的风格和/或谷歌的风格编写 ESS 设置。越多越好。在那之前,我对 R Core 提供的东西相当满意。
    • @Andrie,一开始可能会让人不知所措,但一段时间后你会习惯的......该死的,你甚至会开始添加自己的! =)
    【解决方案2】:

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

    (ess-set-style 'RStudio)
    

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

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

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

    【讨论】:

      【解决方案3】:

      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 样式的精彩讨论 here

      [编辑] 我还在使用 R 代码的事实上的 camelCase 样式来处理全局变量。局部变量的下划线分隔名称 - 很容易区分。

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

      (global-subword-mode)
      

      【讨论】:

      【解决方案4】:

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

      (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)))
      

      会成功的。

      【讨论】:

      • 回到 Lionel 的回答,它对我很有效。你检查了ess-style 变量吗?只需输入M-: ess-style 即可获得Rstudio 风格。
      • 无视我的回答!我没有正确设置ess-mode-hook。我的解决方案只是添加了一个钩子来打开所有以[r|R] 结尾的文件
      【解决方案5】:

      样式指南的另一个组件,到目前为止还没有在这里介绍 当函数在多行上运行时是缩进。风格指南 说像使用缩进一样

      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 缩进一些固定的 空格数而不是(。解决方法是set ess-arg-function-offset to some non-number,例如

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 2013-12-07
        • 2017-11-26
        • 2011-01-13
        相关资源
        最近更新 更多