Вероятно, под влиянием Clojure я чаще использую списки свойств в качестве структур данных. Emacs большую часть времени делает такие отступы,
`(:token ,token
:token-quality ,quality) ,
в то время как это то, что я предпочел бы
`(:token ,token
:token-quality ,quality) .
Интересно, а кто-то уже занимался этим?
Fuco1/lisp-indent-function
и сделайте(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Ответы:
Это может быть достигнуто путем изменения
lisp-indent-function
режима для emacs-lisp:Из
lisp-mode.el
источника в Emacs,альтернатива
Как отметил @wasamasa в комментарии к вопросу, @ Fuco1 (на github.com) изменил значение
lisp-indent-function
по умолчанию, чтобы исправить отступ ключевых слов (начиная с:
).Emacs предоставил пользователю переменную,
lisp-indent-function
чтобы выбрать, какую функцию использовать для отступа в режимах lisp.Вместо переопределения исходного определения функции, мы можем создать нашу собственную функцию и присвоить вышеуказанную переменную этому имени функции.
В этом примере
Fuco1/lisp-indent-function
вашей настройки emacsemacs-lisp-mode
:Ссылка
Модифицированная функция вставляется ниже в случае, если источник, на который ссылается github, потерян.
источник
lisp-indent-function
.(setq lisp-backquote-indentation nil)
для списков с кавычками (как в оригинальном вопросе).Вступление для расчета-lisp-indent
Лучшее решение - переопределить функцию
calculate-lisp-indent
. Вкратце,calculate-lisp-indent
это функция, которая возвращает столбец, в который должна быть добавлена строка в точке. Эта функция сообщает,lisp-indent-function
сколько каждой строки должно быть с отступом. (см. также мой пост на Reddit для получения дополнительной информации).Сравнение с другими ответами
Преимущество этого ответа по сравнению с использованием модифицированной функции Fuco1 заключается в том, что (1) он устраняет корень проблемы,
calculate-lisp-indent
а не просто устраняет неправильный отступ, возвращаемыйcalculate-lisp-indent
(2), он обобщает в списки в кавычках и в кавычках (и это работает независимо от того, указаны ли они в кавычках / в кавычках или с помощью'
`и`). Он также работает с произвольно вложенными кавычками и обратными кавычками.Преимущество этого ответа перед заменой
lisp-indent-function
наcommon-lisp-indent-function
функцию состоит в том, что у него нет побочного эффекта путаницы с другими отступами elisp. Elisp и common-lisp имеют разные отступы.Как это устроено
Это условное (in
calculate-lisp-indent
) то, что решает, отступать ли sexp как функция или нет. То, что попадает в это предложение, имеет отступ в виде функции. То, что попадает в предложение if, обычно с отступом (под текущим элементом). Чтобы сделать отступ для списков в кавычках как данных, а не как функций, нам нужно добавить дополнительную проверку для случаев, когда список цитируется в условном предикате.Этот код проверяет открытые скобки в выражении sexp с отступом. Если это sexp с несколькими sexp, он проверяет их все. Он возвращает t, если находит какие-либо цитаты или цитаты в кавычках.
бонус
Если вы хотите, чтобы какой-либо список, начинающийся с ключевого слова, имел отступ в виде данных, даже если он не заключен в кавычки, добавьте это как еще одну проверку в условный предикат. Это может быть полезно для макросов, в которых списки не указаны для удобства, например, в defhydra .
Примеры
Полный фрагмент кода, который я разместил ниже, работает с упомянутым вами случаем и многим другим. Пожалуйста, попробуйте!
Для более подробного объяснения того, как это работает, смотрите мой пост на reddit .
Фрагмент полного кода
Вот полный фрагмент кода.
Финальные заметки
Стоит отметить, что этот вопрос будет лучше обобщен, как запретить Emacs делать отступы в списках и списках без кавычек в качестве функций .
источник
Для более хакерской альтернативы ответу каушальмоди вы могли бы перезаписать то,
lisp-indent-function
что сделал Марк Х. Уивер,scheme-indent-function
чтобы исправить выравнивание ключевых слов в схеме Гиле.Я только что скопировал код с http://netris.org/~mhw/scheme-indent-function.el ; единственное изменение - добавить новое
cond
предложение. Возможно, вы захотите взять текущий кодlisp-indent-function
вместо того, чтобы использовать эту функцию как есть.(Жаль, что функции отступа не предоставляют больше хуков для упрощения незначительных изменений, подобных этой.)
источник
lisp-indent-function
? Также, кажется, нет функцииemacs-lisp-indent-function
.lisp-indent-function
содержит функцию отступа по умолчанию. Присвоение этой переменной идентично перезаписи функции отступа по умолчанию для режима emacs-lisp. (Вы правы, особенных здесь нетemacs-lisp-indent-function
, это простоlisp-indent-function
.)Вы можете переопределить его
lisp-indent-function
в будущем, используя мой пакет el-patch :Это решает проблему для меня; увидеть это в контексте .
источник