私のinitファイルは、私の.emacs
ファイルがOS固有のinitを指すシンボリックリンクであり、OSの影響を受けない構成でメインのinitファイルをロードするように設定されています。サーバー以外のemacsのこのセットアップには問題はありませんでした。
ただし、emacsclientを使用する場合は正しく機能しません。たとえば、org-mode
の設定があるので、OSXのターミナルでは、S-Tab
がバックタブにマップされ、未定義のキーに関するエラーをスローする代わりに正しく機能します。 emacsサーバーを使用していない場合、この設定は正常に機能します。 emacsclientを使用していると、未定義のキーバインドのエラーが発生します。
サーバーの起動時にファイルに入力した(メッセージ "whatever")行が正常に表示されるため、すべてのinitファイルがエラーなしでロードされていることがわかります。したがって、emacsサーバーが何らかの理由でファイルを失っているわけではありません。これは、マップされたキーがサーバーに読み込まれたが、クライアントが接続したときに忘れられたようです。emacsclientバッファーでキーマッピングのeval
を一度試しましたが、エラーはありませんが、変更はありません。何か案は?
(ところで、--debug-init
は何も奇妙なことを示していません。すべてがエラーなしでロードされています。)
あなたの問題は、.emacsファイルがlocal-function-key-map
またはinput-decode-map
のようなものを設定していることだと思いますが、これらの変数はターミナルローカルです。つまり、すべての「ターミナル」(GUIは1つの「ターミナル」であり、テキスト端末を介したemacsclient接続は別の「端末」になります)は、この変数の異なる値を取得します。
したがって、新しい端末ごとにそのコードを再実行する必要があります。 reza.safiyatが提案するように、after-make-frame-functions
からこれを行うことができます。これは、必要以上に頻繁に実行されます(端末ごとに1回ではなく、フレームごとに1回)。ただし、これはおそらく「xterm」端末にのみ必要なので、別の適切なオプションはterminal-init-xterm-hook
から実行することです。
(defun my-text-terminal-keys ()
(define-key input-decode-map ...)
(define-key local-function-key-map ...))
(add-hook 'terminal-init-xterm-hook #'my-text-terminal-keys)
ところで、function-key-map
を使用することもできます。これはグローバル変数であり、すべての端末に等しく適用されるためです。
ついに解決策を見つけました。
これはコピーされた解決策ですが、残念ながら私はそれへのリンクを失いました。これをinit
ファイルに追加するだけです。
(defun startup_func(_)
(load-file "/path/to/custom-keybindings.el"))
(add-hook 'after-make-frame-functions #'startup_func)