Как отличить Ci от TAB?


20

Обычно по историческим причинам emacs рассматривает TABкод и C-iключ как один и тот же, ср. документация по emacs lisp по функциональным клавишам или ответ abo-abo на вопрос "В чем разница между TAB и?" ,

Примечание: В этой статье, являются коды клавиш TAB, <tab>и C-i; tabи Ctrl+ iс другой стороны - это физические клавиши на клавиатуре.

Тем не менее, на данный момент, Emacs обрабатывает TABи C-iто же самое, то есть (equal (kbd "TAB") (kbd "C-i"))-> t.

Однако, поскольку мы больше не живем в камне вычислений, я нахожу это чрезвычайно раздражающим. Есть несколько предложений, что можно сделать, чтобы обойти это, например,

  • «Как связать команду с Ci, не меняя TAB?»

    • Решение Трея у меня не сработало, переменная local-function-key-mapsне изменилась. Изменение его для использования, deleteа delqне в результате приводит к измененной переменной, но это не приводит к разрешению ... tabи Ctrl+ iвсе те же.
    • Перевод на гиперкарту кажется обходным решением 1980-х годов ... Я мог бы также использовать Hyper+ i.
  • Использование input-decode-mapto map Ctrl+ iк некоторому управляющему коду после ASCII - почти то, что я ищу. За исключением того, что он не работает должным образом с kbdмакросом, что означает, что нужно изменить все биты исходного кода, который будет связывать Ctrl+ i. Возможно, это лучшее решение, учитывая, что весь исходный код изменен правильно.

  • Используя (kbd "<tab>")для tabи (kbd "C-i")(что переводится (kbd "TAB")т.е. \tЛитерал) для Ctrl+ i делает работу , но вы должны изменить все исходные файлы , которые используют неправильный вид tab[читай: скан TAB] , который раздражает.
    Это было предложено, например, в выпуске github, а также на emacs.sx .

Ни одно из этих решений не кажется реальным, я бы предпочел рассматривать их как обходные пути или хаки (из существующей ошибки ).

Есть ли способ заставить emacs отображаться tabна (kbd "<tab>")и (kbd "TAB")пока Ctrl+ iотображается так, чтобы (kbd "C-i")не модифицировать исходный код emacs?

Такой подход должен быть полностью невидимым для пользователя, а это означает , что , tabкак коды клавиши <tab>и TABдолжно быть связанно с одним связывающих в то время как Ctrl+ , iкак клавиатурные C-iследует сопоставить с другим обязательным.

На менее серьезном замечании: есть ли здесь разработчики emacs, которые могут прокомментировать, будет ли это когда-нибудь изменено / исправлено в исходном коде emacs?


2
Обратите внимание, что TABи C-i(коды, а не ключи) являются одним и тем же по определению TAB.
Стефан

@Stefan Вот почему я добавил ноту . Я собираюсь редактировать пост и поместить его там.
elemakil


IMO, этот вопрос не является дубликатом, потому что он хочет переместить все сочетания клавиш, определенные в TAB (даже те из внешних пакетов), чтобы использовать вместо них <tab>. В то время как другой вопрос спрашивал, как дифференцировать их в вашем собственном коде.
Малабарба

Мое предложение было бы посоветовать kbdперевести TAB как [tab]. Это просто не будет работать для предустановленных частей Emacs.
Малабарба

Ответы:


21

Будущее давно ушло, и каменный век компьютерных технологий скоро наступит. Все текстовые терминалы, которые я знаю, по-прежнему отправляют в Emacs точно такую ​​же последовательность байтов, C-iкак и для TAB, так что первоначальная необходимость их «объединить» все еще остается у нас.

Карта ввода-декодирования (а-ля (define-key input-decode-map "\C-i" [C-i])), вероятно, примерно так же хороша, как и сейчас.

Будучи бывшим сопровождающим Emacs, я бы приветствовал лучшее решение этой проблемы, чтобы освободить ключи C-iC-mи C-[) в графическом интерфейсе (возможно, сделать их «зарезервированными для пользователя»). Но я не знаю, как это сделать, не вызывая много проблем с существующими пакетами.



Интересно, какие клавиатуры вы используете? С типичными клавиатурами QWERT различие просто очевидно, и неспособность различить эти клавиши является такой болью ...
Иван Хуанг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.