17

这是出现问题的屏幕截图:

伊姆古尔

如您所见,空白字符妨碍了自动完成的弹出文本,使事情看起来非常糟糕。

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

伊姆古尔

有没有人能够使用空白模式但消除它在自动完成的东西中弹出?

4

2 回答 2

2

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 问题跟踪器中报告。

于 2012-10-20T09:36:49.440 回答
1

重做示例以使其工作(部分)。

有以下问题阻止@lunaryorn 的示例工作

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

因此,我进一步改进了最初的解决方法以解决这两个困难。

(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)

该解决方案仍然存在缺陷。只有在显示菜单时才会禁用空白模式。虽然只有一个候选替代品,但空白模式继续扰乱屏幕。

这个问题很可能是因为函数选择不好,用建议来破坏。当需要禁用空白模式时,应该有更合适的调用。但除了开发者之外,没有人能说出它们的名字。

于 2015-01-15T09:43:39.593 回答