假设我们在列表中有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)
答案 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))))