如何配置带有lambda的钩子? (保存要在lambda中使用的参数)

时间:2019-01-08 16:02:51

标签: emacs hook

我目前正在尝试建立一个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 :(得分:2)

正如coredump解释的那样,问题在于您的配置文件未使用词法作用域。因此,在文件第一行的某处添加-*- lexical-binding:t -*-

答案 1 :(得分:1)

如果您不想为整个库启用词法绑定,则可以选择使用以下替代方法:

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