在OS X中的Emacs滚动错误

4

更新

在从Mountain Lion升级到Mavericks的同时,将Emacs从23.4升级到24.3后,此问题已经消失。

更新结束

一个包含以下内容的.emacs文件

(set-foreground-color "white")
(set-background-color "black")

(setq mouse-wheel-scroll-amount '(1 ((shift) . 1) ((control) . nil)))
(setq mouse-wheel-progressive-speed nil)

当我使用较小的步长向上或向下滚动时,我看到了奇怪的模式。

vertical lines

放大其中一个图案会显示

magnified one vertical line

这个问题在Emacs 22、23和现在的24版本中存在,包括Mountain Lion在内的几个OSX版本。这是已知的渲染错误吗?有解决方法吗?
对我来说,修改fringeslinum都没有用。我还能在哪里寻找解决方法?
如果我使用默认的白色背景和黑色前景,这些行要么不出现,要么对我来说难以察觉。
这个问题最让人烦恼的是,重绘(C-l)并不能得到干净的文本。

我猜这是字体渲染的问题。尝试更改为不同的字体,看看是否有问题。你是在终端中使用emacs吗? - Randy Morris
你可能是对的。我找不到另一种出现问题的字体。这只发生在苹果默认的 Monaco 字体中。实际上,这会发生在所有大小的 Monaco 上。但我肯定不希望放弃这样适合编程并且呈现速度快的字体 - Monaco。 - Calaf
我进行了几次尝试。问题似乎出现在至少另一种字体上:Menlo。 - Calaf
有趣的是这两个都是苹果字体。 我不确定该怎么帮你。 你是在终端中运行emacs还是运行GUI? - Randy Morris
我正在独立窗口中运行基本的emacs(http://emacsformacosx.com/)。 - Calaf
显示剩余4条评论
1个回答

1
问题与OS X的LCD字体平滑算法和emacs用于实现滚动的算法之间的交互有关。
下面的图显示了字体平滑关闭(左)和打开(右)。您可以在"系统偏好设置\常规"中找到此设置。在两种情况下,我将程序向下滚动一行。当OS X打开字体平滑并使用"@"时,它不仅使用专用于"@"的像素,还使用相邻(空白)字符的蓝色像素。
当emacs滚动时,它只修改它认为需要修改的字符。如果字符为空格并且在滚动后仍然为空格,则不会修改它。这种优化在2013年仍然有效。换句话说,测试两个字符是否为空格仍然比绘制一个字符更便宜。但是这种优化在今天几乎没有必要,它导致显示出现错误。
如果上述假设成立,接下来的问题就是是否可以关闭优化。是否可能请emacs在每次滚动时重新绘制整个屏幕或至少重新绘制仍然为空白字符的字符,如果它们紧邻非空白字符。

Font smoothing off (left) and on (right)

当然,可以直接关闭字体平滑处理。放大后的图像甚至可能表明未经平滑处理的图像更好。实际上,当字体以其自然(未放大)大小出现时,平滑处理使字符更加清晰易读,消除了使用更大字体的必要。

下面图片中“c();”两侧的图案与该错误一致。OS X 在左侧使用蓝色像素,在右侧使用红色/棕色像素(可能与显示器上的 RGB 图案有关)。滚动时留下的垂直线条是蓝色或红色/棕色/砖红色的,具体取决于它们是否从滚动字符的左侧或右侧掉落。

blue hints on the left; red hints on the right

更新

现在问题已经在这个版本中解决。由Emacs 24.3.50.1生成的放大的c();显示字体平滑效果与Emacs 24.3.1相同,但输出结果并不完全相同。每两行文字之间至少有一条额外的水平像素线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接