Подтвердить что ты не робот

Как связать команду с C-i без изменения TAB?

В emacs я хочу привязать команду к C-i. Поэтому я положил (global-set-key "\C-i" 'forward-word)

в моем файле .emacs. Это работает, за исключением того, что теперь клавиша TAB связана с "форвардом".

Как связать команду с C-i без изменения TAB?

4b9b3361

Ответ 1

Короче говоря, это должно решить проблему для вас:

(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)

Ответ 2

Я нашел это решение после большой боли, потерянной в архивах сообщений. Это просто, избегает конфликтов с другими режимами и единственное, что сработало для меня:

;; 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)

Ответ 3

Я рекомендую следующее:

(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.

Ответ 4

Это решение, которое представляет собой комбинацию двух предыдущих, работало для меня. В этом конкретном случае я хотел переназначить 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)

Ответ 5

Возможно, это может помочь, поскольку это помогло мне:

Вместо:

; 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)

Ответ 6

Я придумал свое решение, прежде чем увидеть этот вопрос:

(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-крюк.