динамическое расширение в минибуфере больше не работает при обновлении с Emacs 21.2 - PullRequest
0 голосов
/ 16 августа 2010

Продолжая процесс переноса последней и самой лучшей версии Emacs 23.2, я столкнулся с еще одним неприятным сюрпризом: динамическое расширение в минибуфере больше не работает!

При «динамическом расширении в минибуфере»означает функцию, которая позволяет вам слепо нажимать пробел, чтобы завершить имена файлов, переменные и т. д.

Я также вызвал 'Emacs -Q' (чтобы исключить любые артефакты .emacs), и проблема существует не только в Emacs 23.2в Windows XP, но даже с Emacs 22.1 в Ubuntu.

Что-то изменилось в поведении Emacs по умолчанию, но что это такое?

Ответы [ 3 ]

2 голосов
/ 16 августа 2010

Из файла (22.1) NEWS:

** When Emacs prompts for file names, SPC no longer completes the file name.
This is so filenames with embedded spaces could be input without the
need to quote the space with a C-q.  The underlying changes in the
keymaps that are active in the minibuffer are described below under
"New keymaps for typing file names".

If you want the old behavior back, add these two key bindings to your
~/.emacs init file:

  (define-key minibuffer-local-filename-completion-map
         " " 'minibuffer-complete-word)
  (define-key minibuffer-local-must-match-filename-map
         " " 'minibuffer-complete-word)
1 голос
/ 07 февраля 2011

Опубликованное решение работает, но сломается, как только мы доберемся до 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.

0 голосов
/ 16 августа 2010

Отвечая на мой 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)
)

Если вы придумали более элегантное решение, это было бы замечательно, но вышесказанное работает для меня (пока).

...