Механизм iswtichb используется для отображения завершений - PullRequest
2 голосов
/ 08 февраля 2012

все.

Я решил взломать iswitchb сегодня утром и нашел странную вещь.

Обычно, когда мы запускаем команду iswitchb, мы получаем что-то в минибуфере вроде:

iswitch {buffer1, buffer2 ...}

Что в фигурных скобках есть завершения, когда мы набираем его номер сокращается.

И я не нашел, как iswitchb добился этого при взломе его код (извините за мою тупость).

Это оригинальный 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)))

Eval

 (iswitchb-read-buffer "Test: ")

результирующий

Test: {buffer1, buffer2, ...}

Итак, я думаю, что я прав.

Итак, что меня смутило, так это то, как sexp:

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

влияет на эхо в минибуфере. Прокомментируйте это sexp, или замените iswitchb-минибуфер-глубина на другой переменная, дополнения исчезнут.

Любой совет?

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Эта переменная используется в 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.

0 голосов
/ 09 февраля 2012

Кстати, хотя это может не дать прямого ответа на ваш вопрос, эта часть поведения iswitchb также обеспечивается icomplete-mode (для нормального кода завершения).

...