LINUX.ORG.RU

Emacs, indentation.

 


0

1

Есть проблема в emacs с отступами. Например такой код:

 Dispatch = [
        {'_', [{'_', hello_world_handler, []}]}
    ],

У меня он выравнивает его вот так:

 Dispatch = [
             {'_', [{'_', hello_world_handler, []}]}
    ],

Как это можно поправить?

Конфиг сейчас такой - https://github.com/saa/emacs-personal/blob/master/saa.el

★★★

Последнее исправление: SAA (всего исправлений: 2)
Ответ на: комментарий от Bad_ptr

Ага, поправил, спасибо.

SAA ★★★
() автор топика

1. Какого правила отступа вы хотите добиться? Однократный отступ от «Dispatch»? (В решении ниже предполагаю этот ответ)

2. По конфигу я не смог понять, откуда ваша среда берёт плагин для erlang-mode. В решении ниже предполагаю, что для этого используется стандартный erlang.el:

Итак, пользовательские средства для задания такого отступа в erlang.el отсутствуют. Но можно реализовать это на Elisp, непосредственно переписав функцию erlang-calculate-stack-indent. В ней надо заменить строки:

(t
;; Indent to the same column as the first
;; argument.
(goto-char (1+ (nth 1 stack-top)))
(skip-chars-forward " \t")
(current-column)))))

на

(t
;; Indent by one level more than the preceding expression.
(+ erlang-indent-level (erlang-indent-find-preceding-expr))))))
Cheater
()
Ответ на: комментарий от Cheater

У вас явно libastral. Спасибо большое, все работает как надо.

SAA ★★★
() автор топика
Ответ на: комментарий от Cheater

Для базового случая вроде все ок.

Но вот например:

        {'_', [
             {"/". index_handler, []},

С переходом на новую строку он не может сделать нормальный отступ, пишет: «Unbalanced parenthesis». Но это уже в функции erlang-partial-parse, не может распарсить.

SAA ★★★
() автор топика
Последнее исправление: SAA (всего исправлений: 1)
Ответ на: комментарий от SAA

С этой ситуацией вроде ок, теперь остался только такой случай:

test:print([A = ok,

И он не может поставить отступ, ругается опять при парсинге: «Containing expression ends prematurely».

SAA ★★★
() автор топика
Ответ на: комментарий от SAA

Упс, прошу прощения, ответ был совершенно неправильным - мне взбрело в голову, что erlang-indent-find-preceding-expr возвращает отступ предыдущей строки кода. Вместо этого, тк на момент вызова этой функции мы уже стоим на этой предыдущей строке кода, можно использовать функцию current-indentation.

Итого, временным решением является такая замена:

(t
;; Indent by one level more than the preceding logical line.
(+ erlang-indent-level (current-indentation))))))

Это хак, тк он использует родную elisp-функцию current-indentation, вычисляющую отступ текущей строки, в то время как этот отступ скорее всего уже известен какой-то внутренней функции/переменной erlang.el, пока не знаю какой. Мб если дольше всмотрюсь в код, то пойму, как это делать корректно.

Cheater
()
Ответ на: комментарий от Cheater

Вроде как надо. Большое спасибо.

SAA ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.