这是出现问题的屏幕截图:
如您所见,空白字符妨碍了自动完成的弹出文本,使事情看起来非常糟糕。
真的,我希望它看起来像这样:
有没有人能够使用空白模式但消除它在自动完成的东西中弹出?
Prelude 问题跟踪器中存在关于自动完成和空白模式之间兼容性的问题,该问题在其评论中具有以下解决方法(与原始版本相比有所改进):
(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 问题跟踪器中报告。
重做示例以使其工作(部分)。
有以下问题阻止@lunaryorn 的示例工作
my-prev-whitespace-mode
丢失存储的信息my-prev-whitespace-mode
nil。因此,我进一步改进了最初的解决方法以解决这两个困难。
(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)
该解决方案仍然存在缺陷。只有在显示菜单时才会禁用空白模式。虽然只有一个候选替代品,但空白模式继续扰乱屏幕。
这个问题很可能是因为函数选择不好,用建议来破坏。当需要禁用空白模式时,应该有更合适的调用。但除了开发者之外,没有人能说出它们的名字。