Я хочу сделать Control-i
выступление indent-region
(в основном, поскольку XCode уже построил эту мышечную память).
Я понимаю это Control-i
и tab
неразличим в смысле Ascii, но они в смысле кода ключа.
Я попробовал очевидное:
(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)
безрезультатно - нажатие Control-i
все равно делает то, что tab
делает клавиша в текущем контексте. Что я могу сделать, чтобы помочь Emacs по-другому относиться к кнопке вкладки Control-i
?
Обновление: я полагаю, что эквивалентный результат был бы достигнут, если бы можно было переназначить то, что tab
/ Control-i
нажимает, когда выбран регион.
Ответы:
Я не думаю, что это может быть достигнуто с терминала, но в режиме графического интерфейса вы можете попробовать это:
Я делаю то же самое с
C-m
тем, чтобы его можно было отличить отRET
РЕДАКТИРОВАТЬ:
Следующее должно работать, если вы находитесь в режиме GUI или TTY:
Это не красиво, но, кажется, делает работу. Я приветствую любые уточнения или изменения этого кода по мере необходимости.
источник
<C-i>
и[C-i]
может быть произвольным идентификатором, как<foobar>
и[foobar]
, и он все равно будет работать; просто не называйте этоtab
илиbackspace
.emacs
файл , но какTAB
иC-i
перераспределяется :-( @nispio(window-system)
вернулсяnil
в момент.emacs
загрузки. Это может быть связано с тем, что вы запускаете неграфический экземпляр Emacs, или потому, что вы запускаете демон Emacs.Рамки GUI
В фреймах GUI (X11, Windows, OSX,…) Emacs считывает Tabключ как
tab
функциональную клавишу. Однако, поскольку Tabклавиша на терминалах традиционно отправляет символ^I
( Control + I), Emacs переводитtab
функциональную клавишу в символ Control + I (символ 9), который отображается какTAB
. Этот перевод сделан черезfunction-key-map
.Аналогичный перевод происходит с некоторыми другими функциональными клавишами. ( Backspaceи Deleteэто сложный случай, который я не буду подробно обсуждать здесь.)
Если вы хотите полностью отделить Tabот Ctrl+ I, удалите привязку из
function-key-map
:Однако это не очень полезно, потому что записи в
function-key-map
переопределяются привязками в зависимых от режима раскладках клавиш или в глобальной карте. Поэтому, если вы хотите определить другую привязку дляtab
, просто сделайте это (в Elisp, а не в интерактивном режиме, потому что приглашение чтения ключа применяетfunction-key-map
перевод, так что вы в конечном итоге перепривязываете,TAB
а неtab
):Все стандартные режимы, которые изменяют действие Tabклавиши, делают это, изменяя
TAB
ключ, который является псевдонимом дляC-i
символа, сгенерированного комбинацией клавиш Ctrl+ I. Если вы хотите, чтобы стандартные привязки применялисьtab
вместоC-i
, вместо этого , оставляйтеfunction-key-map
и изменяйте сопоставления клавиш в одиночку, а вместо этого перенаправляйте Ctrl+ Iна другую клавишу.Теперь Emacs сообщит Ctrl+ Iкак «
<control-i>
(перевод сTAB
)». Это не красиво, но неизбежно: красивая печать символа 9TAB
встроена в исходный код Emacs.Клеммные рамы
В терминальных кадрах проблема сложнее и часто невозможна. Терминалы не передают ключи, они передают символы (точнее, фактически, они передают байты). TabКлюч передается как символ табуляции - который Control + I, такой же , как то , что комбинация клавиш Ctrl+ Iгенерирует. Функциональные клавиши, которые не имеют соответствующего символа (например, клавиши курсора), передаются как escape-последовательности, то есть последовательности символов, начинающиеся с
ESC
= Control + [(именно поэтому Emacs определяет escapeкак префиксную клавишу -ESC
должен быть префиксом). См. Как работают ввод с клавиатуры и вывод текста? для получения дополнительной информации.Существует несколько терминалов, которые можно настроить для отправки различных последовательностей клавиш для функциональных клавиш, но не так много. Это поддерживают как libtermkey / libtickit от LeoNerd, так и xterm Томаса Дики (начиная с версии 216). В Xterm эта функция является необязательной и активируется через
modifyOtherKeys
ресурс. Однако я не знаю ни одного популярного эмулятора терминала, кроме xterm, который бы это поддерживал, в частности многих эмуляторов, построенных на libvte . Некоторые терминальные эмуляторы позволяют вам делать это вручную через пользовательскую переписку из цепочек ключей для экранирования последовательностей.Этот механизм позволяет различать многие комбинации клавиш, а не только tab / Ci, return / Cm и escape / C- [. См. Проблемы с сочетаниями клавиш при использовании терминала для более подробного описания.
Базовая функция xterm поддерживается начиная с Emacs 24.4. Однако основы (в частности Tab, Return, Escape, Backspace) до сих пор отправить традиционные управляющие символы, потому что это то , что ожидают приложение. Существует режим, в котором Ctrl+ letterотправляет escape-последовательность вместо управляющего символа. Поэтому, чтобы отличить функциональные клавиши от Ctrlкомбинаций в Emacs 24.4, измените его поддержку для
modifyOtherKeys
использования этого режима, установив для ресурса значение 2 вместо 1.источник