Как я могу настроить ловушку с лямбдой? (Сохранение параметров для использования в лямбдах) - PullRequest
0 голосов
/ 08 января 2019

В настоящее время я пытаюсь настроить хук C ++ для установки ярлыков для компиляции различных проектов, и у меня есть следующий код:

(defun configure-proj (proj key)
    (add-hook 'c++-mode-hook
              (function (lambda ()
                          (local-set-key (kbd (concatenate 'string key " u")) (lambda () (compile-unit-tests proj)))
                          (local-set-key (kbd (concatenate 'string key " d")) (lambda () (compile-debug proj)))
                          (local-set-key (kbd (concatenate 'string key " r")) (lambda () (compile-balanced proj)))
                          (local-set-key (kbd (concatenate 'string key " i")) (lambda () (compile-func-interactive proj "balanced" "11")))
                          (local-set-key (kbd (concatenate 'string key " c")) 'clean-all)))))

(configure-proj "Proj name" "<f4>")

В ошибке указано, что существует File mode specification error: (void-variable key). Я знаю, что ошибка в моем коде заключается в том, что ключевой параметр из configure-proj не копируется при создании хука, но я не знаю, как это исправить. Кто-нибудь может помочь?

Редактировать: Забыл показать, как я бегу configure-proj.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если вы не хотите включать лексическое связывание для всей библиотеки, вы можете альтернативно использовать обходной путь, например:

(defun configure-proj (proj key)
  (add-hook 'c++-mode-hook
            `(lambda ()
               (local-set-key ,(kbd (concatenate 'string key " u")) (lambda () (interactive) (compile-unit-tests proj)))
               (local-set-key ,(kbd (concatenate 'string key " d")) (lambda () (interactive) (compile-debug proj)))
               (local-set-key ,(kbd (concatenate 'string key " r")) (lambda () (interactive) (compile-balanced proj)))
               (local-set-key ,(kbd (concatenate 'string key " i")) (lambda () (interactive) (compile-func-interactive proj "balanced" "11")))
               (local-set-key ,(kbd (concatenate 'string key " c")) 'clean-all))))
0 голосов
/ 08 января 2019

Как объясняет coredump, проблема в том, что ваш конфигурационный файл не использует лексическую область видимости. Поэтому добавьте -*- lexical-binding:t -*- где-нибудь в первой строке файла.

...