Вот соглашения, которым вы должны следовать при написании кода на Emacs Lisp, предназначенного для широкого использования:
Это соглашение является обязательным для любого файла, который включает определения настроек (custom). Если исправление такого файла для соответствия этому соглашению требует несовместимого изменения, смело вносите это несовместимое изменение; не откладывайте его.
Иногда для имени команды, предназначенной для использования пользователями, удобнее, если некоторые слова стоят перед префиксом имени пакета. Например, у нас принято, чтобы команды, перечисляющие объекты, назывались ‘list-что-то’, например, пакет под названием ‘frob’ мог бы иметь команду ‘list-frobs’, тогда как другие его глобальные символы начинаются с ‘frob-’. Также конструкции, определяющие функции, переменные и т. д., могут работать лучше, если они начинаются с ‘define-’, так что допустимо помещать префикс имени позже в имени. Вне этих хорошо установленных случаев, однако, лучше предпочесть добавление вашего префикса в начало.
Если вы пишете функцию, которая, по вашему мнению, должна быть добавлена в Emacs под
определённым именем, например twiddle-files, не называйте её так
в своей программе. Назовите её mylib-twiddle-files в своей программе,
и отправьте письмо на адрес ‘bug-gnu-emacs@gnu.org’ с предложением добавить
её в Emacs. Если и когда мы это сделаем, мы сможем легко изменить имя.
Если одного префикса недостаточно, ваш пакет может использовать два или три альтернативных общих префикса, если они имеют смысл.
lexical-binding в новом коде и
преобразовывать существующий код Emacs Lisp для включения lexical-binding,
если он ещё не использует его. См. Выбор диалекта Lisp.
provide в конце каждого отдельного Lisp-файла.
См. Возможности (Features).
require, чтобы убедиться, что они загружены.
См. Возможности (Features).
(eval-when-compile (require 'bar))
Это указывает Emacs загрузить bar непосредственно перед байт-компиляцией
foo, чтобы определение макроса было доступно во время
компиляции. Использование eval-when-compile позволяет избежать загрузки bar,
когда скомпилированная версия foo используется. Этот вызов должен
находиться перед первым использованием макроса в файле. См. Макросы и байт-компиляция.
require для этой библиотеки на верхнем уровне и покончите
с этим. Но если ваш файл содержит несколько независимых функций, и
только одна или две требуют дополнительную библиотеку, то рассмотрите возможность размещения
выражений require внутри соответствующих функций, а не на
верхнем уровне. Или используйте выражения autoload для загрузки дополнительной
библиотеки при необходимости. Так люди, которые не используют эти аспекты
вашего файла, не будут вынуждены загружать дополнительную библиотеку.
cl-lib
вместо старой библиотеки cl. Последняя библиотека
устарела и будет удалена в будущей версии Emacs.
framep и frame-live-p. Мы рекомендуем
избегать использования этого суффикса -p в именах булевых переменных, если
только переменная не привязана к функции-предикату; вместо этого используйте
суффикс -flag или имена вида is-foo.
unload-feature отменяет изменения, обычно выполняемые
загрузкой возможности (например, добавление функций в хуки). Однако, если
загрузка feature выполняет нечто необычное и более сложное, вы
можете определить функцию с именем feature-unload-function и сделать
так, чтобы она отменяла любые такие специальные изменения. unload-feature затем
автоматически запустит эту функцию, если она существует. См. Выгрузка.
(defalias 'gnus-point-at-bol
(if (fboundp 'point-at-bol)
'point-at-bol
'line-beginning-position))
eval-after-load и with-eval-after-load в
библиотеках и пакетах (см. Хуки для загрузки). Эта возможность
предназначена для пользовательских настроек; использование её в Lisp-программе
нечистоплотно, поскольку оно изменяет поведение другого Lisp-файла способом,
который не виден в этом файле. Это препятствует отладке,
примерно как советование функции в другом пакете.
path в их имени, предпочитая вместо этого file,
file-name или directory, поскольку Emacs следует
соглашению GNU использовать термин path (путь) только для путей поиска,
которые являются списками имён каталогов.