是否有可能在Emacs中用文本替换条纹位图?

时间:2013-04-19 23:03:12

标签: emacs fringe

我喜欢用简单,有品味的文字(甚至是一个很好的unicode字符,如\u2026省略号)来替换指示截断或包裹线条的丑陋像素箭头。这可能吗?

2 个答案:

答案 0 :(得分:2)

不,不是。边缘“位图”实际上是位图,即0/1位的向量,覆盖在边缘上。没有办法直接将任意unicode字符渲染到边缘。

你可以做的是自己将一个unicode字符渲染成0/1位图。任何像样的图像编辑器(例如Gimp,Photoshop,Pixelmator,Paint.net等)都可以做到这一点。然后将此位图转换为条纹位图矢量。边缘位图的格式在Customizing Fringe Bitmaps中描述。

最终,您可以使用这些位图向量替换left-arrowright-arrow(对于截断的行),left-curly-arrowright-curly-arrow(对于续行)位图,函数define-fringe-bitmap

然而,我会说这比它的价值更麻烦。边缘是8像素宽,所以你必须将你漂亮的unicode字符挤压成8x8位图。这意味着没有子像素渲染,没有别名,没有字节码渲染,没有什么能使屏幕上的字符变得美观和花哨。它和你所取代的箭一样丑陋。

答案 1 :(得分:0)

lunaryorn的答案是正确的,但它可能超出了新手Emacs用户的范围 - 例如,像我这样的程序员爱好者。

Nikolaj Schumacher在他的图书馆Fringe Helper中编写的函数fringe-helper-convert - https://github.com/nschum/fringe-helper.el - 让像我这样的Emacs爱好者可以轻松创建一个由函数{{1}使用的向量(在Emacs的C源代码中定义)。我选择了一个pilcrow,但用户可以自由创建任何适合的图像 - 例如,使用大写字母define-fringe-bitmap和句点X,用户可以创建一个字母的形状。 / p>

.

以下示例假定;; 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))) 为20个像素 - 这样位图图像的高度与缓冲区中的文本相同。 let-bound代码片段在行尾的右边缘创建了一个pilcrow形状(无论何时点是评估片段的时间点)。该示例假设右边缘至少为11的宽度 - 例如,frame-char-height转换为字符串的unicode符号 - (add-to-list 'default-frame-alist '(right-fringe . 11))可能会被(char-to-string ?\uE000)替换。

" "