无法以编程方式将键分配给循环中的书签

时间:2015-11-04 06:32:10

标签: emacs elisp

假设我们在列表中有n个书签(n< = 9)

% Bookmark
- --------
1  mark-1                     ~/work/file-1.txt
2  mark-2                     ~/work/file-2.txt
  ...
9  mark-9                     ~/work/file-9.txt

我想以编程方式附加密钥<n>以跳转到第n个书签。

代码

;get a sorted list of bookmarks
(let ((bookmarks (sort (bookmark-all-names) 'string<))
      (i 1))
  (while bookmarks
    (setq key (number-to-string i))
    ;try to assign key i -> jump-to-bookmark(bookmarks[i])
    (define-key bookmark-bmenu-mode-map
      (kbd key)
      (lambda () (interactive) (bookmark-jump (car bookmarks))))
    ;next bookmark
    (setq bookmarks (cdr bookmarks))
    (setq i (+ i 1))
              ))

不幸的是,它给出了一个错误:

  

(错误类型参数integer-or-marker-p key)

1 个答案:

答案 0 :(得分:1)

这里的问题与您使用动态绑定有关,但是尝试从lambda访问不再在范围内的变量(书签)。你可以通过这种方式定义lambda来解决它:

`(lambda () (interactive) (bookmark-jump (car ',bookmarks))))

您可以看到解释here

(顺便说一句,当你有超过9个书签时代码会失败)

这是修改后的代码,对我来说很合适:

(let ((bookmarks (sort (bookmark-all-names) 'string<))
      (i 1)
      key)
  (while bookmarks
    (setq key (number-to-string i))
    (define-key bookmark-bmenu-mode-map
      (kbd key)
      `(lambda () (interactive) (bookmark-jump (car ',bookmarks))))
    (setq bookmarks (cdr bookmarks))
    (setq i (+ i 1))))