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 так что, когда я делаю поиск ключей, мой второстепенный режим не будет в игре. Таким образом, он найдет привязку для или Ci, которая была бы на месте, если бы второстепенный режим не был включен. Затем, чтобы некоторые функции работали, я должен установить this-command в indent-for-tab-command, Я также заставляю его выглядеть так, как будто я набрал Ci, что позволяет ему работать с yasnippet-mode IIRC.

Другие вопросы по тегам