Emacsデーモンを使用する場合のターミナルフレームとグラフィカルフレームのさまざまなテーマ


20

Emacs24で次の動作を実現しようとしています。

実行中のサーバーに端末フレームで接続するかどうかに応じて、異なるテーマ(solarized-dark vs. solarized-light)を使用したい

% emacsclient -t

またはgtkフレーム付き

% emacsclient -c

これは古いEmacsで機能していたようですが、現在のEmacsには方法が見つかりませんでした。私はSO(例えば、確認alreday /programming//q/18904529/152439と回答)とメーリングリスト(例えば、https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.htmlおよびhttps://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html)。

私の現在のセットアップは次のようになります。

(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/solarized")
(if (daemonp)
  (add-hook 'after-make-frame-functions
    (lambda (frame)
      (select-frame frame)
      (if (display-graphic-p frame)
        (load-theme 'solarized-light t)
        (load-theme 'solarized-dark t)
      )
    )
  )
  (load-theme 'solarized-light t)
)

この問題は、グラフィカルフレームを開いてからでターミナルフレームを開くとemacsclient -t、テーマsolarized-darkが新しいターミナルフレーム(正しい)と既に開いているグラフィカルフレーム(残すべき)の両方に適用されることです。理想的にはそのまま)。ターミナルフレームが既に開いていて、新しいグラフィカルフレームをで開くと、同等のことが起こりemacsclient -cます。

編集:現在のEmacs24でこれが不可能な場合、再び可能にする計画はありますか?


1
Afaik(この目的のための他の検索から)、古いカラーテーマの実装では、バッファごとの設定が許可されていました。emacs 24には組み込みのテーマサポート(defthemeまたはload-themeとして知られる)が付属しましたが、これはこれをサポートしていません。テーマはemacsセッション全体で同じです。この種のセットアップでは、常にsolarized-darkをロードし、-rvフラグを使用してグラフィカルフレームを開始することにより、許容できるハックを管理できますが、完全にはほど遠いでしょう。
T.バーロン14年

回避策の1つは、ここで説明するように、ターミナル用とGUI用に別々のクライアントを実行することです。emacs.stackexchange.com / q / 41/93 ワークフローによっては、これは実行可能なソリューションではない場合があります。私はそれぞれで異なるタイプのタスクをほとんどまたはまったく重複せずに実行しているので、私にとってはうまくいきます。
nispio

emacs24の組み込みのカスタムテーマがニーズに合わない場合は、color-theme.elどのIIRCにフレーム依存のカラー設定があったかをいつでも使用できます。ユビキタス以外に組み込みのテーマ機能を使用することには大きな利点はありません。
Vamsi 14年

2
color-theme-buffer-localcolor-theme、Emacs 24テーマシステムと両方のバッファーローカルテーマサポートを提供します。私のバージョンのソラリゼーションテーマは、このルートに進むことにした場合、両方のシステムもサポートします。
sanityinc 14年

@sanityincありがとう。私はEmacs 24.3を使用していますが、いくつかの問題があるようです。github.com/ vic / color-theme-buffer-local / issues / 5を参照してください。しかし、私はプロジェクトに目を光らせておきます。
アンドレアス・時間

回答:


8

異なるテーマを使用してこれを行うことはできません。解決策は、端末に応じて異なる顔定義を持つテーマを作成することです。のような例を見ると、font-lock-comment-faceどのように機能するかがわかります。代わりに、指定の((class color) (min-colors 88) (background dark))specifcyもあなたをでき(type tty)たり(type graphic)など、マニュアルをより多くの情報を持っています

(defface font-lock-comment-face
  '((((class grayscale) (background light))
 :foreground "DimGray" :weight bold :slant italic)
(((class grayscale) (background dark))
 :foreground "LightGray" :weight bold :slant italic)
(((class color) (min-colors 88) (background light))
 :foreground "Firebrick")
(((class color) (min-colors 88) (background dark))
 :foreground "chocolate1")
(((class color) (min-colors 16) (background light))
 :foreground "red")
(((class color) (min-colors 16) (background dark))
 :foreground "red1")
(((class color) (min-colors 8) (background light))
 :foreground "red")
(((class color) (min-colors 8) (background dark))
 :foreground "yellow")
(t :weight bold :slant italic))
  "Font Lock mode face used to highlight comments."
  :group 'font-lock-faces)

2つのテーマを取り、マージされたテーマを生成する関数を作成できると思います。元のテーマの両方が使用する場合(type tty)、一方のテーマの顔が割り当てられ、他方のテーマの顔が割り当てられ(type graphic)ますt



2

カスタマイズエディターで「ターミナルモード」や「最小色」など、顔のカスタマイズの条件を定義できます。

顔をカスタマイズする場合は、[状態]ボタンをクリックして、[すべての表示仕様を表示]を選択します。次に、顔をさらに特殊化するための条件を設定できます。

以下は、フレームがttyの場合に背景色をに設定するための最小限のバリエーションです。

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.