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 отключен только при отображении меню. Хотя существует единственный кандидат на замещение, режим пробелов продолжает нарушать экран.
Проблема, скорее всего, с плохим выбором функций для грязного взлома с советами. Должна быть более подходящей, которая называется именно тогда, когда желательно отключить режим пробелов. Но никто, кроме разработчика, не может назвать их.