18

私はかなり長い間 Emacs/ESS を使用しており、Hadley の R スタイルの推奨事項に精通しています。ifESS では、演算子の前後の適切なスペース、コンマの後とステートメントの後、中かっこの前のスペースなど、これらの規則に従いたいと思います。

誰かがこのスタイルガイドに従うことを気にしましたか? IMHO、公式のスタイルの推奨事項は非常に控えめであり、スタイルについては何も述べていません. Google R のスタイル ガイドは、私が JavaScript でコーディングするときに使用するスタイル ガイドとあまりにも似ているため、ダメです。

簡単に言うと、(e)LISP のスキルを持ち、(Hadley の) ESS のスタイル ガイドを喜んで実装する人はいますか?

4

5 に答える 5

29

私は Elisp を書いていませんし、アンダースコアの文体上の利点について Hadley に同意しません。さらに、Hadley はまだOneTrueEditorを使用しないという砂漠で迷子になっているため、この問題について彼からの助けは期待できません。

ただし、Hadley ではなく R Core に従うことにオープンな場合は、R Internals マニュアルのセクション 8.「R コーディング標準」が推奨する内容を以下に示します。私にとって、R スタイルを最初に定義するのは R Core です。Google と Hadley のスタイルは、二次的な推奨事項として優れています。

とにかく、Elispに戻ります。以下は長年にわたって私たちに役立ってきました.Rの基本的な動作がEmacs C++スタイルに似ているという事実が気に入っています.

[...]

また、コードを他の人が理解できるように記述することも重要です。これは、問題の修正に特に役立ちます。自己記述的な変数名の使用、コードへのコメント、適切なフォーマットも含まれます。R コア チームは、R および C (およびほとんどの場合 Perl) コードには基本的なインデント 4 を使用し、Rd 形式のドキュメントには 2 を使用することを推奨しています。Emacs (21 以降) のユーザーは、スタートアップ ファイルの 1 つに以下を記述し、カスタマイズを使用して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-argumentsする必要がありprev-lineます。

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

ESS と RStudio のインデントの間に重大な不一致が見つかった場合は、https://github.com/emacs-ess/ESSで問題を報告してください。

于 2014-08-09T13:26:39.483 に答える
6

ハドリーのガイドの良い点は、演算子の周りに間隔を空けていることです (おそらく / の周りを除く)

ほぼすべてのオペレーターにそれを実装する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 コードの事実上の camelCase スタイルを使用しています。アンダースコアで区切られたローカル変数の名前 - 簡単に区別できます。

subwordemacs には、すべての編集コマンドとナビゲーション コマンドを大文字のサブワードで使用するように再定義する特別なモードがあります。

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

OPのスタイル設定が同じであるため、ここにジャンプし、有効な提案をしてくれた@lionelに感謝しますが、RStudioスタイルを次のように設定すると問題が発生しまし~/emacs.d/init.elた:

(ess-set-style 'RStudio)

Emacs/ESS はスタイルの適用を拒否しました (2 スペースの代わりに 4 スペースのインデント、ここではスタイルについて議論していません :))。

あなたので次のフックを使用して、初心者のための私のアドバイス~/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

ここで取り上げられていないスタイル ガイドのもう 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 に答える