コンソールとGUI用に2つの個別のemacsデーモンを起動します


14

通常、GUIでemacsを起動し、すぐにサーバーを起動します(server-start)。これで、ターミナルを介してemacsclient -n <file>、またはファイルブラウザから、既存のemacsセッションにドキュメントを簡単に開くことができます。

ただし、ときどき、を使用して端末内でemacsを実行しemacsclient -tます。これは、Gitコミットログの書き込み時または他の非常に小さなタスクの実行時に最も頻繁に発生します。それらのインスタンスでは、initファイルがemacsのGUIインスタンスにロードされたという事実は、TTY emacsに固有のカスタマイズがまったく得られないことを意味します。

走れることを知っている

emacs -nw -q -l "some-custom-init-file.el"

しかし、それはすべてのパッケージを毎回リロードします。両方の長所を活用できますか?「TTYデーモン」をセットアップして、ターミナル内で実行するのと、既存のemacsウィンドウでファイルを表示するのとで別々のカスタマイズを使用できるようにする方法はありますか?


1
TTYモードとGUIモードで異なるカスタマイズの例を指摘できますか?
stsquad 14

1
@stsquad本当に簡単なのは、GUIモードで左フリンジを使用することですが、TTYモードではフリンジが存在しないため、行番号とテキストの間にスペースがありません。これは(setq linum-format "%d ")、TTYカスタマイズファイルで修正できます。また、TTYモードでは私のカラーテーマは常に奇妙に見えるため、TTYには必ず別のテーマを選択します。現時点ではそれほど多くの違いはありませんが、異なるサーバーを使用できることがわかったので、リストが大きくなる可能性があります。
nispio 14

@nispio:M-x report-emacs-bugTTYとGUIフレームで異なる顔テーマを持つ機能などの新しい機能をリクエストすることをお勧めします(実際、テーマはこれらの異なる種類のフレームに完全に異なる色を指定できるため、テーマを調整することもできます) 。これらの個別のケースに複数のデーモンを使用することは、Emacsに対応する機能がないための回避策にすぎません。
ステファン

回答:


14

使用するemacs --daemon=your-server-name -l "custom-init-file"新しいサーバを起動すると、emacsclient -nw -s your-server-name自身の端末から接続します。マニュアルのサーバーとしてのEmacsの使用に関するセクションには、初期化オプションがさらにあります。


これは動作します!サーバーファイルを探して削除する以外に、この方法で起動したサーバーを殺す良い方法はありますか?
nispio

(カスタムinitファイルの前に-qデフォルトinit.elが実行されないようにするために、スイッチを追加する必要がありました。)
nispio 14

2
DOESはemacsclient -s your-server-name -e "(kill-emacs)"何をしたいですか?上記はemacsclientとevalsを呼び出すだけです(kill-emacs)。あなたは置き換えることができます(kill-emacs)(save-buffers-kill-emacs)同様。
Vamsi 14

ターミナルとGUIの両方のemacに共通のinit.elを使用し、個々のカスタマイズ用に個別のカスタムファイルをロードしていました。したがって、私は逃した-q
Vamsi 14

1
このソリューションは、muttで 'emacsclient -t'を使用し、別のワークスペースで 'emacsclient -c'を使用したときに発生した問題も修正しました。簡単に言うと、「emacsclient -c」が「emacsclient -t」の前に起動されたときにデーモンがクラッシュしていました。ありがとう、Vamsi
Boccaperta-IT 14

9

@Vamsiの答えに加えて、にアドバイスを添付することにより、単一のサーバーのみを実行しながら、同じ利点の多くを得ることができますmake-frame-command

たとえば、ターミナルで実行しているときに、背景色をblack(にマップする#202020)にしたいのです#202020が、グラフィカルモードで使用したいです。私はこれを次のように実装しました:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

を使用して、これから多くのマイレージを得ることができますmake-variable-frame-localset-background-color上記では既にフレームローカルです)。

これが最良のパターンであるかどうかはわかりませんが、TTYモードとXモードのEmacsの違いが比較的少ない場合は、構成管理が容易になります。

上記のコードは、私の.emacs.dから取得されました


フレームごとにどのモードになっているかを「検出」する方法があるのではないかと思っていました。
nispio 14

1
これでやります。現在のフレームがグラフィカルな場合、そうでない場合に(display-graphic-p)与えます。フレームはグラフィカルではなく(afaik)の間で移動できないため、フレーム作成にアドバイスを付けると、指定されたフレームが目的の状態に到達することが保証されます。tnil
Jデビッド・スミス

これは間違いなく最も便利な答えです。
マラバルバ14

4

同じemacsデーモンで実行されている異なるフレームの設定を変更するためのアドバイスは必要ありません。フックを次のafter-make-frame-functionsように使用するだけです

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

この方法で定義すると、追加のボーナスがあります。デーモンモードで起動しなくても、目的のフレーム構成が設定されます。

残念ながらload-theme、ローカルフレームではないため、テキストフレームとグラフィカルフレームに異なるテーマを実際に使用すると、他のフレームも色付きになります。

ボーナス情報:選択したテーマの本当の感触を得るために、少なくとも256色で端末を構成します。シェルスタートアップファイルのいずれかで、次のような設定を使用します。

TERM=xterm-256color
export TERM

すべての端末が256色をサポートしているわけではありません。たとえば、xfce4-terminalはまだわずか8です(きれいな色のために桜に切り替えました)。
アンハンマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.