机制iswitchb用于显示完成

时间:2012-02-08 06:54:39

标签: emacs elisp

所有

今天早上我决定攻击iswitchb,发现了一件令人困惑的事情。

通常,当我们命令iswitchb时,我们在迷你缓冲区中得到了一些信息:

iswitch {buffer1,buffer2 ...}

在我们输入数字时,完成内容是什么 正在萎缩。

我没有发现iswitchb在黑客攻击时是如何实现这一目标的 它的代码(对不起我的愚蠢)。

这是带有doc-string翻录的原始iswitchb-read-buffer 关:

(defun iswitchb-read-buffer (prompt &optional default require-match
                    start matches-set)
  (let
      (
       buf-sel
       iswitchb-final-text
       (icomplete-mode nil) ;; prevent icomplete starting up
       )

    (iswitchb-define-mode-map)
    (setq iswitchb-exit nil)
    (setq iswitchb-default
      (if (bufferp default)
          (buffer-name default)
        default))
    (setq iswitchb-text (or start ""))
    (unless matches-set
      (setq iswitchb-rescan t)
      (iswitchb-make-buflist iswitchb-default)
      (iswitchb-set-matches))
    (let
    ((minibuffer-local-completion-map iswitchb-mode-map)
     ;; Record the minibuffer depth that we expect to find once
     ;; the minibuffer is set up and iswitchb-entryfn-p is called.
     (iswitchb-minibuf-depth (1+ (minibuffer-depth)))
     (iswitchb-require-match require-match))
      ;; prompt the user for the buffer name
      (setq iswitchb-final-text (completing-read
                 prompt       ;the prompt
                 '(("dummy" . 1)) ;table
                 nil          ;predicate
                 nil ;require-match [handled elsewhere]
                 start  ;initial-contents
                 'iswitchb-history)))
    (if (and (not (eq iswitchb-exit 'usefirst))
         (get-buffer iswitchb-final-text))
    ;; This happens for example if the buffer was chosen with the mouse.
    (setq iswitchb-matches (list iswitchb-final-text)
          iswitchb-virtual-buffers nil))

    ;; If no buffer matched, but a virtual buffer was selected, visit
    ;; that file now and act as though that buffer had been selected.
    (if (and iswitchb-virtual-buffers
         (not (iswitchb-existing-buffer-p)))
    (let ((virt (car iswitchb-virtual-buffers))
          (new-buf))
      ;; Keep the name of the buffer returned by find-file-noselect, as 
      ;; the buffer 'virt' could be a symlink to a file of a different name.
      (setq new-buf (buffer-name (find-file-noselect (cdr virt))))
      (setq iswitchb-matches (list new-buf)
        iswitchb-virtual-buffers nil)))

    ;; Handling the require-match must be done in a better way.
    (if (and require-match
         (not (iswitchb-existing-buffer-p)))
    (error "Must specify valid buffer"))

    (if (or (eq iswitchb-exit 'takeprompt)
        (null iswitchb-matches))
    (setq buf-sel iswitchb-final-text)
      ;; else take head of list
      (setq buf-sel (car iswitchb-matches)))

    ;; Or possibly choose the default buffer
    (if  (equal iswitchb-final-text "")
    (setq buf-sel (car iswitchb-matches)))

    buf-sel))

这是iswitchb-read缓冲区的一部分,我想 负责运作完成机制。

 (defun iswitchb-read-buffer (prompt &optional default require-match
                        start matches-set)
    (let
          (
           (iswitchb-minibuf-depth (1+ (minibuffer-depth)))
           )
       ;; prompt the user for the buffer name
       (completing-read
                 prompt       ;the prompt
                 '(("dummy" . 1)) ;table
                 nil          ;predicate
                 nil ;require-match [handled elsewhere]
                 start  ;initial-contents
                 'iswitchb-history)))

评估

 (iswitchb-read-buffer "Test: ")

结果

测试:{buffer1,buffer2,...}

所以,我认为我是对的。

所以,让我困惑的是sexp:

(iswitchb-minibuf-depth (1+ (minibuffer-depth)))

对迷你缓冲区中的回声有影响。评论这个 sexp,或用另一个替换iswitchb-minibuffer-depth 变量,完成将消失。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

此变量用于从iswitchb-entryfn-p

调用的iswitchb-minibuffer-setup
(defun iswitchb-minibuffer-setup ()
  "Set up minibuffer for `iswitchb-buffer'.
Copied from `icomplete-minibuffer-setup-hook'."
  (when (iswitchb-entryfn-p)
    (set (make-local-variable 'iswitchb-use-mycompletion) t)
    (add-hook 'pre-command-hook 'iswitchb-pre-command nil t)
    (add-hook 'post-command-hook 'iswitchb-post-command nil t)
    (run-hooks 'iswitchb-minibuffer-setup-hook)))

iswitchb-minibuf-depth为空时,iswitchb-entryfn-p为空且设置未完成。

iswitchb-minibuffer-setup是一个添加到iswitchb-mode

的挂钩

答案 1 :(得分:0)

顺便说一下,虽然这可能不会直接回答你的问题,但这部分iswitchb的行为也是由icomplete-mode提供的(对于普通的完成代码)。