ฉันสามารถใช้รูปภาพในโมเดลไฟแช็กของฉันได้หรือไม่?


12

Modeline ของฉันรกรุงรัง ฉันสามารถทำให้มันแสดงรูปภาพแทนชื่อโหมดได้หรือไม่?

ฉันสามารถใช้ unicode Emoji (เช่น🐍สำหรับ Python หรือ🐓สำหรับ Coq) ได้ แต่เครื่องบางเครื่องที่ใช้ Emacs config ของฉันไม่ได้ติดตั้งฟอนต์ที่ถูกต้องไว้ล่วงหน้า โหมดที่ฉันกำลังเขียนดังนั้นฉันไม่สามารถคาดหวังให้ผู้ใช้ตั้งค่าแบบอักษรที่ถูกต้องได้)

ฉันพยายามเพิ่ม:imageคุณสมบัติการแสดงผลลงใน modeline ที่เบากว่าของของเล่นรองโหมด แต่ไม่มีอะไรปรากฏใน modeline:

(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 เป็นไปได้ไหมที่ภาพใหญ่เกินกว่าจะแสดงได้อย่างเหมาะสม?
wasamasa

@wasamasa จุดสุดยอด! คุณรู้หรือไม่ว่าโหมด nyan ทำงานอย่างไร?
Clément

วิธีการแทนที่สตริงโหมดหลักในโหมดบรรทัดด้วยไอคอนนี้ได้อย่างไร
stardiviner

คำตอบ:


11

บรรทัดโหมดจะแสดงผลจากรายการของเซกเมนต์ซึ่งแต่ละอันจะมีกฎพิเศษของตนเอง ดูข้อมูล Line Modeสำหรับรายละเอียด ส่วนสัญลักษณ์มีคำใบ้สำคัญเพื่อให้โค้ดของคุณทำงาน:

เว้นแต่ว่า SYMBOL ถูกทำเครื่องหมายเป็น "ความเสี่ยง" (นั่นคือมันมีคุณสมบัติ 'ตัวแปรความเสี่ยงในท้องถิ่นที่ไม่ใช่ตัวแปร') ไม่มีคุณสมบัติข้อความทั้งหมดที่ระบุไว้ในค่าของ 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ไหม? มันใช้งานได้ดีเมื่อเปิดใช้งานโหมดสมาร์ทไลน์ แต่ฉันไม่สามารถทำงานได้เมื่อฉันเริ่มต้นจาก Emacs ที่เปลือยเปล่า
Clément

ใช่แล้วคุณพูดถูก ฉันจะตรวจสอบสิ่งอื่นที่ขาดหายไป
wasamasa

ตกลงฉันคิดออกแล้ว เห็นได้ชัดว่าแพคเกจเพียงแค่ใช้สตริงภายในสตริงรูปแบบในขณะที่ข้อตกลงที่แท้จริงเดินผ่านกลุ่มบรรทัดโหมดทีละรายการและจะรับรู้เฉพาะสตริงที่เหมาะสมตั้งแต่ต้นจนจบดังนั้นฉันจึงไปหารายการของสองสายเพื่อมีตัวคั่น
wasamasa

Brillian ขอบคุณมาก! เทคนิครายการโหมดการจัดรูปแบบสายเข้าไม่ได้ใช้ระดับบนสุดของการเริ่มต้น:propertize mode-line-format
Clément

@wasamasa ว้าวเยี่ยมเลย ตอนนี้เมื่อคุณเลื่อนเมาส์ไปที่รูปภาพจะมีเมนูทั่วไป วิธีหนึ่งจะใส่รายการในมันได้หรือไม่ เพียงแค่สตริงง่ายๆที่เป็นข้อความโฮเวอร์เมาส์ก็ใช้ได้เช่นกัน
yPhil

4

คำถามที่ดี.

คุณอาจลองใช้บางอย่างเช่นนี้เป็นเบา: (concat " " (propertize " " 'display (create-image img-file)))ซึ่งimg-fileเป็นชื่อของไฟล์ภาพของคุณ (ถ่านอวกาศแรกคือการแยกไฟแช็กนี้ออกจากอันก่อนหน้านี้)

ฉันเพิ่งลองใช้รหัสนี้ แต่มันไม่ได้ผลสำหรับฉัน คุณอาจลองเล่นซอเพิ่มเติมกับมัน Dunno ไม่ว่าจะเป็นไปได้

(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ใช้

สิ่งหนึ่งที่คุณสามารถทำได้อย่างแน่นอนคือการใช้อักขระ Unicode หนึ่งหรือสองตัวในสตริงบรรทัดของโหมด และคุณสามารถใช้ตัวอักษรที่มีผลต่อกราฟิก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.