Возможно ли заменить краевые растровые изображения текстом в 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))))
Другие вопросы по тегам