web-dev-qa-db-ja.com

.emacs initファイルをemacsサーバーで正しくロードするにはどうすればよいですか?

私のinitファイルは、私の.emacsファイルがOS固有のinitを指すシンボリックリンクであり、OSの影響を受けない構成でメインのinitファイルをロードするように設定されています。サーバー以外のemacsのこのセットアップには問題はありませんでした。

ただし、emacsclientを使用する場合は正しく機能しません。たとえば、org-modeの設定があるので、OSXのターミナルでは、S-Tabがバックタブにマップされ、未定義のキーに関するエラーをスローする代わりに正しく機能します。 emacsサーバーを使用していない場合、この設定は正常に機能します。 emacsclientを使用していると、未定義のキーバインドのエラーが発生します。

サーバーの起動時にファイルに入力した(メッセージ "whatever")行が正常に表示されるため、すべてのinitファイルがエラーなしでロードされていることがわかります。したがって、emacsサーバーが何らかの理由でファイルを失っているわけではありません。これは、マップされたキーがサーバーに読み込まれたが、クライアントが接続したときに忘れられたようです。emacsclientバッファーでキーマッピングのevalを一度試しましたが、エラーはありませんが、変更はありません。何か案は?

(ところで、--debug-initは何も奇妙なことを示していません。すべてがエラーなしでロードされています。)

5
labyrinth

あなたの問題は、.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を使用することもできます。これはグローバル変数であり、すべての端末に等しく適用されるためです。

5
Dailan Kifki

ついに解決策を見つけました。

これはコピーされた解決策ですが、残念ながら私はそれへのリンクを失いました。これをinitファイルに追加するだけです。

(defun startup_func(_)
  (load-file "/path/to/custom-keybindings.el"))

(add-hook 'after-make-frame-functions #'startup_func)
2
reza.safiyat