Как мне заставить emacs делать отступы другим вещам, как это определяют отступы?

Таким образом, Emacs неплохо справляется с редактированием кода Scheme/Racket/Lisp. Одна хорошая вещь, которую он делает, это когда вы вводите код вроде:

(define (make-position-table)
  (for/list ([i (in-range 256)])
            `()))

Он делает очень умную вещь и делает отступ во второй строке до двух столбцов. Теперь третья строка делает то же, что и со всем кодом на Лиспе, и делает отступы, чтобы выровнять все аргументы.

Как мне настроить Emacs так, чтобы третья строка делала отступ, как если бы я представлял новое тело? Я бы хотел:

(define (make-position-table)
  (for/list ([i (in-range 256)])
    `()))

Я предполагаю, что это возможно, и что я просто не понял, какую таинственную переменную Emacs нужно установить. Кто-нибудь знает как это сделать?


person pknodle    schedule 16.11.2010    source источник


Ответы (2)


Вы можете добавить это в свой файл .emacs:

(put 'for/list 'scheme-indent-function 1)

См. также взломанную версию режима схемы, которая делает намного больше рэкета. -измы.

person Eli Barzilay    schedule 16.11.2010
comment
Сладкий! Спасибо. Это как раз то, что я искал! - person pknodle; 17.11.2010

Я считаю, что (put 'for/list 'scheme-indent-function 'defun) должен делать то, что вы хотите.

Повторите для других символов. Мой .emacs включает

(mapc (lambda (sym) (put sym 'scheme-indent-function 'defun))
      (list 'for 'for/list 'for/and 'for/or
            'match 'case 'syntax-parse 'test-suite 'test-case
            'define-syntax-rule 'match-let 'match-let*))

со времен, когда я баловался схемой PLT.

person Porculus    schedule 16.11.2010
comment
Спасибо. Это очень удобно. - person pknodle; 17.11.2010
comment
Использование defun отличается от 1: попробуйте ввести новую строку сразу после открывающего ключевого слова, и вы увидите, как это работает. (Кроме того, в Racket есть такие вещи, как for/fold, которые имеют две специальные формы.) - person Eli Barzilay; 17.11.2010