Запись lisp привязки ключа emacs и не может указывать символ <delete>

По какой-то причине я получил привязку ключа M-del по умолчанию для обратного-kill-слова, сопоставленного с проверкой соответствия скобок, и сброс не работает, поэтому я пытаюсь установить привязку глобального ключа в lisp. Поэтому я написал в ~/.emacs.d/init.el команды lisp:

(глобальный-set-key (kbd "M-h" ) 'слово назад-убить)

(глобальный-set-key (kbd "M- <\delete> " ) 'backward-kill-word)

Я попробовал их с C-x C-e, и они оба выдают вывод "backward-kill-word", но только первая привязка клавиш работает "M-h", другая игнорируется, а M-del все еще пытается выполнить странное действие сканирования. Клавиша удаления работает в emacs в другом месте, поэтому кажется, что "delete" не сопоставляется с физическим ключом в lisp (и обратная косая черта должна отображаться в этом тексте только по мере того, как слово комментируется). Любая идея, какое ключевое слово использовать или специальный символ? Лучший.

(Я искал библиотеки, которые, возможно, переопределили эту команду, но я не могу их найти)

4 ответа

В некоторых системах ключ delete определяется как псевдоним C-d. Это делается через function-key-map в GNU Emacs < 23 и local-function-key-map на GNU Emacs 23. (Я наблюдал это поведение на Debian и Ubuntu 10.04 под X.) Цель таких переводов - изолировать людей, которые кодируют режимы из тоннелей терминала: режиму, который хочет затенять команду delete, нужно только восстановить C-d и не задаться вопросом, следует ли ему перестроить delete (это удаление слева или справа?) или deletechar или что-то еще.

Если существует глобальная или локальная привязка для delete, она трансформирует этот перевод в C-d. Однако, если вы нажмете ESC delete, если глобальная или локальная привязка для ESC delete отсутствует, второй ключ переводится на C-d. Этот перевод имеет приоритет перед интерпретацией ESC delete как M-delete. Итак, ESC delete становится эквивалентным C-M-d.

Это, возможно, ошибка в Emacs: эффект ESC delete должен быть таким же, как M-delete, и нет причин, по которым ESC delete будет запускать down-list, который не имеет ничего общего с удалением.

Существует несколько возможных исправлений; Я не знаю, что лучше. Тот, который должен работать с любой версией Emacs, это

(global-set-key [?\e delete] 'backward-kill-word)


По-настоящему приятная вещь в kbd заключается в том, что вы вводите ту же строку, что и Emacs. Итак, попробуйте следующее

C-h k M-<\delete> (to use your syntax)

или

M-x describe-key M-<\delete>

Emacs (для меня) отвечает:

M-DEL (перевод с < M-delete> ) запускает команду backward-kill-word, который является интерактивным скомпилированным Lispфункции в `simple.el '.

Он связан с M-DEL.

(backward-kill-word arg)

....

Что вы видите, показывает, что представление для требуемого ключа - M-DEL или M-delete.

Это долгий путь к тому, что вы хотите

(global-set-key (kbd "M-delete") 'backward-kill-word)

Конечно, если у вас есть что-то в вашем .emacs, которое отменяет его, то это не поможет. Вам нужно будет найти эту библиотеку и перестать ее использовать (или настроить ее поведение).


Вы можете вызвать global-set-key в интерактивном режиме, чтобы увидеть, как он интерпретирует мета-удаление. Также попробуйте local-set-key, чтобы убедиться, что странная привязка не зависит от режима.


После того, как вы не смогли найти библиотеку, содержащую конфликт, я нашел эту веб-страницу http://www.cs.cmu.edu/cgi-bin/info2www?%28emacs%29Rebinding

Взаимодействие с привязкой клавиш...

`M-x глобальный набор ключей KEY CMD '    Определите KEY глобально, чтобы запустить CMD....

Обычно C-z' is bound to the function suspend-emacs (если вы не используете X Window System), но можете измените C-z' to invoke an interactive subshell within Emacs, by binding it to shell 'следующим образом:

M-x global-set-key <ret> C-z shell </ret>

`global-set-key 'считывает имя команды после ключа. После Вас нажмите клавишу, появится такое сообщение, чтобы вы могли подтвердить, что вы привязываете необходимый ключ:

Set key C-z to command:...

И теперь стандартное значение по умолчанию возвращается, выполняя

M-x глобальный набор ключей M-del...

назад Смертельный слово Но это преходяще и должно выполняться при каждой перезагрузке, чтобы сделать это постоянным? Ввод команды в init.el не переопределяет другой эффект

licensed under cc by-sa 3.0 with attribution.