La acción del button de ceceo de Emacs no funciona correctamente

Estoy escribiendo una pequeña personalización que usa la function del package gitemacs. La idea era que un búfer con los repositorys git actualmente disponibles aparece cada vez que se presiona una tecla, lo que me permite seleccionar uno y navegar automáticamente al repository git-status del repo.

Actualmente estoy atascado con este código:

(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 "Cc \\") 'select-git-repository-from-list) 

que no funciona como se esperaba: Esto crea un minibúfer, lo llena de botones de text, que se activan (git-status dir) . El problema es que git-status se llama con éxito cuando presiono el primer button. Los otros dos me dan error if: fatal: Not a git repository (or any of the parent directories): .git . Supongo que la ruta es nula o está corrompida, por eso .git no se encuentra.

Entonces, la pregunta es: ¿cómo debería reescribirse este código?

Saludos, Mike.

Su largo comentario dentro de su function da la key del problema: el momento en que se evalúan el código y las variables no es lo que parece esperar. Puede resolver su problema haciendo algo como esto:

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

Observe la cita inversa: estoy citando una list (código, de hecho, ya que es una lambda), pero estoy evaluando selectivamente una variable dentro de ella (para eso se usa la coma).