【发布时间】:2012-10-19 00:40:35
【问题描述】:
这是出错的屏幕截图:
如您所见,空白字符妨碍了自动完成的弹出文本,让事情看起来非常糟糕。
真的,我希望它看起来像这样:
有没有人能够使用空白模式但消除它在自动完成的东西中弹出?
【问题讨论】:
这是出错的屏幕截图:
如您所见,空白字符妨碍了自动完成的弹出文本,让事情看起来非常糟糕。
真的,我希望它看起来像这样:
有没有人能够使用空白模式但消除它在自动完成的东西中弹出?
【问题讨论】:
Prelude 问题跟踪器中有一个issue about compatibility between auto-complete and whitespace-mode,它在其 cmets 中有以下解决方法(与原始版本相比有所改进):
(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 中也报告了此问题。
【讨论】:
重做示例以使其工作(部分)。
有以下问题阻止@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)
此解决方案仍有缺点。只有在显示菜单时才会禁用空白模式。虽然只有一个候选替代品,但空白模式会继续破坏屏幕。
这个问题很可能是因为函数的选择不当而导致使用建议进行肮脏的破解。当需要禁用空白模式时,应该有更合适的调用。但除了开发者之外,没有人能说出它们的名字。
【讨论】: