2013-06-03 5 views
3

내가 "자식이 -p 추가"이 코드 작성에 착수 :어휘 바인딩을 사용하는 Emacs lisp lambda?

내가 원하는대로 작동
(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 " " "-" "+")))) 

, 그것은 단지 추함의를 '어휘-할 날 귀찮게 중간에. 중첩 된 람다가 변수 'k를 보지 않았으므로 추가해야했습니다. 이 코드를 작성하는 더 좋은 방법이 있습니까? ,

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

답변

3
(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 " " "-" "+")) 

또는 이맥스 24 이후, 당신은 로컬 어휘 바인딩을 사용할 수 있습니다 : 나는 마법 기능에게 나를 쓰기를 허용 할 'lexic - 람다를 선호 할 것입니다. 파일 상단에 ;; -*- lexical-binding: t -*-을 추가하면 코드가 lexical-let 래퍼없이 작동합니다. (C-h i g (elisp)Lexical Binding RETC-h i g (elisp)Using Lexical Binding RET을 참조하십시오.)

+0

감사합니다. @danlei. 나는 같은 접근법을 사용하려고 시도했지만 잘못된 인용 부호를 넣었고 작동하지 않았다. –

+0

반갑습니다. – danlei

관련 문제