Как включить режим электрического отступа для конкретного основного режима?
У меня есть несколько основных режимов (например: 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)