В emacs я хочу привязать команду к C-i. Поэтому я положил (global-set-key "\C-i" 'forward-word)
в моем файле .emacs. Это работает, за исключением того, что теперь клавиша TAB связана с "форвардом".
Как связать команду с C-i без изменения TAB?
В emacs я хочу привязать команду к C-i. Поэтому я положил (global-set-key "\C-i" 'forward-word)
в моем файле .emacs. Это работает, за исключением того, что теперь клавиша TAB связана с "форвардом".
Как связать команду с C-i без изменения TAB?
Короче говоря, это должно решить проблему для вас:
(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map))
(global-set-key (kbd "C-i") 'forward-word)
Более длинная версия:
Из документации emacs lisp по функциональным клавишам:
В ASCII Ci и <TAB> - это один и тот же символ. Если терминал может различать их, Emacs передает различие программам на Lispе, представляя первое как целое число 9, а второе как символьную табуляцию.
Большую часть времени не полезно различать два. Таким образом, обычно local-function-key-map (см. Translation Keymaps) настроен для отображения вкладки на 9. Таким образом, привязка клавиш для кода символа 9 (символ Ci) также применяется к tab. Аналогично для других символов в этой группе. Функция read-char также преобразует эти события в символы.
Итак, когда вы сделаете следующее, вы увидите разницу в привязках клавиш:
(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map))
;; this is C-i
(global-set-key (kbd "C-i") (lambda () (interactive) (message "C-i")))
;; this is <tab> key
(global-set-key (kbd "<tab>") (lambda () (interactive) (message "<tab>")))
Обратите внимание, что в каждом режиме различные привязки TAB устанавливаются по-разному, поэтому вам может потребоваться выполнить настройку для каждого интересующего вас режима.
Зависимость от версии:
Вышесказанное работает для Emacs 23.1. Из файла NEWS:
Последовательности функциональных клавиш теперь отображаются с использованием новой переменной local-function-key-map. Это наследуется от глобальной переменной function-key-map, которая больше не используется напрямую.
Это означает, что в версиях 22 и ранее вы можете получить тот же эффект, используя переменную function-key-map
. Я проверил это и обнаружил, что он работает с Emacs 21.
(setq local-function-key-map (delq '(kp-tab . [9]) function-key-map))
(global-set-key (kbd "C-i") 'forward-word)
Я нашел это решение после большой боли, потерянной в архивах сообщений. Это просто, избегает конфликтов с другими режимами и единственное, что сработало для меня:
;; Translate the problematic keys to the function key Hyper:
(keyboard-translate ?\C-i ?\H-i)
(keyboard-translate ?\C-m ?\H-m)
;; Rebind then accordantly:
(global-set-key [?\H-m] 'delete-backward-char)
(global-set-key [?\H-i] 'iswitchb-buffer)
Я рекомендую следующее:
(define-key input-decode-map (kbd "C-i") (kbd "H-i"))
(global-set-key (kbd "H-i") 'whatever-you-want)
Он должен работать, по крайней мере, с Emacs 23.
Это похоже на технологию перевода клавиатуры в ответе Кайо, но работает на несколько более высоком уровне.
Недостатком клавиатуры является то, что она вступает в силу даже
когда Emacs не запускает последовательность клавиш чтения и, в частности, C-q C-i
больше не будет работать как способ вставить буквенный символ табуляции.
Изменение карты локальных клавиш-функций не работает, потому что обычно
вы хотите, чтобы клавиша <tab>
продолжала делать то, что имеет текущий режим
для TAB
.
Это решение, которое представляет собой комбинацию двух предыдущих, работало для меня. В этом конкретном случае я хотел переназначить C-i на предыдущую строку. Это решение сохраняет функциональность TAB в минибуфере. Обратите внимание, что TAB необходимо уточнить локально для режимов, которые вы используете с помощью крючка:
; As mentioned in the other solution, C-i and TAB are the same character in ASCII.
; We have to differentiate between the two and reassign each in a roundabout way.
; differentiate tab from C-i
(setq local-function-key-map (delq '(kp-tab . [9]) function-key-map))
;; Translate the problematic key to the function key Hyper:
(keyboard-translate ?\C-i ?\H-i)
;; Rebind accordingly
(global-set-key [?\H-i] 'previous-line)
; Finish by redefining tab for c-mode.
(defun my-c-mode-common-hook ()
(local-set-key (kbd "<tab>") 'indent-for-tab-command)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
Возможно, это может помочь, поскольку это помогло мне:
Вместо:
; differentiate tab from C-i
(setq local-function-key-map (delq '(kp-tab . [9]) function-key-map))
Try:
(define-key local-function-key-map [tab] nil)
Я придумал свое решение, прежде чем увидеть этот вопрос:
(define-key input-decode-map [#x2000009] [#x6000069]) ; C-S-i
(define-key input-decode-map [#x200000d] [#x600006d]) ; C-S-m
(define-key input-decode-map "\C-i" [#x4000069])
(define-key input-decode-map "\C-m" [#x400006d])
(define-key input-decode-map "\C-[" [#x400005b])
Причина этого заключается в том, что код ключа, который генерирует буквенный ключ, является "реальным" кодовым кодом [слева], тогда как код ключа, который содержит вкладка, введите, escape-генерация, являются символами функциональных клавиш. Символы функциональных клавиш уже отображаются на карте ввода-декодирования на те же символы, что буквы естественным образом генерируются, и будут продолжать работать.
Коды клавиш, которые я сопоставил им, использовать тот же механизм, что и коды клавиш для C-0 и т.д. [т.е. ключи, которые не имеют управляющих кодов в ASCII]. Таким образом, они описаны как, например, C-i (поскольку они исключены из специального корпуса, который описывает их как TAB/etc), и все еще имеют модификаторы событий /event -basic-type (control)/? I.
Недостатком является то, что с ними немного сложнее работать - вам нужно использовать числа, поскольку они не будут генерироваться (kbd), и вы не можете вызвать функцию или переменную в векторном литерале. Если вы привяжете C-i или C-m к функции движения, она будет работать с выбором сдвига (поскольку, хотя они и являются "поддельными" клавишами, режим все еще знает, что C-S-m сдвинут и что он нормальный эквивалент C-m)
ПРИМЕЧАНИЕ. Это повлияет на текстовые терминалы, поэтому, если вы используете текстовые терминалы, вам нужно будет определить, работает ли gui с помощью (when window-system ...)
- если вы используете Emacs Daemon с графическими окнами, вы можете захотеть поместить это в окно -setup-крюк.