web-dev-qa-db-ja.com

<TAB>バインディングを維持しながらEMACS REBIND C-I

私はAquamacsを使っています。 <tab>、実際のタブキー、TABを区別することができます。これはC-iを入力することから来ています。 C-iを永久的に'next-lineにバインドしたいです。これはそのために機能します。

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

しかし、モードマップをマップしますタブを自動完全な動作で、または何でも、私は私の次の行機能を失います。私は自分のバインドを上書きターミナル - ローカルマップに置くことができましたが、モードマップを再マップしたいと思います<tab>してください。モードがタブに割り当てる関数を使用できます。

私は私が使用するすべてのモードのタブを手動で再バインドすることができますが、C-iをめちゃくちゃにすることなくすべてのTABマッピングをタブキーにリダイレクトする簡単な方法があることを願っています。

3
mckeed

それは少しトリッキーですが、可能です。この正確な状況のために私がすることは、マイナーモード、すなわち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を_ $ var] _にしてください。したがって、それは拘束力を見つけるでしょう <tab> また C-i マイナーモードが点灯していない場合、それは整っています。次に、いくつかの機能が機能するためには、this-commandindent-for-tab-commandに設定する必要があります。また、入力したかのように見えます C-i これはyasnippet-mode iircを使って動作させることができます。

2
Ivan Andrus