Пользовательский отступ Emacs

Моя команда использует специальный тип файла для конфигурации, и я хотел бы автоотложить (отступ) от файла с помощью emacs.

Я хотел бы увеличить отступ по размеру вкладки для открывающей круглой скобки - {или [и уменьшить размер табуляции для закрывающей круглой скобки -} или].

Например,

files = {
    file1 = first_file.txt
    file2 = second_file.txt
    rules = { 
        skip_header = 1
        fast_process = 1
    }
}

Отступ C-стиля не работает, так как строка не заканчивается точкой с запятой.

Я изучил вопрос о выпуске emacs на полдня сегодня, но до сих пор не знаю, как это сделать.

Ответ 1

Вывести новый режим из текстового режима или что-то еще и создать свою собственную функцию отступов. Я знаю, что это проще сказать, чем сделать, поэтому это может быть достаточно близко:

(define-derived-mode foo-mode text-mode "Foo"
  "Mode for editing some kind of config files."
  (make-local-variable 'foo-indent-offset)
  (set (make-local-variable 'indent-line-function) 'foo-indent-line))

(defvar foo-indent-offset 4
  "*Indentation offset for `foo-mode'.")

(defun foo-indent-line ()
  "Indent current line for `foo-mode'."
  (interactive)
  (let ((indent-col 0))
    (save-excursion
      (beginning-of-line)
      (condition-case nil
          (while t
            (backward-up-list 1)
            (when (looking-at "[[{]")
              (setq indent-col (+ indent-col foo-indent-offset))))
        (error nil)))
    (save-excursion
      (back-to-indentation)
      (when (and (looking-at "[]}]") (>= indent-col foo-indent-offset))
        (setq indent-col (- indent-col foo-indent-offset))))
    (indent-line-to indent-col)))

Откройте файл и сделайте M-x foo-mode

Ответ 2

Мне кажется, что javascript-mode будет делать правильные вещи с вашим образцом. Это может быть не идеально, но намного проще, чем писать собственный режим отступов.