Пользовательские отступы Emacs - PullRequest
10 голосов
/ 11 ноября 2010

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

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

Например,

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

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

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

Ответы [ 2 ]

13 голосов
/ 11 ноября 2010

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

(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

1 голос
/ 11 ноября 2010

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

...