Цикл .emacs для назначения небольшого режима некоторым основным режимам - PullRequest
2 голосов
/ 18 июня 2011

Я хочу подключить второстепенные режимы {пробел и yas / minor-mode} к некоторым основным режимам. Конечно, это можно сделать вручную, но я хочу цикл. Поэтому я попытался написать это:

(progn 
(setq modes-to-be-hooked '(lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook text-mode-hook tcl-mode-hook c-mode-hook fortran-mode-hook))
  (while modes-to-be-hooked
    (setq my-hooks '( yas/minor-mode whitespace-mode ))
      (while my-hooks
         (add-hook '(pop modes-to-be-hooked) '(pop my-hooks)))
  )
)

Проблема с этим циклом состоит в том, что последний элемент списка равен "nil" и (add-hook 'nil' nil) выдает ошибку. Затем я попытался избежать nils с помощью if, но это не сработало:

(progn 
  (setq mylist '(a b c))
  (while mylist
        (progn
          (setq temp (pop mylist))
          (if temp (message "%s" temp) (message "It's nil!") )
          (sleep-for 1)
        )
  )
)

печатает ноль: (

Ответы [ 2 ]

5 голосов
/ 18 июня 2011

Ну, я вижу пару проблем с вашим кодом. Во-первых, вы выскакиваете из своего основного списка режимов каждый раз, когда вы всплываете из своего основного списка режимов. Во-вторых, вы цитируете свои (pop) вызовы, что означает, что вы не передаете нужные значения в (add-hook).

Цикл while не выполняет свое тело, когда значение цикла равно nil, поэтому ваш второй блок кода не выдает nil через ваш (message), потому что он не заходит так далеко. nil - это просто конечное значение, полученное в этом (progn), являющееся возможным возвращаемым значением цикла while, когда он встречает nil.

Возможно, вы захотите проверить поддержку интерактивной отладки в Emacs, чтобы вы могли выяснить, что на самом деле происходит, если ваш код работает не так, как вы ожидали. См:
M -: (info "(elisp) debugging") RET

Однако я бы предложил использовать решение lhui, а не исправлять то, что у вас есть.

Для альтернативного синтаксиса я использую этот подход:

(defun my-coding-config ()
  (whitespace-mode 1)
  (yas/minor-mode 1))

(mapc
 (lambda (language-mode-hook)
   (add-hook language-mode-hook 'my-coding-config))
 '(lisp-mode-hook
   rst-mode-hook
   python-mode-hook
   emacs-lisp-mode-hook
   text-mode-hook
   tcl-mode-hook
   c-mode-hook
   fortran-mode-hook))

Определение именованной функции, такой как my-coding-config, упрощает вещи, если вы решите включить некоторые новые функции позже (например, включить другой второстепенный режим), поскольку вы можете сделать это изменение незамедлительным, просто переоценив эту функцию, а не удаление / добавление элементов ко всем этим переменным хуков.

1 голос
/ 18 июня 2011

используйте это:

(dolist (hook
         (list lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook text-mode-hook tcl-mode-hook c-mode-hook fortran-mode-hook))
  (add-hook hook (lambda ()
                    (whitespace-mode 1)
                    (yas/minor-mode 1))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...