Динамическое расширение в минибуфере больше не работает при совершенствовании от Emacs 21.2
-
29-09-2019 - |
Вопрос
Продолжая свой процесс миграции последних и самых больших Emacs 23.2, я ударил еще один неприятный сюрприз: динамическое расширение в минибуфере больше не работает!
«Динамическое расширение в минибуфере» я имею в виду эту функцию, которая позволяет слепо наступить на пробел для полных файлов, переменных и т. Д.
Я также вызвал «Emacs -q» (исключить любые артефакты .emacs), и проблема существует не только с Emacs 23.2 на Windows XP, но даже с Emacs 22.1 на Ubuntu.
Что-то изменилось в поведении по умолчанию Emacs, но что это?
Решение
Из (22.1) новостной файл:
** Когда EMACS подсказывает имена файлов, SPC больше не завершает имя файла. Это так, чтобы имена имена встроенных пространств могут быть введены без необходимости процитировать пространство с помощью CQ. Основные изменения в Ke'maps, которые активны в минибуфере, описаны ниже в разделе «Новые keymaps для печати имен файлов». Если вы хотите, чтобы старое поведение обратно добавьте эти два ключевых привязки в файл in ~ / .emacs init: (определить-ключ minibuffer-local-filename-map-map "" Minibuffer - Complete-Word) (минибуфер Local-Must-Match-filename - карта "" "Minibuffer-complete-word)
Другие советы
Прикрепленное решение работает, но сломается, как только мы доберемся до Emacs V24, а затем. Я бы порекомендовал вместо этого, связывая define-key
Призывает к наличию новых карт, как так:
(if (boundp 'minibuffer-local-filename-completion-map)
(define-key minibuffer-local-filename-completion-map " " 'minibuffer-complete-word))
(if (boundp 'minibuffer-local-must-match-filename-map)
(define-key minibuffer-local-must-match-filename-map " " 'minibuffer-complete-word))
Это должно правильно работать для всех версий Emacs.
Отвечая на мой 2-й вопрос (в комментарии):
(defmacro GNUEmacs23 (&rest body)
(list 'if (string-match "GNU Emacs 23" (version))
(cons 'progn body)))
(defmacro GNUEmacs22 (&rest body)
(list 'if (string-match "GNU Emacs 22" (version))
(cons 'progn body)))
(GNUEmacs22
(define-key minibuffer-local-filename-completion-map " " 'minibuffer-complete-word)
(define-key minibuffer-local-must-match-filename-map " " 'minibuffer-complete-word)
)
(GNUEmacs23
(define-key minibuffer-local-filename-completion-map " " 'minibuffer-complete-word)
(define-key minibuffer-local-must-match-filename-map " " 'minibuffer-complete-word)
)
Если вы придумаете более элегантное решение, это было бы здорово, но вышеперечисленное работает для меня (на данный момент).