Emacs повторно связывает Ci, сохраняя привязки <tab>
Я использую Aquamacs. Можно различить <tab>
, фактическая клавиша табуляции, и TAB
, который приходит от набора текста C-i
, Я хочу связать C-i
в 'next-line
постоянно. Это работает для этого:
(global-set-key (kbd "TAB") 'next-line)
Но тогда карты режима переопределяют TAB с автоматическим завершением поведения или чем-то еще, и я теряю свою функциональность следующей строки. Я мог бы поместить свою привязку в overriding-terminal-local-map, но я бы предпочел переназначить карты режимов <tab>
так что я все еще могу использовать функцию, которую режим назначает вкладке.
Я могу вручную перепривязать вкладку для каждого режима, который я использую, но я надеюсь, что есть простой способ перенаправить все TAB
сопоставления с вкладкой без ошибок C-i
,
1 ответ
Это немного сложно, но возможно. То, что я делаю для этой конкретной ситуации, это создание второстепенного режима, а именно gvol-mode
, а затем в нем привязать Ci к previous-line
(или что хочешь). Затем я связываю
(defun gvol-indent-for-tab-command ()
"This is to fix `indent-for-tab-command' for `gvol-mode'.
It runs [tab] or C-i with `gvol-mode' nil because `gvol-mode'
binds C-i to a different command. Ideally this should take into
account window system so that it can DTRT in a terminal (whatever
the right thing is)."
(interactive)
(let* ((gvol-mode nil)
(command (or (key-binding [tab])
(key-binding "\C-i"))))
;; This is to satisfy `python-indent-line' which checks
;; `this-command' to cycle
(setq this-command 'indent-for-tab-command)
;; Make people think this was called with C-i. This allows
;; `self-insert-command' to work
(setq last-command-event 9)
(call-interactively command)))
Чтобы объяснить это немного, я позволю связать gvol-mode
в nil
так что, когда я делаю поиск ключей, мой второстепенный режим не будет в игре. Таким образом, он найдет привязку для this-command
в indent-for-tab-command
, Я также заставляю его выглядеть так, как будто я набрал Ci, что позволяет ему работать с yasnippet-mode
IIRC.