在Emacs迷你缓冲区中启用自动完成功能

时间:2011-09-22 13:16:09

标签: emacs elisp

我正在尝试在迷你缓冲区中转换auto-complete

(add-hook 'minibuffer-setup-hook 'auto-complete-mode)

我得到的是auto-complete在迷你缓冲器的第一个实例中工作,但不再是。这是加载后的完整minibuffer-setup-hook

(auto-complete-mode turn-on-visual-line-mode ido-minibuffer-setup rfn-eshadow-setup-minibuffer minibuffer-history-isearch-setup minibuffer-history-initialize)

如何持续开启auto-complete

3 个答案:

答案 0 :(得分:7)

如果该函数充当切换(大多数次要模式都是如此),您很少想要将函数符号添加到钩子变量。

minibuffer-setup-hook在“进入迷你缓冲区后”运行,这意味着您第一次进入迷你缓冲区时将启用自动完成模式;第二次禁用它;第三次启用它;等...

通常,您会查看是否有预定义的turn-on-autocomplete-mode类型的函数,或者定义您自己的函数:

(defun my-turn-on-autocomplete-mode ()
  (autocomplete-mode 1)) ;; an argument of 1 will enable most modes
(add-hook 'minibuffer-setup-hook 'my-turn-on-auto-complete-mode)

我无法测试,因为您没有链接到您正在使用的自动完成模式。

答案 1 :(得分:4)

“自动完成模式”的创建者明确排除用于自动完成的迷你缓冲区。次要模式的定义是:

(define-global-minor-mode global-auto-complete-mode
  auto-complete-mode auto-complete-mode-maybe
  :group 'auto-complete)

所以“开启模式”功能是“自动完成模式 - 可能” - 该功能的定义是:

(defun auto-complete-mode-maybe ()
  "What buffer `auto-complete-mode' prefers."
  (if (and (not (minibufferp (current-buffer)))
           (memq major-mode ac-modes))
      (auto-complete-mode 1)))

如果当前缓冲区是迷你缓冲区,则此函数在if语句中显式测试,如果是,则不打开自动完成模式。

如果你想在迷你缓冲区中使用自动完成模式,你可能应该联系该模式的维护者并问他为什么要排除迷你缓冲区以及他认为在迷你缓冲区中启用模式所需的编程更改。

答案 2 :(得分:0)

Zev打电话给我注意auto-complete-mode-maybe,这是必要的修改(文件auto-complete.el,所有更改都有注释):

;; Add this variable
(defcustom ac-in-minibuffer t
  "Non-nil means expand in minibuffer."
  :type 'boolean
  :group 'auto-complete)

...

(defun ac-handle-post-command ()
  (condition-case var
      (when (and ac-triggered
                 (not (ido-active)) ;; Disable auto pop-up in ido mode
                 (or ac-auto-start
                     ac-completing)
                 (not isearch-mode))
        (setq ac-last-point (point))
        (ac-start :requires (unless ac-completing ac-auto-start))
        (ac-inline-update))
    (error (ac-error var))))

...

(defun auto-complete-mode-maybe ()
  "What buffer `auto-complete-mode' prefers."
  (if (or (and (minibufferp (current-buffer)) ac-in-minibuffer) ;; Changed
          (memq major-mode ac-modes))
      (auto-complete-mode 1)))

.emacs

(add-hook 'minibuffer-setup-hook 'auto-complete-mode)

当然,存在约束性冲突,但有可能解决它们。