Keychain and Carbon Emacs

Carbon Emacs は NeXTStep 的アプリ (*.app) なので、いまのシェルの環境変数なぞ何も引き継いでくれない。~/.profile といったあたりのファイルも何もナメてくれない。これだとkeychain (OS X の Keychain じゃなくて、gentoo 起源の、すでに動いている ssh-agent の環境を拾ってくれるkeychain) が使えず、Emacs 上の Mew からいちいち ssh passphrase を聞かれたりして面倒なので、自力で ~/.keychain/$HOSTNAME-sh とかをナメないといけない。

(save-current-buffer
  (let
      (
       (buffer (set-buffer (generate-new-buffer "*keychain*")))
       (eval-sh-export
	(lambda  (name)
	  (progn
	    (goto-char (point-min))
	    (setenv name
		    (buffer-substring
		     (search-forward (concat name "="))
		     (- (search-forward ";") 1)))))))
    (insert-file-contents
     (concat
      (expand-file-name "~/.keychain/")
      (car (split-string (system-name) "\\."))
      "-sh"))
    (funcall eval-sh-export "SSH_AUTH_SOCK")
    (funcall eval-sh-export "SSH_AGENT_PID")
    (kill-buffer buffer)))

lambda がどうも上手につかえない。