2016-09-21 10 views
1

Я немного смущен разницей между ключами и привязками клавиш в emacs после прочтения первой главы «Написание GNU Emacs Extensions» (книга О'Рейли).Emacs: отношение между нажатиями клавиш и клавишами

Глава начинается с того, что в некоторых версиях emacs клавиши backspace и DEL активируют меню справки вместо удаления. Другими словами, они ссылаются на то, что вызывается C-h.

Далее в главе рассказывается, как изменить это поведение с помощью кода Lisp. Это делается путем привязки нажатия клавиши C-h к команде delete.

Это немного сбивает с толку. На мой взгляд, DEL, Backspace и C-h - это три разных нажатия клавиш (первые два из которых состоят из одного ключа).

Почему переназначение C-h эффекта, что делает DEL и Backspace?

Я бы подумал изменить, что такое backspace, например, вы переделаете backspace в другую команду, а не нажатие клавиши C-h.

ответ

3

Если не переназначен низкоуровневым драйвером клавиатуры, то эффект клавиши Backspace заключается в отправке символа с цифровым кодом 8, который в определенных операционных системах является точно таким же кодом, сгенерированным нажатием Control-h. Вы можете проверить этот факт, просто написав что-нибудь в оболочке unix (или linux), а затем нажав Backspace и Control-h: оба из них имеют эффект стирания предыдущего символа, поскольку символ с цифровым кодом 8 интерпретируется операционным в качестве контрольного символа BS, backspace, используется для стирания последнего символа или его надпечатки (см. wikipedia). Аналогично, Control-J эквивалентен ключу RETURN и т. Д. На той же странице в Википедии описывается DEL как «изначально предназначенный для игнорируемого символа, но теперь используемый в некоторых системах для стирания символа».

Итак, когда вы назначаете команду нажатию клавиши, вы фактически назначаете команду символьному коду, и если два или более ключа генерируют один и тот же код, нажимая их, вы вызываете ту же команду.

+0

Я вижу, это имеет смысл! Следующий вопрос: в некоторых версиях emacs RETURN вызывает новую строку и отступ, а C-J вызывает только новую строку. Как можно назначить две разные команды, как вы утверждали, - по сути, один и тот же код символа? – nsimplex

+0

Если они генерируют один и тот же код символа, я думаю, что это невозможно, если вы не переназначите их каким-либо другим способом на уровне операционной системы. – Renzo

+1

Также обратите внимание, что существует существенная разница в отношении кодов ключей, полученных Emacs, между запуском Emacs в терминале и запуском его в качестве приложения GUI. GUI Emacs получает возможность различать множество ключевых последовательностей, которые неразличимы в терминале. – phils

0

@Renzo ответил на ваш вопрос о том, как эти ключи связаны, и как привязка может показаться влияющей на другую. Вот еще информация о том, что происходит в этом конкретном случае.

См. Руководство Emacs, узел DEL Does Not Delete.

Там вы увидите это, после объяснения проблемы/путаницы:

Чтобы исправить эту проблему в каждом сеансе Emacs, положить одну из следующих строк в файле инициализации (* Примечание Файл инициализации : :). Для первого случае выше, где BACKSPACE удаляет вперед, а не назад, используйте эту линию, чтобы сделать BACKSPACE действовать как DEL:

(normal-erase-is-backspace-mode 0) 

Для двух других случаях используйте эту строку:

(normal-erase-is-backspace-mode 1) 

Еще один способ исправить проблему для каждого сеанса Emacs - настроить переменную normal-erase-is-backspace: значение t определяет режим, в котором BS или BACKSPACE является DEL, и nil specific в другом режиме. * Примечание. Легкая настройка ::.

См. Также GNU Emacs FAQ question about Backspace invoking help. Там вы увидите, в дополнение к информации, аналогичной той, что выше, информация о том, как переназначить DEL на UNIX - использовать это:

stty erase '^?' 

WRT C-j и RET (не упомянуто в вопросе, но упоминается в @ Renzo): поведение Emacs по умолчанию изменилось в большинстве режимов программирования, в Emacs 24.4.

Начиная с этой версией, electric--indent-mode включена по умолчанию, что означает, что RET вставляет символ новой строки и отступы, а C-j просто вставляет символ новой строки. До этого релиза эти клавиши имели противоположное поведение. Если вы предпочитаете старое поведение, сделайте это, чтобы отключить electric-indent-mode:

(when (fboundp 'electric-indent-mode) 
    (electric-indent-mode -1)) ; Use classic `C-j' and `RET'.