以下是出现问题的屏幕截图:
正如你所看到的,空白字符妨碍了自动完成弹出文本并使事情变得非常糟糕。
真的,我希望它看起来像这样:
那里有没有人能够使用空白模式但是却不能在自动完成的东西中弹出?
答案 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)
这种解决方案仍然存在缺陷。仅在显示菜单时才禁用空白模式。虽然只有单个替换候选者,但空白模式继续破坏屏幕。
这个问题最有可能是错误的选择,以便通过建议来破解黑客行为。当需要禁用空白模式时,应该更准确地调用。但除了开发人员之外,没有人可以为他们命名。