Emacs:如何消除自动完成弹出窗口中的空白模式?

时间:2012-10-19 00:40:36

标签: emacs elisp dot-emacs

以下是出现问题的屏幕截图:

Imgur

正如你所看到的,空白字符妨碍了自动完成弹出文本并使事情变得非常糟糕。

真的,我希望它看起来像这样:

Imgur

那里有没有人能够使用空白模式但是却不能在自动完成的东西中弹出?

2 个答案:

答案 0 :(得分:2)

Prelude问题跟踪器中有一个issue about compatibility between auto-complete and whitespace-mode,其评论中有以下解决方法(与原始版本略有提升):

(defvar my-prev-whitespace-mode nil)
(make-variable-buffer-local 'my-prev-whitespace-mode)

(defadvice popup-draw (before my-turn-off-whitespace activate compile)
  "Turn off whitespace mode before showing autocomplete box"
  (if whitespace-mode
      (progn
        (setq my-prev-whitespace-mode t)
        (prelude-turn-off-whitespace))
    (setq my-prev-whitespace-mode nil)))

(defadvice popup-delete (after my-restore-whitespace activate compile)
  "Restore previous whitespace mode when deleting autocomplete box"
  (if my-prev-whitespace-mode
      (prelude-turn-on-whitespace)))

基本上,这会在显示弹出窗口时禁用整个缓冲区的空白模式。

此问题也在popup.el issue tracker中报告。

答案 1 :(得分:1)

重新设计的示例使其工作(部分)。

以下问题阻止了@ lunaryorn的工作

  • 双重激活弹出式绘制建议会导致my-prev-whitespace-mode丢失存储的信息
  • 在弹出式绘制之前激活弹出式删除建议只会关闭空白模式,因为my-prev-whitespace-mode的默认值为零。

因此,我进一步发展了原始的解决方法,以解决这两个难题。

(defun my:force-modes (rule-mode &rest modes)
  "switch on/off several modes depending of state of
    the controlling minor mode
  "
  (let ((rule-state (if rule-mode 1 -1)
       ))
    (mapcar (lambda (k) (funcall k rule-state)) modes)
  )
)

(require 'whitespace)

(defvar my:prev-whitespace-mode nil)
(make-variable-buffer-local 'my:prev-whitespace-mode)
(defvar my:prev-whitespace-pushed nil)
(make-variable-buffer-local 'my:prev-whitespace-pushed)

(defun my:push-whitespace (&rest skip)
  (if my:prev-whitespace-pushed () (progn
    (setq my:prev-whitespace-mode whitespace-mode)
    (setq my:prev-whitespace-pushed t)
    (my:force-modes nil 'whitespace-mode)
  ))
)

(defun my:pop-whitespace (&rest skip)
  (if my:prev-whitespace-pushed (progn
    (setq my:prev-whitespace-pushed nil)
    (my:force-modes my:prev-whitespace-mode 'whitespace-mode)
  ))
)

(require 'popup)

(advice-add 'popup-draw :before #'my:push-whitespace)
(advice-add 'popup-delete :after #'my:pop-whitespace)

这种解决方案仍然存在缺陷。仅在显示菜单时才禁用空白模式。虽然只有单个替换候选者,但空白模式继续破坏屏幕。

这个问题最有可能是错误的选择,以便通过建议来破解黑客行为。当需要禁用空白模式时,应该更准确地调用。但除了开发人员之外,没有人可以为他们命名。