【问题标题】:Emacs: How can I eliminate whitespace-mode in auto-complete pop-ups?Emacs:如何消除自动完成弹出窗口中的空白模式?
【发布时间】:2012-10-19 00:40:35
【问题描述】:

这是出错的屏幕截图:

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

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

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

【问题讨论】:

    标签: emacs elisp dot-emacs


    【解决方案1】:

    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 中也报告了此问题。

    【讨论】:

    • 我试过这个,当弹出窗口显示时,空白模式被成功禁用。但是当弹出窗口消失时,空白模式不会再次启用。
    • @sgmonda 很抱歉,但我无法帮助您解决此问题。我只是调整了原来的解决方法。我根本不使用自动完成功能。但是,我的答案中的第一个链接提供了此解决方法的更新版本,可与最新版本的 Prelude 一起使用。
    【解决方案2】:

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

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

    • 两次激活弹出式绘图建议会导致my-prev-whitespace-mode 丢失存储的信息
    • 在 popup-draw 之前激活 popup-delete 建议只会关闭空白模式,因为 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)
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 2022-12-03
      • 2022-01-19
      • 2013-07-14
      • 2017-08-01
      • 2014-09-30
      • 2012-02-06
      • 2012-06-11
      • 1970-01-01
      相关资源
      最近更新 更多