我正在写一个使用git-emacs包函数的小自定义。这个想法是,只要按下一个键,就会弹出一个包含当前可用的git-repositories的缓冲区,让我选择一个并自动导航到repo的git-status buffer。
我现在被这个代码卡住了:
(require 'popwin)
(require 'button)
(popwin-mode 1)
(setq git-repositories (list "~/testgit/repo1/" "~/repo2/" "~/gitlab/repo3"))
(defun select-git-repository-from-list()
(interactive)
;; fill buffer with data from git-repositories
(with-output-to-temp-buffer "*git-repositories*"
(with-current-buffer "*git-repositories*"
(dolist (repo git-repositories)
;; we use 'local' variable because if insert-text-button value
;; is set like (car blah), call to `car` is issued when button is pressed,
;; so the it does return first element in the list
(setq pos (position repo git-repositories))
(insert-text-button repo 'action (lambda (x) (delete-window) (git-status (nth pos git-repositories))))
(newline)
)
(push '("*git-repositories*" :height 10) popwin:special-display-config)))
)
(global-set-key (kbd "C-c \\") 'select-git-repository-from-list)这并不像预期的那样工作:它创建了一个小缓冲区,用文本按钮填充它,这些按钮将触发(git-status dir)。问题是,当我按下第一个按钮时,git-status被成功调用。另外两个给出了error if: fatal: Not a git repository (or any of the parent directories): .git。我猜路径为空或已损坏,这就是找不到.git的原因。
因此,问题是:这段代码应该如何重写?
问候你,迈克。
发布于 2014-11-21 17:44:15
您在函数中的长注释提供了问题的线索:代码和变量被计算的时刻并不是您所期望的。你可以这样做来解决你的问题:
(defun select-git-repository-from-list()
(interactive)
;; fill buffer with data from git-repositories
(with-output-to-temp-buffer "*git-repositories*"
(with-current-buffer "*git-repositories*"
(dolist (repo git-repositories)
(insert-text-button repo 'action `(lambda (x) (delete-window) (git-status ,repo)))
(newline))
(push '("*git-repositories*" :height 10) popwin:special-display-config))))注意反引号:我引用了一个列表(代码,如果是事实,因为它是一个lambda),但我有选择地计算其中的一个变量(这就是逗号的用途)。
https://stackoverflow.com/questions/27039763
复制相似问题