毫不干扰地改变文本呈现的方法?


12

我正在编写用于语音识别的emacs扩展,并且正在寻求有关特定功能的帮助。语音识别器(Dragon)的某些单词识别能力始终很差-训练了几次并不重要,这只会使您无法识别某些单词。通常,在同一时间写主题或编码时,一遍又一遍地使用很多相同的单词。

因此,我编写了一种使用覆盖层来更改单词在缓冲区中的呈现方式的模式。它在单词中使用随机字母,在其下方用随机颜色加下划线,并在其顶部放置随机变音标记(重音符号,变音符号等)。这是屏幕截图(您可能需要缩放以查看标记/下划线):

在此处输入图片说明

然后您可以说“紫色p头发”,它将在单词“ a”下寻找带有紫色下划线的单词,并带有一个变音符,看起来像头发,然后为您键入该单词。因此,在上面的屏幕截图中,这将导致emacs为您键入“ regexp-quote”。

这个想法是让您使用识别器一贯擅长识别的有限词组来引用屏幕上已经使用过的任何词组。

它工作得很好,只是偶尔会发生碰撞。为了做到这一点,我可以学习一致地引用单词,就像我使用单词的md5哈希中的字节一样,而不是(random)让算法分配更改以免发生冲突。我只发现了6种易于区分的颜色(当下划线只有一个字符宽且只有一个像素厚时很难做到)和3种易于区分的变音符号(易于区分彼此,并且与上面的下划线也不能混淆线或与下划线重叠的位置),请参见上方来源上方。

我需要更多方法来更改渲染,以减少碰撞频率。理想情况下,渲染修改将:

  • 不要被其余的文本所震撼。例如,这导致我忽略了反视频属性。
  • 不容易与其他更改混淆。上划线很容易被误认为前一行的下划线。除非字体大小不切实际,否则许多变音符看起来都差不多。
  • 在空间上靠近其他变化所在。现在,一旦我的眼睛找到了目标角色,所有的信息,标记,下划线和字母就在那里。
  • 可以正确显示变音标记的固定宽度字体(编码所需)很好地工作(我必须从Consolas切换到DejaVu Sans Mono,以使标记正确呈现)
  • 在拉丁字母上工作。例如,有阿拉伯文的组合标记,但它们不与拉丁字母字符组合。
  • 不要更改字母的颜色,因为它已经用于语法突出显示。
  • 实际上可以在emacs中使用emacs lisp;)

也许有特殊的unicode字符控制渲染,可能会被滥用以开辟新的可能性?还是一种加粗下划线的方式,以便我可以轻松区分更多颜色?还是其他一些晦涩的emacs功能,可让您在unicode之外的字符顶部显示标记?


不是您问题的直接答案,而是使用覆盖层以赋予新角色外观的一些想法。一个想法是将两个叠加层合并/夹在一起-迫使它们与常规字符适合在同一空间内-例如,第一个字符是添加了颜色的细线(char-to-string ?\uFEFF),另一个是目标字符,在大小,所以它们都适合。另一个想法是使用垂直删除线(某些字体提供,但不是全部提供),类似于库vline.el emacswiki.org/emacs/VlineMode中
lawlist

@lawlist:Unicode代码行的想法很有趣,它会让我做一个“副业”。您是否知道如何减小下一个字符的大小?我也许可以生成一个与display属性一起使用的图像,但是AFAICT无法获得emacs来将文本渲染为图像,因此我必须将图像制作在emacs之外。
约瑟夫·加文2015年

此注释取代了之前的注释(我删除的注释),并且以下链接中的代码也已更新-包含三个示例(其中一个与我在当前线程下面发布的答案相同): stackoverflow .com / questions / 23744237 /…
法律名单

Answers:


4

另一种可能性是显示行号并在单词前说出行号,或者,由于要查找确切的行号会很麻烦,因此您可以在算法的+或-5或10行内搜索算法说。

或者声明一个您正在使用的区域或功能,并让所有搜索都只在那儿查找。我想这将限制碰撞。

您还可以在给定颜色的单词之后或之前呈现unicode符号,以帮助其突出显示。并用其他颜色在单词上加上方框或下划线。这样,您可以拥有6种字色* 6种符号颜色* N种符号可能性。您可能会找到10个好的符号并有360个组合。例如,您可以说“蓝黄色的星星”来指代猫这个词。

在此处输入图片说明

如果星星太刺耳,可以将:box和两个不同的:underlines结合在一起。

因此,您可以在此处使用“蓝色,黄色,红色”来指代单词树,这将为您提供216种组合使用。

在此处输入图片说明


1
我等了一会儿,看看是否有人会提出其他技巧,但我可能要使用双下划线颜色,因为添加符号可能会导致缩进。接受,谢谢。
Joseph Garvin 2015年

2

您听说过ace-jump-mode吗?

它不满足您指定的任何要求,但看起来很符合您要达到的目标。它将允许用户通过仅说2或3个单词来指定任何单词。

您可以定义它提供给您的字符集,这样就可以避免难以区分的辅音。然后,用户可以只说“修复A九”,然后更正以开头的第9个字a


请参阅我对tmalsburg帖子的评论,以了解为什么ace-jump-mode无法解决。
Joseph Garvin 2015年

1

有趣的问题。我敢打赌,您会得到一些有趣的建议。

我想到的一个小建议是使用不同的颜色和样式作为下划线。请参阅Elisp手册,Face Attributes有关属性:underline及其属性:color:style组件的节点。

您也可以尝试使用属性:box以及不同的线宽和样式,但这可能太麻烦了。


1

我将提出一种选择目标词的替代方法来回答。突出显示一半的单词(随机选择)。如果目标词突出显示,则用户说“是”,否则说“否”。如果用户说“是”,则选择所有突出显示的单词,并随机突出显示其中一半。如果用户说“否”,则随机突出显示未突出显示的单词的一半。用户再次通过说“是”或“否”来指示目标单词是否突出显示。重复该操作,直到仅突出显示目标词。

这种方法的一些好处:

  • 无论您在屏幕上有多少个单词,此方法都有效。
  • 您不需要花哨的颜色,字体或符号。单色显示就足够了。
  • 极低的认知负担,因为很容易分辨单词是否突出显示。

缺点:您必须经常说“是”和“否”。但是,此问题通过以下想法得以解决:不要突出显示单词,而要为其使用颜色。您说您有6种容易区分的颜色。这意味着如果屏幕上有100个单词,则选择目标单词平均需要命名2.6种颜色。如果有1000个单词,则平均必须命名3.9种颜色。


1
不幸的是,说出的单词数是一个误导性的指标。这种解决方案风格的问题在于它包含感知/行动往返。我必须先看到颜色,然后做出反应,然后再看到,做出反应,再看到。在实践中说三个单词而不必停下来查看它们必须比您所采用的解决方案更快,尤其是在Dragon的延迟较慢的情况下。如果这些往返不是问题,我将使用ace-jump-mode。有了变音符,我可以看屏幕一次,知道我需要说的整个字符串,而不必停下来让Dragon在每个单词之后做出反应。
Joseph Garvin 2015年

1

以下是使用带有xpm图像的覆盖图的示例,用于支持xpm图像格式的图形Emacs版本。它是11像素宽;20像素高;并具有用户指定的4种可能颜色的数量。我在运行Snow Leopard 10.6.8的Mac上,使用Emacs时更喜欢的字体是-*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1-分别frame-char-width是11和frame-char-height20。我在大写字母“ A”的左侧添加了一条细的垂直黄线,作为如何绘制自定义图像的示例。可以通过编程方式使用该字符(char-after (point))并用该数字替换该点处的字符(在这种情况下,该数字为大写字母“ A”为65),然后替换相应的变量(例如),(cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .并在重叠式广告放置-例如,(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm)。这对于截断缓冲区和自动换行都非常有效,因为单词display中间字符的overlay属性不会导致自动换行认为单词的第一部分在上一行的末尾。当然,创建喜欢的xpm图像的自定义库将需要一些时间。

ImageMagick能够根据特定的字体系列和大小生成特定字符的半准确xpm,但是它不如我希望的那样精确-这是使用该外部实用程序的说明的链接: https:/ /stackoverflow.com/a/14168154/2112489 简而言之,用户应准备好花时间根据自己的喜好自定义xpm图像。

(defun xpm-example ()
(interactive)
"Doc-string"
  (let* (
      (cap-ltr-a-xpm `(image :type xpm :mask nil :ascent center :data
        "/* XPM */
        static char * letters_xpm[] = {
        /* columns rows colors chars-per-pixel */
        /* columns = 1 pixel in width -- see also (frame-char-width) */
        /* rows = 1 pixel in height -- see also (frame-char-height) */
        \"11 20 4 1\",
        \". c #000000\",
        \"+ c #FF0000\",
        \"@ c #7F0000\",
        \"% c yellow\",
        \"%..........\",
        \"%....++....\",
        \"%....++....\",
        \"%..++..++..\",
        \"%..++..++..\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++++++++++\",
        \"%++++++++++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%..........\"};"))  )
    (overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm)))

@wasamasa-谢谢-我删除了有关XBM位图的错误声明。
法律列表
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.