在框架底部显示单词列表?


20

我想在我打开的每个emacs框架的底部(尽管顶部也可以)水平地在单独的行上显示3个单词列表。我已经想到了6种方法来解决这个问题,但是它们都有问题:

  1. 我的第一个想法是在模式行中添加一行,但是AFAICT不能在模式行中使用换行符,它只能转换为“ ^ J”。

  2. 我的第二个想法是使该行横穿屏幕顶部并使用标题行,但它也不支持换行符。

  3. 我可以在窗口的最后三行上显示一个叠加层,但是要使其健壮起来似乎很困难-当点到达该叠加层时(而不是窗口的实际末端),需要触发滚动,并且我必须不断地重新定位覆盖层,因为覆盖层位于文本空间而非窗口空间中。

  4. 我可以尝试在框架的底部制作专用窗口。我已经尝试过对此进行编码,但是它也不是很健壮,当框架中已经包含分割窗口并且我不得不将Cx,1重新绑定到可忽略的自定义版本的delete-other-windows时,它似乎无法正常工作我的特殊窗户,我肯定还有其他情况。同样,当一个帮助窗口弹出时,它会垂直弹出,因为它认为已经存在一个水平分割线(从技术上讲,它已经存在了,但仅显示一个单行窗口)。

  5. 我可以为此设置一个专用框架,但随后我的配置将无法在终端模式下运行,并且必须编写脚本窗口管理器以使其保持在屏幕底部,以使其无法选择,而不影响布局,等等等

  6. 我可以将3行的文本直接插入minibuffer中。我得到了部分工作,可以增加迷你缓冲区以适应3条线,并可以显示它们。但是,任何时候只要回显任何消息,这些行就会消失,直到我发出另一个命令,然后它们才重新出现。理想情况下,这3条线和回波区域不会重叠,因此我可以看到两者。如果我可以可靠地过滤哪些消息进入回显区域,这将不太烦人-我在EmacsWiki上找到了一个解决方案,但它似乎不适用于源自emacs C源代码的消息(特别是我想获得删除文件保存消息,因为我经常在计时器上自动保存)。

对于上下文,我的目标是不断显示当前缓冲区中最常用的单词,当前缓冲区中最近的单词以及当前缓冲区中最近使用的单词。我打算能够通过语音命令将它们插入缓冲区。因此,我可以说“最近2”,并让它从单词最近点的列表中选择第二项并插入。我只关心单词列表对于我当前正在编辑的缓冲区是否可见。我不想使用各种代码完成模式使用的弹出窗口,因为我需要列表始终可见。


好问题,并且提出来。希望您得到一些有用的建议。
Drew

我想知道#5的其他部分,除了终端模式的需求(这很重要)之外。您可以使用位于底部的专用框架(没问题)。不可选择是什么意思,为什么需要它?如果您是只读的,那也没问题。不影响布局是什么意思?总之,#5对我来说不太清楚。
Drew

@Drew:我的意思是说我使用键盘来驱动WM,并且不太可能将帧重点放在目标上,所以我希望我的下一个窗口/上一个窗口绑定跳过它。同样,我希望窗口布局的行为就像该框架只是面板/任务栏的一部分一样。编辑:在此评论中到处我都说“窗口”,我指的是X窗口,而不是emacs窗口; p
Joseph Garvin 2014年

向我建议的另一种可能性是仅使用小型缓冲区。我不知道是否有可能在此处被动显示文本,而不会干扰其他尝试使用它的内容……
Joseph Garvin 2014年

添加了有关尝试使用小型缓冲区的说明。
Joseph Garvin 2014年

Answers:


8

经过大量的实验,我能够使#6(使用minibuffer文本)达到“足够好”的工作状态。这是屏幕截图:

安全带的屏幕截图

有几个关键部分可以使这项工作:

  • 出乎意料的是,将文本插入迷你缓冲区几乎可以立即解决问题。在那里实际插入的文字会显示出来。
  • 通过使文本成为覆盖图的“后字符串”而不是常规文本,可以使其变为不可选择状态,而不必担心光标意外进入。
  • 为了使小缓冲区提示命令正确运行,必须在小缓冲区窗口处于活动状态时禁止插入文本/覆盖。
  • 如果您尝试使用常规的窗口调整大小功能来调整小型缓冲区的大小,则会出现有关窗口过小的错误;如果您使用未公开说明的md-resize-minibuf函数,则只要您愿意,就可以将其调整为所需的确切行数首先将resize-mini-windows设置为nil。
  • 要解决列表在消息出现时消失的问题,必须建议消息功能拦截消息。然后,您自己将它们插入迷你缓冲区。您还必须查看current-message变量,该变量存储最后显示在echo区域中的所有内容(令人惊讶的是echo区域和minibuffer在技术上是截然不同的,并且某些C源代码功能直接打印到echo区域而无需通过消息功能)。我在下面提供的代码是不完善的,消息的持久性比我仍然需要调查的正常时间更长(检查* Messages *中的最后一个条目可能更简单,更可靠),但是到目前为止这已经足够了。

这是我的实现的链接,其中带有显示杀手环的示例传送带。最终,这将是一个适当项目的一部分:https : //gist.github.com/jgarvin/ce37d08654978fd7e4c9

这是我第一次写任何数量的elisp,因此质量可能低于标准,但效果很好。


1

不幸的是,模式行和标题行都不能是多行。我以前曾问过这个问题,并且有(至少没有)任何隐藏的选项可以使此工作。所以1和2出局了。我也觉得3和6是骇客,从长远来看不会让你开心。3和4似乎是不错的方法,但是要使它们可靠地工作将是一笔不小的投资。

因此,我建议您首先在emacs-devel上进行介绍。以我的经验,如果您不认真地解释自己想要什么以及为什么这是一件好事,那么事情最终会实现的。可能要花一些时间,至少要等到下一个版本,但是如果您稍等片刻或使用开发版本,则可以轻松地获得所需的东西。


感谢您与emacs-devel联系的建议。即使我想出了一个解决方案,它也很笨拙,拥有一个真正的API可以直接在屏幕坐标上进行绘制会很好,因此,如果我有时间,我可能会以自己的方式拍摄电子邮件。
约瑟夫·加文
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.