我开始为“git add -p”编写这个代码片段:
(add-hook
'diff-mode-hook
(lambda()
(mapc (lambda(k)
(lexical-let ((kk k))
(define-key diff-mode-map k
(lambda()(interactive)
(if (region-active-p)
(replace-regexp "^." kk
nil
(region-beginning)
(region-end))
(insert kk)))))) (list " " "-" "+"))))
它按我的意愿工作,只是中间的 lexical-let 的丑陋困扰着我。
我不得不添加它,因为嵌套的 lambda 没有看到变量 'k。
有没有更好的方法来编写这段代码?我更喜欢一些神奇的功能
'lexic-lambda 可以让我写:
(add-hook
'diff-mode-hook
(lambda()
(mapc (lexical-lambda(k)
(define-key diff-mode-map k
(lexical-lambda()(interactive)
(if (region-active-p)
(replace-regexp "^." k
nil
(region-beginning)
(region-end))
(insert k)))))) (list " " "-" "+")))
最佳答案
(mapc (lambda (k)
(define-key diff-mode-map k
`(lambda ()
(interactive)
(if (region-active-p)
(replace-regexp "^." ,k
nil
(region-beginning)
(region-end))
(insert ,k)))))
(list " " "-" "+"))
或者,从 Emacs 24 开始,您可以在本地启用词法绑定(bind)。只需在文件顶部添加
;; -*- lexical-binding: t -*-
,您的代码应该可以在没有 lexical-let
包装器的情况下工作。 (参见 C-h i g (elisp)Lexical Binding RET
和 C-h i g (elisp)Using Lexical Binding RET
。)关于git - 带有词法绑定(bind)的 Emacs lisp lambda?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16897327/