モードラインライターで画像を使用できますか?


12

私のモードラインは乱雑です。モード名の代わりに画像を表示することはできますか?

ユニコード絵文字(Pythonの場合はor、Coqの場合はasなど)を使用できますが、Emacsの設定を使用する一部のマシンには適切なフォントが事前にインストールされていません(理想的には、この手法を私が書いているモードなので、ユーザーが適切なフォント設定を持つことは期待できません)。

:imageおもちゃのマイナーモードのモードラインライターに表示プロパティを追加しようとしましたが、モードラインには何も表示されませんでした。

(define-minor-mode my/test-mode
  "Test mode."
  :lighter (propertize " 🐓" 'display '(image :type imagemagick
                                             :file "/home/clement/.emacs.d/rooster.png")))

TWEmojiオンドリ(https://raw.githubusercontent.com/twitter/twemoji/gh-pages/72x72/1f413.png)


フォントを設定に取り込む方法はありますか?
PythonNut

2
はい、それは完全に可能です。nyan-modeを参照してください。画像が大きすぎて適切に表示できない可能性がありますか?
wasamasa

@wasamasa、素晴らしい点!nyan-modeがそれをどのように行っているか知っていますか?
クレメント

モードラインのメジャーモード文字列をこのアイコンに置き換える方法は?
stardiviner

回答:


11

モードラインはセグメントのリストからレンダリングされ、各セグメントには独自の特別なルールがあります。詳細については、モードラインデータを参照してください。シンボルセクションには、コードを機能させるための重要なヒントが含まれています。

SYMBOLが「危険」とマー​​クされていない場合(つまり、「nil」以外の「risky-local-variable」プロパティがある場合)、SYMBOLの値で指定されたすべてのテキストプロパティは無視されます。これには、SYMBOLの値の文字列のテキストプロパティと、その中のすべての「:eval」および「:propertize」フォームが含まれます。(この理由はセキュリティです。非リスク変数は、ユーザーにプロンプ​​トを表示せずにファイル変数から自動的に設定できます。)

私はnyan-modeがそれを理想的とは言えない方法で行っていると思うので、ここに私の最小の例を示します:

(defvar my-nyan-mode-lighter
  (list " " (propertize ":3" 'display
                        `(image :type imagemagick
                                :file ,(expand-file-name "~/nyan.png")))))
(put 'my-nyan-mode-lighter 'risky-local-variable t)

(define-minor-mode my-nyan-mode
  "Nyan mode"
  :lighter my-nyan-mode-lighter)

(my-nyan-mode)

スペースと画像のリストを使用する理由は、ライターを前のスペースから分離するためにスペースを使用してライターを開始するのが慣例だからです。


実際に、これを試しましたemacs -Qか?smart-mode-lineを有効にするとうまく機能しますが、裸のEmacsから起動すると機能しません。
クレメント

ええ、あなたは正しいです。他に不足しているものを確認します。
wasamasa

わかった、わかった。どうやらこのパッケージはフォーマット文字列内の文字列を使用するだけですが、実際の取引はモードラインセグメントを個別に処理し、最初から最後まで適切な文字列のみを認識するため、2つの文字列のリストにセパレータを追加しました。
wasamasa

ブリリアン、どうもありがとう!リストは、モードラインフォーマッターをだまし:propertizeてdefaultの最上位を適用しないようにしますmode-line-format
クレメント

@wasamasaうわー、それはいいですね。これで、画像の上にマウスを移動すると、一般的なメニューが表示されます。エントリをどのように入力しますか?マウスホバーメッセージのような単純な文字列でも問題ありません。
yPhil

4

良い質問。

次のようなものをライターとして使用してみてください:(concat " " (propertize " " 'display (create-image img-file)))、ここでimg-file画像ファイルの名前です。(最初のスペース文字は、このライターを前のものと区別するためのものです。)

まあ、私はこのコードを使用して、試してみましたが、それはなかったではない私のために働きます。もう少しいじってみてください。できるのかな。

(defvar my-lighter-string
        (concat " " (propertize " " 'display (create-image "/path/to/an/image/file.png"))))

(define-minor-mode foo "..." nil my-lighter-string)

ライターは単なる普通のスペース文字として表示されdisplayます- プロパティは尊重されていないようです。

この質問に対する適切な回答が得られない場合は、を使用してEmacs拡張リクエストを提出することを検討してくださいM-x report-emacs-bug

確かにできることの1つは、モードライン文字列で1つまたは2つのUnicode文字を使用することです。また、実際にはグラフィックである文字を使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.