Emacs: Как я могу устранить пробельный режим при автозаполнении всплывающих окон?

Вот скриншот о том, что происходит не так:

Imgur

Как вы можете видеть, пробельные символы мешают автозаполнению всплывающего текста и делают вещи действительно ужасными.

Когда я действительно хочу, чтобы это выглядело так:

Imgur

Есть ли там кто-нибудь, кто смог использовать режим пробелов, но не смог ли он появиться в автозаполнении?

Ответы

Ответ 1

Существует проблема о совместимости между автозаполнением и whitespace-mode в трекере проблемы с 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)))

По существу это отключает режим пробелов для всего буфера, пока отображается всплывающее окно.

Проблема также сообщается в всплывающей подсказке.

Ответ 2

Переработанный пример, чтобы заставить его работать (частично).

Существуют следующие проблемы, которые предотвращают использование примера @lunaryorn

  • двойная активация команды всплывающих подсказок приведет к тому, что my-prev-whitespace-mode потеряет сохраненную информацию.
  • активация команды popup-delete перед всплывающей кнопкой просто отключает режим пробелов, потому что значение по умолчанию для 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)

У этого решения все еще есть недостатки. Режим Whitespace отключен только при отображении меню. Хотя существует единственный кандидат на замещение, режим пробелов продолжает нарушать экран.

Проблема, скорее всего, с плохим выбором функций для грязного взлома с советами. Должна быть более подходящей, которая называется именно тогда, когда желательно отключить режим пробелов. Но никто, кроме разработчика, не может назвать их.