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

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

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

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

Ответы

Ответ 1

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

Существует пакет 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 здесь.

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

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

(global-subword-mode)

Ответ 2

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

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

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

[...]

Также важно, чтобы код записывался таким образом, чтобы другие понимают это. Это особенно полезно для фиксации проблемы и включает в себя использование самоописательных имен переменных, комментируя код, а также правильно форматируя его. Основная группа R рекомендует использовать базовый отступ 4 для R и C (и большинство вероятно, также Perl) и 2 для документации в формате Rd. Emacs (21 или более поздние) пользователи могут реализовать этот стиль отступов, поставив в одном из файлов автозагрузки и использовании настроек для установки c-default-style' to "bsd" и c-basic-offset' to 4 '.)

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

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

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

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

Ответ 3

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

(ess-set-style 'RStudio)

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

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

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

Ответ 4

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

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

сделает трюк.

Ответ 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 для некоторого не-номера, например

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

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