Возможно ли заменить краевые растровые изображения текстом в Emacs?
Я хотел бы заменить уродливые пиксельные стрелки, указывающие на усеченные или обернутые линии, на простой, со вкусом текст (возможно, даже хороший юникодный символ, такой как \u2026
многоточие). Это возможно?
2 ответа
Нет. "Битовые карты" полос - это действительно битовые карты, то есть векторы 0/1 битов, наложенные поверх полосы. Невозможно напрямую визуализировать произвольные символы Юникода на границе.
Что вы можете сделать, так это самостоятельно отобразить символ Юникода в растровое изображение 0/1. Любой приличный графический редактор (например, Gimp, Photoshop, Pixelmator, Paint.net и т. Д.) Может сделать это. Затем преобразуйте это растровое изображение в дополнительный растровый вектор. Формат растровых растровых изображений описан в разделе "Настройка растровых растровых изображений".
В конце концов вы можете использовать эти растровые векторы для замены left-arrow
, right-arrow
(для усеченных линий), left-curly-arrow
, а также right-curly-arrow
(для продолжения строк) растровые изображения, используя функцию define-fringe-bitmap
,
Тем не менее, я бы сказал, что это больше хлопот, чем стоит. Ширина полосы составляет 8 пикселей, поэтому вам придется сжать свой красивый символ Unicode в растровое изображение 8x8. Это означает отсутствие субпиксельного рендеринга, никакого псевдонима, никакого рендеринга байт-кода, ничего из того, что делает символы на экране красивыми и причудливыми. Это было бы так же безобразно, как стрелки, которые вы заменили.
Ответ от lunaryorn правильный, но, возможно, он недоступен начинающим пользователям Emacs - например, программистам-любителям, таким как я.
Функция fringe-helper-convert
написанный Николаем Шумахером в его библиотеке Fringe Helper - https://github.com/nschum/fringe-helper.el - позволяет таким любителям Emacs, как я, создавать вектор, который используется функцией define-fringe-bitmap
(который определен в C-исходном коде Emacs). Я выбрал колокольчик, но пользователь может свободно создавать любое изображение, например, с использованием заглавной буквы. X
и период .
Пользователь может создать форму буквы.
;; AUTHOR: Nikolaj Schumacher -- https://github.com/nschum/fringe-helper.el
(defun fringe-helper-convert (&rest strings)
"Convert STRINGS into a vector usable for `define-fringe-bitmap'.
Each string in STRINGS represents a line of the fringe bitmap.
Periods (.) are background-colored pixel; Xs are foreground-colored. The
fringe bitmap always is aligned to the right. If the fringe has half
width, only the left 4 pixels of an 8 pixel bitmap will be shown.
For example, the following code defines a diagonal line.
\(fringe-helper-convert
\"XX......\"
\"..XX....\"
\"....XX..\"
\"......XX\"\)"
(unless (cdr strings)
;; only one string, probably with newlines
(setq strings (split-string (car strings) "\n")))
(apply 'vector
(mapcar
(lambda (str)
(let ((num 0))
(dolist (c (string-to-list str))
(setq num (+ (* num 2) (if (eq c ?.) 0 1))))
num))
strings)))
В следующем примере предполагается, что frame-char-height
20 пикселей - так, чтобы растровое изображение было той же высоты, что и текст в буфере. Фрагмент с привязкой к точке создает форму пера в правой части в конце линии (где бы ни находилась точка при оценке фрагмента). В примере предполагается, что ширина правой полосы равна по крайней мере одиннадцати - например, (add-to-list 'default-frame-alist '(right-fringe . 11))
Символ Юникода, преобразованный в строку - (char-to-string ?\uE000)
может быть заменен " "
,
(define-fringe-bitmap 'pilcrow (fringe-helper-convert
"......."
"......."
"......."
"......."
"......."
".XXXXXX"
"XXXX.X."
"XXXX.X."
"XXXX.X."
".XXX.X."
"...X.X."
"...X.X."
"...X.X."
"...X.X."
"...X.X."
"...X.X."
"......."
"......."
"......."
"......."))
(let ((peol (point-at-eol)))
(overlay-put (make-overlay peol peol) 'after-string
(propertize (char-to-string ?\uE000) 'display
'(right-fringe pilcrow font-lock-keyword-face))))