2014-01-17 1 views
10

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

(electric-indent-mode 1) 

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

Non-ноль, если режим Electric-Отступ включен. См. Команду 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 «Простая настройка») или вызовите функцию «электрический-отступ-режим».

и для функции

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

поэтому я стараюсь, чтобы превратить его в крюке:

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

(Actualy я использую после-изменений-мажорного-режим-крюк и проверить (memql major-mode '(yaml-mode python-mode nxml-mode)) где я могу добавить дополнительные режимы в список) ,

Но это не работает, я также попробовать:

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

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

ответ

10

С недавнего 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))) 
+0

Спасибо, это помогло мне с той же проблемой, только с улучшенным рубиновым режимом вместо yaml-mode. Я слишком привык использовать поведение C-j, чтобы изменить его сейчас, но поймите, почему для новичков может быть полезно, чтобы по умолчанию был включен электрический отступ. – sockmonk

2

По крайней мере, на 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) 
+0

У меня такая же проблема с режимом NXML, и я могу отключить электрический режим в режиме Yaml. Но, как вы сказали, это глобальный режим, и он не работает с крючка. – jcubic

+0

@jcubic Для режима 'nxml' вы можете выполнить' (define-key nxml-mode-map "/" nil) '. –

+0

Не работайте для меня, я забегаю из .emacs и из nxml-буфера и ничего. Когда я нахожусь, введите текущую строку, получив отступ. – jcubic

4

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))) 

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

+0

Что стоит против установки «электрических-indent-функций» напрямую, как в моем ответе? – lunaryorn

+0

О, верно, не видел, что один, извините, действительно установил «функции с электрическим отступом», как вы тоже должны были сделать трюк. – Stefan

+0

Не работайте для меня. Когда я нажимаю Enter (или запускаю 'new-line'), текущая строка получает отступ. – jcubic