Сделать 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
или он будет отменен.