Сделать Emacs ESS следовать R руководство по стилю

Я использую Emacs/ESS довольно долго, и я знаком с рекомендации стиля R Хэдли. Я хотел бы следовать этим соглашениям в ESS, как те хорошие пространства вокруг операторов, пространство после запятой и после if заявление, перед фигурными скобками и т. д.

кто-нибудь вообще потрудился следовать этому руководству по стилю? ИМХО, официальные рекомендации по стилю довольно скромны, и они ничего не говорят о стиле вообще. стиль Google R руководство слишком похожи на те, которые я использую, когда я кодирую в JavaScript, так что это нет-нет.

короче: есть ли кто-нибудь с (e)навыками LISP, готовыми реализовать (Hadley's) руководство по стилю для ESS?

5 ответов


хорошая точка руководство Хэдли-это spaceing вокруг операторов (за исключением, может быть вокруг /)

есть smart-оператор пакета, который реализует его практически для каждого оператора.

Это моя настройка (операторы uncoment, которые вы хотите использовать):

(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 здесь.

[edit] я также использую стиль defacto camelCase кода R для глобалов. Разделенные подчеркиванием имена локальных переменных-их легко различить.

есть специальный subword режим в emacs, который переопределяет все команды редактирования и навигации, которые будут использоваться на заглавных под-словах

(global-subword-mode)

Я не пишу Elisp, и я не согласен с Хэдли о стилистических достоинствах подчеркивает. Более того, Хэдли все еще теряется в пустыне, не используя OneTrueEditor поэтому мы не можем ожидать от него помощи в этом вопросе.

но если вы открыты, чтобы следовать R Core, а не Hadley, ниже то, что R внутреннее руководство, раздел 8. "Стандарты Кодирования Р" рекомендует. Для меня R Core определяет стиль R в первую очередь. Google и Стили Хэдли хороши среднее рекомендации.

в любом случае, обратно в Elisp. Следующее служило нам хорошо в течение многих лет, и мне нравится тот факт, что основное поведение R похоже на стиль Emacs C++, поскольку я часто смотрю на код в обоих режимах.

[...]

также важно, чтобы код был написан таким образом, который позволяет другие, чтобы понять это. Это особенно полезно для исправления проблемы и включает в себя, используя описательные имена переменных, комментируя код, а также форматируя его должным образом. Основная Команда R рекомендует использовать основной отступ 4 для R и C (и большинство вероятно, также 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)))

(стили " GNU " для Режимы Emacs C и R используют основной отступ 2, который был определен для того чтобы не показать структуру ясно достаточно при использовании узких шрифтов.)

Я думаю, что единственные дополнения, которые я регулярно делаю, это следовать последнему прокомментированному фрагменту:

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

вы можете, конечно, отключить переключатель подчеркивания, если вам действительно нужно кодировать с подчеркиванием.


С версией разработки ESS (будет выпущен в сентябре 2015 года), просто добавьте в свой ess-mode-hook:

(ess-set-style 'RStudio)

RStudio также имеет флажок "вертикально выровнять аргументы", который установлен по умолчанию. Если вы хотите воспроизвести поведение, когда этот параметр не установлен (как в коде Хэдли), вам нужно изменить ess-offset-arguments to prev-line:

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

пожалуйста, напишите вопрос наhttps://github.com/emacs-ess/ESS Если вы найдете важное несоответствие между отступом ESS и RStudio.


имея те же предпочтения стиля OP, я прыгнул сюда, и я благодарю @lionel за ваши действительные предложения, но у меня была проблема с установкой стиля RStudio в ~/emacs.d/init.el С:

(ess-set-style 'RStudio)

Emacs / ESS отказались применять стиль (отступ 4-space вместо 2-space, не обсуждая стиль здесь :) ).

мой совет для новичка, используя следующий крючок в вашем ~/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)))

будет делать трюк.


еще один компонент руководства по стилю, который до сих пор не был рассмотрен здесь является отступом, когда функция выполняется по нескольким строкам. Руководство по стилю говорит использовать отступ, как

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

но использование любого из стилей по умолчанию кажется отступом line X некоторые исправлены количество пробелов, а не до (. Решение установить ess-arg-function-offset к некоторому не-числу, например,

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

это должно быть помещено в крючок режима, подобный @Dirk Ответ Eddelbuettel по. Также он должен идти после все вызовы ess-set-style или он будет изменен.