Как включить режим электрического отступа для конкретного основного режима?

У меня есть несколько основных режимов (например: Yaml и NXML), которые я не хочу использовать в режиме электрического отступа (я хочу, чтобы это было на C-подобных языках), но я не могу отключиться, если выключен. Чтобы включить, я:

(electric-indent-mode 1)

из документации (для переменного электрического отступа)

Ненуле, если включен режим "Электрический отступ". См. Команду electric-indent-mode' for a description of this minor mode. Setting this variable directly does not take effect; either customize it (see the info node Простая настройка ") или вызовите функцию" электрический-отступ-режим".

и для функции

Переключить "на лету" (режим электрического отступа). С префиксом аргумент ARG, включить режим электрического отступа, если ARG положителен, и отключите его в противном случае. Если вызвано из Lisp, включите режим, если ARG опущено или нет.

поэтому я пытаюсь отключить его в hook:

(add-hook 'yaml-mode-hook (lambda ()                        
                             (electric-indent-mode -1)))

(Фактически я использую hook-change-major-mode-hook и проверяю (memql major-mode '(yaml-mode python-mode nxml-mode)), где я могу добавить в список больше режимов).

Но это не работает, я также стараюсь:

(set (make-local-variable 'electric-indent-mode) nil)

Нет радости. Но он работает, когда я eval (electric-indent-mode -1) из файлов .emacs.

Ответ 1

С недавним снимком Emacs (возможно, только Emacs) вы можете использовать electric-indent-local-mode, например:

(add-hook 'yaml-mode-hook (lambda () (electric-indent-local-mode -1)))

Если вашему Emacs не хватает этой функции, вы все равно можете отключить режим через electric-indent-functions, например.

(add-hook 'yaml-mode-hook
          (lambda ()
             (add-hook 'electric-indent-functions
                            (lambda () 'no-indent) nil 'local)))

И в любом случае вы, возможно, захотите восстановить C-j, используя

(add-hook 'yaml-mode-hook 
          (lambda () (local-set-key (kbd "C-j") #'newline-and-indent)))

Ответ 2

electric-indent-mode будет включен по умолчанию в 24.4. Чтобы отключить его локально, вы сможете использовать electric-indent-local-mode, как упомянуто lunaryorn. Но, чтобы отключить его локально в 24.3, вы можете сделать:

(add-hook 'foo-mode-hook
          (lambda () (set (make-local-variable 'electric-indent-mode) nil)))

Вы упомянули, что первая форма не сработала для вас, но она должна (то есть, если это не так, из-за какой-то другой проблемы).

Ответ 3

По крайней мере, на emacs 24.3 вы не можете отключить электрический режим отступов локально, так как это global-mode. В любом случае проблема с yaml-mode заключается в том, что в нее встроена функциональность electric-indent, то есть она будет включена даже без electric-indent-mode. Пакет не дает возможности отключить это поведение, возможно, вы должны указать проблему в своем реестре github.

Попробуйте отключить функцию электрического отступа в yaml-mode

(define-key yaml-mode-map "|" nil)
(define-key yaml-mode-map ">" nil)
(define-key yaml-mode-map "-" nil)
(define-key yaml-mode-map "." nil)
(define-key yaml-mode-map [backspace] nil)

Чтобы восстановить поведение электрического отступа после этого, вы можете сделать

(define-key yaml-mode-map "|" 'yaml-electric-bar-and-angle)
(define-key yaml-mode-map ">" 'yaml-electric-bar-and-angle)
(define-key yaml-mode-map "-" 'yaml-electric-dash-and-dot)
(define-key yaml-mode-map "." 'yaml-electric-dash-and-dot)
(define-key yaml-mode-map [backspace] 'yaml-electric-backspace)