4

ほとんどの場合、最初の文字がブックマークを一意に決定するように、ほとんどのブックマークに文字のプレフィックスを付けています。このようにして、たとえば、ソース フォルダー (「s: source」としてブックマークされている) にM-x bookmark-jump RET s RET. ショートカットに持っているので、実は~ s RET.

最終的には取り除きたいRET 、つまり 、前述の仕事を取得M-x bookmark-quick-jump RET s または実行したいと考えています。~ sまた、デフォルトの動作にフォールバックしたいと思います。バリアントが1つだけではない場合に備えて、指定された文字で始まるすべてのブックマークを表示します。

これまでのところ、私は持っています:

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

まだ問題が 2 つあります。

まず、どうにかしてミニバッファーにジャンプし、このマップに固執する必要があります (これを行う方法がわかりません)。

(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...) で戻ってきます。私は今ミニバッファーにいますが、 RET RET これらの 3 つのバリアントを表示するにはまだ押す必要があります。これを自動でやってほしい。

私が説明した動作と使いやすさを得ることができる限り、私の2つのサブ問題に直接答えるか、まったく異なるアプローチのいずれかの応答をいただければ幸いです.

更新:

completing-readからに切り替えることで2番目のことを解決しました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

4

3 に答える 3

2

別の見方を次に示します。

(defun bookmark-do-quick-jump (str)
  (let ((completions (all-completions str bookmark-alist)))
    (if (null (cdr completions))
        (bookmark-jump (car completions))
      (minibuffer-with-setup-hook
          (lambda () (insert str)
                     (minibuffer-completion-help))
        (call-interactively 'bookmark-jump)))))

またはさらに別の(テストされていないことがさらに保証されています):

(defadvice bookmark-jump (around quick-bookmarks activate)
  (minibuffer-with-setup-hook
      (lambda ()
        (add-hook 'post-self-insert-hook
                  (lambda ()
                    (let ((completions
                           (all-completions (minibuffer-contents)
                                            bookmark-alist)))
                      (if (cdr completions)
                          (minibuffer-completion-help)
                        (minibuffer-complete-and-exit))))
                  nil t))
    ad-do-it))
于 2013-07-22T14:16:42.717 に答える
2

読み取りの完了中に再マップself-insert-commandして、自動完了と自動受け入れの動作をトリガーできます。

(or (minibuffer-complete-and-exit) (minibuffer-completion-help))一見すると非常にうまく機能していましたが、コメントに記載されているように、あるブックマークの名前が別のブックマークのプレフィックスである場合、短い名前をすぐに受け入れて長い名前にアクセスできなくなるため、理想的ではありません。

minibuffer-completeただし、 and together を呼び出すとminibuffer-completion-help補完機能が壊れるため、代わりに の関連部分をminibuffer-complete-and-exit新しい関数にコピーしました。これを使用すると、以前の問題がすべて解決されます。

(require 'bookmark)

(defvar bookmark-do-quick-jump-map (copy-keymap minibuffer-local-must-match-map)
  "Keymap for `bookmark-do-quick-jump'.

`minibuffer-local-must-match-map' is used by `completing-read' when its
REQUIRE-MATCH argument is t.

In `bookmark-do-quick-jump' we bind this modified copy to use in its place.")

(define-key bookmark-do-quick-jump-map
  [remap self-insert-command] 'my-self-insert-complete-and-exit)

(defun bookmark-do-quick-jump ()
  "Jump to specified bookmark with auto-completion and auto-acceptance."
  (interactive)
  (bookmark-maybe-load-default-file)
  (let ((minibuffer-local-must-match-map bookmark-do-quick-jump-map))
    (bookmark-jump
     (completing-read "Jump to bookmark: " bookmark-alist nil t))))

(defun my-self-insert-complete-and-exit (n)
  "Insert the character, then attempt to complete the current string,
automatically exiting when only one option remains, and displaying the
completion options otherwise."
  (interactive "p")
  (self-insert-command n)
  (my-minibuffer-complete)
  (let ((my-completions (completion-all-sorted-completions)))
    (if (and my-completions (eq 0 (cdr my-completions)))
        (exit-minibuffer)
      (minibuffer-completion-help))))

(defun my-minibuffer-complete ()
  "Copied from `minibuffer-complete-and-exit'."
  (interactive)
  (condition-case nil
      (completion--do-completion nil 'expect-exact)
    (error 1)))

編集:

私は ido を使ってこれをもう一度突き刺しました。次の「重要な文字」が通常のミニバッファー補完で行う方法で強調表示されないのは少し残念ですが (これは次に何を入力するかの良い指標だったので)、他の点ではうまく機能しているようです。 .

(require 'bookmark)
(require 'ido)

(defvar bookmark-ido-quick-jump-map (copy-keymap minibuffer-local-map)
  "Keymap for `bookmark-ido-quick-jump'.

Every time `ido-completing-read' is called it re-initializes
`ido-common-completion-map' and sets its parent to be `minibuffer-local-map'.

In `bookmark-ido-quick-jump' we provide this modified copy as a replacement
parent.")

(define-key bookmark-ido-quick-jump-map
  [remap self-insert-command] 'my-self-insert-and-ido-complete)

(defun bookmark-ido-quick-jump ()
  "Jump to selected bookmark, using auto-completion and auto-acceptance."
  (interactive)
  (bookmark-maybe-load-default-file)
  (let ((minibuffer-local-map bookmark-ido-quick-jump-map)
        (ido-enable-prefix t))
    (bookmark-jump
     (ido-completing-read "Jump to bookmark: " 
                          (loop for b in bookmark-alist collect (car b))))))

(defun my-self-insert-and-ido-complete (n)
  "Insert the character, then attempt to complete the current string,
automatically exiting when only one option remains."
  (interactive "p")
  (self-insert-command n)
  ;; ido uses buffer-local pre- and post-command hooks, so we need to
  ;; co-operate with those. We append our post-command function so that
  ;; it executes after ido has finished processing our self-insert.
  (add-hook 'post-command-hook
            'my-self-insert-and-ido-complete-post-command t t))

(defun my-self-insert-and-ido-complete-post-command ()
  (remove-hook 'post-command-hook
               'my-self-insert-and-ido-complete-post-command t)
  ;; Now that ido has finished its normal processing for the current
  ;; command, we simulate a subsequent `ido-complete' command.
  (ido-tidy) ;; pre-command-hook
  (ido-complete)
  (ido-exhibit)) ;; post-command-hook
于 2013-07-06T06:33:17.517 に答える
0

あなたは多くの余分な仕事をしているように聞こえます。つららを使用するだけです。

  • ユーザー オプションicicle-incremental-completionnon-nilおよび non-は、t入力を入力するとすぐにすべての一致を表示することを意味します。

  • オプションicicle-top-level-when-sole-completion-flagnon-nilは、キーを押す必要なく単独のマッチを受け入れることを意味します (例: RET)。

これらの値を一般的に持つようにオプションをカスタマイズする代わりに、それらを独自のコマンドの値にバインドすることができます。

于 2013-07-12T06:59:05.017 に答える