5

これはおそらく非常に単純ですが、グーグルで調べたときに役立つものは何も見つかりませんでした. だからここに行きます:)

私は Emacs をデーモン モード ( emacs --daemon) で使用していますが、これは非常に便利です。私も dvorak を使用しており、長期的には dvorak への再マッピングC-j(C-cおよびその逆) が非常に便利であることがわかりました。その変換には次のコードを使用します。

(keyboard-translate ?\C-j ?\C-c)
(keyboard-translate ?\C-c ?\C-j)

これは、Emacs をデーモンとして使用していない場合にうまく機能します。新しいクライアント (cli/gui) を起動すると、 にC-jバインドされなくなりましたC-c。なに?

したがって、新しいクライアント フレームを作成した後に を実行する必要があると思いますがkeyboard-translate、その方法がわかりません。どこかで見つけた で試してみdefadviceましたが、うまくいかなかったのであきらめて削除しました。

4

3 に答える 3

8

C-h f keyboard-translate RET次のように述べています。

この変数には、端末ごとに個別のバインドがあります。Info ノード `(elisp)複数のディスプレイ' を参照してください。

参照されている情報ノードが存在しないため、そのドキュメントにはエラーがありますが、これは正しい方向を示しています。検索では、ノードの名前が実際に変更されていることが示唆されています。これは、 http(elisp)Multiple terminals ://www.gnu.org/s/emacs/manual/html_node/elisp/Multiple-Terminals.html で読むこともできます。

GNU および Unix システムでは、各 X ディスプレイは個別のグラフィカル端末です [...] Emacs は、emacsclient プログラムと対話することにより、他のテキストのみの端末に接続することもできます。

そのため、emacs をデーモンとして起動すると、まだ端末に接続されていない (または、少なくとも、自分にとって有用な端末に接続されていない) ため、コマンドは最終的に端末のバインディングを生成しません。使用しています。

このafter-make-frame-functions変数は、これを解決する 1 つの方法を提供します。

(defun my-dvorak-translations (&optional frame)
  "Re-map keys in the current terminal."
  (with-selected-frame (or frame (selected-frame))
    (keyboard-translate ?\C-j ?\C-c)
    (keyboard-translate ?\C-c ?\C-j)))
;; Evaluate both now (for non-daemon emacs) and upon frame creation
;; (for new terminals via emacsclient).
(my-dvorak-translations)
(add-hook 'after-make-frame-functions 'my-dvorak-translations)

実験的には、コマンドを繰り返しても安全であると思われるため、これを端末ごとに 1 回だけ実行することを心配する必要はありません (ただし、実行した場合は、それ(get-device-terminal FRAME)を支援するために を使用できます)。

于 2011-02-21T13:06:50.890 に答える
0

emacsclient が呼び出されるたびに実行される別のフックは です。server-visit-hookこれはおそらく よりも適切ですafter-make-frame-functions

(add-hook 'server-visit-hook 
     (lambda ()
          (keyboard-translate ?\C-j ?\C-c)
          (keyboard-translate ?\C-c ?\C-j)))
于 2012-04-19T17:04:36.350 に答える