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' to
4' 来实现此缩进样式.)Run Code Online (Sandbox Code Playgroud);;; 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)
Run Code Online (Sandbox Code Playgroud)
如果你真的需要用下划线编码,你当然可以关闭下划线切换.
Lio*_*nry 17
随着ESS的开发版本(将于2015年9月发布),只需添加到您的ess-mode-hook
:
(ess-set-style 'RStudio)
Run Code Online (Sandbox Code Playgroud)
RStudio还有一个默认设置的"垂直对齐参数"复选框.如果要在未选中此设置时重现行为(如Hadley的代码中所示),则需要更改ess-offset-arguments
为prev-line
:
(setq ess-offset-arguments 'prev-line)
Run Code Online (Sandbox Code Playgroud)
如果您发现ESS和RStudio缩进之间存在重大差异,请在https://github.com/emacs-ess/ESS上提交问题.
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代码。下划线分隔的局部变量名称-易于区分。
subword
emacs中有一个特殊的模式,它重新定义了所有用于大写子词的编辑和导航命令
(global-subword-mode)
Run Code Online (Sandbox Code Playgroud)