Bisakah saya menggunakan gambar di pemantik modeline saya?

12

Modeline saya berantakan. Bisakah saya membuatnya menampilkan gambar alih-alih nama mode?

Saya dapat menggunakan unicode Emoji (seperti 🐍 untuk Python atau 🐓 untuk Coq), tetapi beberapa mesin yang saya gunakan konfigurasi Emacs saya tidak memiliki font yang tepat yang sudah diinstal sebelumnya (idealnya, saya juga ingin menggunakan kembali teknik ini dalam mode yang saya tulis, jadi saya tidak bisa mengharapkan pengguna memiliki pengaturan font yang tepat).

Saya mencoba menambahkan :imageproperti tampilan ke pemantik modelin mainan-mode kecil, tetapi tidak ada yang muncul di modeline:

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

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

Sejuk
sumber
Apakah ada cara untuk membawa font ke konfigurasi Anda?
PythonNut
2
Ya, sangat mungkin untuk melakukan itu. Lihat nyan-mode. Mungkinkah gambar terlalu besar untuk ditampilkan dengan benar?
wasamasa
@wasamasa, Poin bagus! Apakah Anda tahu bagaimana nyan-mode melakukannya?
Clément
Bagaimana cara mengganti string mode utama dalam mode-line dengan ikon ini?
stardiviner

Jawaban:

11

Baris mode diberikan dari daftar segmen, yang masing-masing datang dengan aturan khusus mereka sendiri. Lihat Data Baris Mode untuk detailnya. Bagian simbol berisi petunjuk penting untuk membuat kode Anda berfungsi:

Kecuali SYMBOL ditandai sebagai "berisiko" (yaitu, ia memiliki properti non-'nil '' variabel-lokal-berisiko '), semua properti teks yang ditentukan dalam nilai SYMBOL diabaikan. Ini termasuk properti teks dari string dalam nilai SYMBOL, serta semua bentuk ': eval' dan ': propertize' di dalamnya. (Alasan untuk ini adalah keamanan: variabel tidak berisiko dapat diatur secara otomatis dari variabel file tanpa meminta pengguna.)

Saya curiga nyan-mode melakukannya dengan cara yang kurang ideal , jadi inilah contoh minimal saya:

(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)

Alasan mengapa saya menggunakan daftar spasi dan gambar adalah karena ini adalah kebiasaan untuk memulai pemantik dengan ruang untuk memisahkannya dari yang sebelumnya.

wasamasa
sumber
Sebenarnya, apakah Anda sudah mencoba ini emacs -Q? Ini bekerja sangat baik dengan mode-pintar diaktifkan, tetapi saya tidak bisa membuatnya bekerja ketika saya mulai dari Emacs telanjang.
Clément
Hah, kamu benar. Saya akan memeriksa apa lagi yang hilang.
wasamasa
OK, saya sudah menemukan jawabannya. Rupanya paket itu hanya menggunakan string di dalam format string sedangkan real deal berjalan melalui segmen garis mode secara individual dan tidak hanya mengenali string yang propertized dari awal hingga akhir, jadi saya sudah mencari daftar dua string untuk memiliki pemisah.
wasamasa
Brillian, terima kasih banyak! Daftar ini menipu pemformat garis mode agar tidak menerapkan tingkat atas :propertizedari standar mode-line-format.
Clément
@wasamasa Wow, itu bagus. Sekarang ketika Anda mengarahkan mouse ke gambar, ada menu generik; bagaimana cara memasukkan entri ke dalamnya? Hanya string sederhana sebagai pesan mouse akan baik-baik saja.
yPhil
4

Pertanyaan bagus.

Anda dapat mencoba menggunakan sesuatu seperti ini sebagai pemantik:, di (concat " " (propertize " " 'display (create-image img-file)))mana img-filenama file gambar Anda. (Char ruang pertama hanya untuk memisahkan korek api ini dari yang sebelumnya.)

Yah, saya baru saja mencoba, menggunakan kode ini, tetapi tidak berhasil untuk saya. Anda mungkin mencoba sedikit mengotak-atiknya. Entah apakah itu mungkin.

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

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

Pemantik hanya menunjukkan sebagai char ruang biasa - displayproperti tampaknya tidak dihormati.

Jika Anda tidak mendapatkan jawaban yang baik untuk pertanyaan ini, pertimbangkan untuk mengajukan permintaan peningkatan Emacs, menggunakan M-x report-emacs-bug.

Satu hal yang pasti dapat Anda lakukan adalah menggunakan satu atau dua karakter Unicode dalam string mode-line. Dan Anda dapat menggunakan karakter yang, pada dasarnya, grafik.

Drew
sumber