Emacs 重新绑定 Ci,同时保留绑定

Emacs 重新绑定 Ci,同时保留绑定

我正在使用 Aquamacs。它可以区分<tab>(实际的 Tab 键)和TAB(来自键入 )C-i。我想永久绑定C-i'next-line。这适用于:

(global-set-key (kbd "TAB") 'next-line)

但是模式映射会用自动完成行为或其他方式覆盖 TAB,这样我就失去了下一行功能。我可以将绑定放在 overriding-terminal-local-map 中,但我更希望模式映射重新映射,<tab>这样我仍然可以使用该模式分配给 tab 的功能。

我可以为使用的每种模式手动重新绑定 Tab,但我希望有一种简单的方法可以将所有TAB映射重定向到 Tab 键而不会弄乱C-i

答案1

这有点棘手,但有可能。针对这种情况,我的做法是创建一个次要模式,即gvol-mode,然后在其中绑定C-iprevious-line(或任何你想要的)。然后我绑定<tab>到下面的函数。

(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这样当我进行键查找时,我的次要模式就不会起作用。因此,如果次要模式未打开,它将找到<tab>C-i的绑定。然后,为了让某些功能正常工作,我必须设置this-commandindent-for-tab-command。我还让它看起来像是我输入的,这允许它与IIRCC-i一起工作。yasnippet-mode

相关内容