LINUX.ORG.RU

[emacs] [emacs lisp] Вопрос по функции add-hook

 ,


0

0

В файле ~/.emacs есть следующие строки:

;; enable automatic indentation
(add-hook 'c-mode-hook
	  '(lambda ()
	     (define-key global-map (kbd "RET") 'newline-and-indent)))

(add-hook 'c++-mode-hook
	  '(lambda ()
	     (define-key global-map (kbd "RET") 'newline-and-indent)))

(add-hook 'scheme-mode-hook
	  '(lambda ()
	     (define-key global-map (kbd "RET") 'newline-and-indent)))

;; disable automatic indentation for haskell-mode
(add-hook 'haskell-mode-hook
	  '(lambda ()
	     (define-key global-map (kbd "RET") 'newline)))
Собственно вопрос: как без копипасты (как в примере) сделать так, чтобы по нажатию клавиши Enter выполнялась функция newline-and-indent во всех режимах (c-mode, c++-mode, scheme-mode, lisp-mode, etc), кроме haskell-mode (в котором, в свою очередь, должна выполняться функция newline)?

Как-то так:

(defun ret-is-newline-and-indent ()
  "enable automatic indentation"
  (define-key global-map (kbd "RET") 'newline-and-indent))

;;enable automatic indentation
(add-hook 'c-mode-hook 'ret-is-newline-and-indent)
(add-hook 'c++-mode-hook 'ret-is-newline-and-indent)
(add-hook 'scheme-mode-hook 'ret-is-newline-and-indent)

;; disable automatic indentation for haskell-mode 
(add-hook 'haskell-mode-hook 
          '(lambda () 
             (define-key global-map (kbd "RET") 'newline)))

ipc
()
Ответ на: комментарий от pseudo-cat

Есть конечно, и dolist и dotimes

(defun my-ret-hook()
  "Make new lines indented"
  (local-set-key (kbd "RET") 'newline-and-indent))

(dolist (mode '(c-mode-hook c++-mode-hook scheme-mode-hook))
  (add-hook mode 'my-ret-hook))
yoghurt ★★★★★
()

ответы ниже правильные. просто хинт - лучше анонимные функции не пихать в хуки - если понадобится их изменить, то в хуке останется старая копия. Лучше делать именованные функции

ott ★★★★★
()

Всем спасибо за ответы.
Теперь можно работать :)

Raving_Zealot ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.