모델러 라이터에서 이미지를 사용할 수 있습니까?


12

내 모델이 복잡합니다. 모드 이름 대신 그림을 표시 할 수 있습니까?

유니 코드 Emoji (예 : Python의 경우 🐍 또는 Coq의 경우 🐓)를 사용할 수는 있지만 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
그렇습니다. 완전히 가능합니다. 냥 모드를 참조하십시오. 이미지가 너무 커서 제대로 표시되지 않을 수 있습니까?
wasamasa

@와 사마, 좋은 지적! nyan 모드가 어떻게 작동하는지 알고 있습니까?
Clément

모드 라인의 메이저 모드 문자열을이 아이콘으로 바꾸는 방법은 무엇입니까?
stardiviner

답변:


11

모드 라인은 세그먼트 목록에서 렌더링되며 각 세그먼트에는 고유 한 특수 규칙이 있습니다. 자세한 내용은 모드 라인 데이터 를 참조 하십시오. 기호 섹션에는 코드 작동을위한 중요한 힌트가 포함되어 있습니다.

SYMBOL이 "위험"으로 표시되지 않은 경우 (즉, 'nil'이 아닌 '위험 지역 변수'속성이있는 경우) 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

훌륭합니다, 많은 감사합니다! 이 목록은 모드 라인 포맷터 :propertize가 기본값 의 최상위 레벨 을 적용하지 않도록 속 mode-line-format입니다.
Clément

@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.

확실하게 할 수있는 한 가지는 모드 줄 문자열에 하나 또는 두 개의 유니 코드 문자를 사용하는 것입니다. 실제로 그래픽 인 문자를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.