我的大多数书签都以一个字母为前缀,第一个字母几乎总是唯一地确定书签。例如,通过这种方式,我可以使用M-x bookmark-jump RET s RET. 我把它放在快捷方式上,所以它实际上是~ s RET.
我想RET 最终摆脱,即得到M-x bookmark-quick-jump RET s 或~ s 做上述工作。我还希望它恢复到默认行为:向我显示以给定字母开头的所有书签,以防万一不只有一个变体。
到目前为止,我有:
(defun bookmark-do-quick-jump (str)
(let ((completions (all-completions str bookmark-alist)))
(bookmark-jump
(if (eq 1 (length completions))
(car completions)
(completing-read "Jump to bookmark: " bookmark-alist nil t str)))))
还有两个小插曲:
首先,我需要以某种方式跳入 minibuffer 并将这张地图贴在那里(不知道该怎么做):
(setq bookmark-quick-jump-map
(let ((map (make-sparse-keymap)))
(mapcar (lambda (key)
(define-key map key
(lambda()
(interactive)
(bookmark-do-quick-jump key))))
(loop for c from ?a to ?z
collect (string c)))
map))
其次,当我打电话时
(bookmark-do-quick-jump "o")
它带有 3 个变体(org-capture-last-stored、org-capture-last-stored-marker...)。我现在在 minibuffer 中,但我仍然需要按下 RET RET 才能看到这 3 个变体。我希望这可以自动完成。
只要我能获得我所描述的行为和可用性,我将不胜感激任何直接回答我的两个子问题或完全不同的方法的回答。
升级版:
我通过从切换completing-read
到解决了第二件事ido-completing-read
:
(defun bookmark-do-quick-jump (str)
(let ((completions (all-completions str bookmark-alist)))
(bookmark-jump
(if (eq 1 (length completions))
(car completions)
(ido-completing-read "Jump to bookmark: " completions nil t str)))))
顺便说一句,我忘了提到我使用bookmark+
. 我不确定默认情况下是否支持跳转到 dired bookmark-jump
。