关于 Emacs 的列高亮问题

在 27.2 版本,我发现可以开启 Emacs 的列高亮功能了,我的做法是引入了下面两个源文件:

然后通过下面的配置开启列高亮:

;; 高亮当前列
(add-to-list 'load-path "~/.emacs.d/config/highlight-column")
(require 'col-highlight)
(column-highlight-mode 1)
(set-face-attribute 'col-highlight nil :inherit 'hl-line :background)

在使用上是不存在卡顿问题的,而且通过最后一行的配置,也能够保证列的高亮背景色值和行的高亮背景色值始终是相同的。

我的问题

通过以上的设置,正常使用是没有问题的。但是不知道什么原因,这样开启列高亮以后,和 company 的提示有点儿冲突,虽然不影响使用,但是看起来有点儿别扭:

另外的一个问题就是和 ace-jump 有冲突,同样是错位的问题:

company 只是提示的第一行有问题不同,ace-jump 是空行才会出现错位,我相信是都是层级原因导致的,但奈何 Lisp 水平有限,在此求助大家帮帮忙,看能否通过简单的方式解决这个问题?这样,就不用羡慕对面 Vim 原生自带的流畅列高亮了……

这是 emacs 已知的问题,你可以试试 company-posframe

完了,又要回到空白黑屏了 :see_no_evil:

Emacs 直到最近才有了 child frame,此前都只能用 overlay 模拟补全菜单,这玩意极其容易受到干扰。

似乎核心开发的大佬们都不重视这项功能,当 x-popup-dialog & x-popup-menu 完成之后这么多年就没有再进一步了。这些接口依然只能用来显示对话框和固定菜单。

从吃瓜的角度看,稍微改一改拿来显示补全菜单不是很容易嘛。还真不是,我之前试了一下,要从底层实现补全菜单太费劲了, 大佬们当初就没这方面的规划。也许最近的 child frame 就是考虑到改历史代码不如重新实现,希望 child frame 以后能支持终端,变成通用的菜单接口,把旧的 menu.c 废掉。

child frame 最初引入好像也不是为了搞弹出菜单,我感觉可能是大牛觉得 frame 应该可以嵌套,所以就搞了一个 child frame,我是以八卦之心来考虑这件事 :slight_smile:

早期 yasnippet 好像就用这个弹的,就是不知道为什么后来就不用了,我刚刚在优酷上还是哪里找到一张截图,。

要不考虑一下物理扩展? 比如,在显示器80列的地方吊一根铅锤线。。。。

我觉得什么时候 Mac 能解决掉用 child frame 不再出现空白黑屏了,就完美了

这个也只能期待大牛的神手了。。。。。。

child frame 的动机属于我的臆测。

不过用浮动的 child frame 来显示对话框/补全菜单,的确是不同于 x-popu-* 的另一种思路,就像 helm (虽然性能堪忧) 也是用一个显示在底部窗口的 buffer 来展示补全项。


下图是我之前改造 x-popu-* 的一些尝试:

image

这种方式实现补全菜单,底层必须管理菜单的动态变化,处理用户输入等等。

如果是 child frame 实现补全菜单,则由用户来管理 child frame 的内容,因为它本身就是一个功能完备的 frame,所以更具可「玩」性,例如可以在里面渲染 markdown/org。而 x-popup-* 菜单长什么样基本在底层写死了。

child-frame 支持终端的可能性有多大? 我对emacs底层不了解,没概念

菜单没那么复杂,任意gtk/qt窗口做鼠标焦点处理和键盘焦点获取。

x11协议了解,菜单实现太简单了

不可能,child frame还是x11范畴

company-box应该能解决你的问题