(发现)emacs -nw 在kitty中能支持显示图片

虽然我并不知道怎么给它个位置放置,它只能浮动在窗口。 :joy:无聊的发现

1 个赞

neovim 早就支持显示图片了,现在 neovim 都可以实时渲染 latex 公式了。

emacs 邮件列表有技术讨论,为终端emacs增加图片显示的可行性。一些历史遗留设计原因,导致图片之类的多媒体也被假设为1个cell,如果在终端里插入图片,会导致坐标计算显示出现问题,实现起来可能要动底层代码的大刀可能会有难度。

https://lists.gnu.org/archive/html/emacs-devel/2022-09/msg00405.html

从他们的角度来说,估计要终端要适配gui的操作,也就是两者功能要统一,那应该不会很容易。我做这个是因为发现假如在kitty中打开vterm,chafa不能正确渲染图片,连普通终端那种都做不到。

当然,这也仅仅是个简单的测试,显示出图片还是可以的。但是其他的就做不到了。

不过我感觉这件事早晚是要做的,毕竟 GUI 里大图片的显示和操作也有问题…

1 个赞

我又思考了下。其实最大的问题不是啥历史遗留问题。最大的问题是emacs内的文本要查询它在终端的坐标,因为kitty的图形协议做的图片只认终端坐标。我也测试了下neovim的image.nvim,效果也一般,跟随滚动也是一卡一卡的,应该也是随滚动重新绘制。

试一下 snacks.nvim 的 image module。

看了眼,位置是固定的,本质是预览。

(defun kitty-image--write-tty (data)
  "Write DATA to /dev/tty directly."
  (let ((coding-system-for-write 'binary)
        (write-region-inhibit-fsync t))
    (write-region data nil "/dev/tty" t 0)))

(defun kitty-image-test-direct-display (file)
  "Test direct image display in Kitty terminal."
  (interactive "fImage: ")
  (let* ((data (with-temp-buffer
                 (set-buffer-multibyte nil)
                 (insert-file-contents-literally file)
                 (buffer-string)))
         (b64 (base64-encode-string data t))
         (test1 (format "\x1b_Ga=T,f=100,z=-1,t=d;%s\x1b\\" b64)))
    (message "Test 1: Direct display")
    (kitty-image--write-tty test1)
    (sit-for 2)))

这就是emacs在kitty显示图片的方法,有想法的人可以尝试做个固定位置的预览,不过我对这个兴趣不是很大了,我原本以为终端的neovim可以显示图片应该比较丝滑的,但是尝试下来也一般。如果有人能把emacs 的文本在终端的位置暴露出个接口,我可能会做个跟随滚动的测试,不过目前就只能停留在这种简单的尝试了。

效果很不错啊,远程服务器上也可以用!请问有什么办法清除显示的图片吗

更新:好像这样就可以 (kitty-image--write-tty "\e_Ga=d\e\\")清除

你选的远程的图片?那我没试过,不过原理大概就是这样的。

我是在kitty上直接用服务器端的emacs,居然也完美显示图片,虽然只有预览功能,也非常符合我的工作需求了

那真是没想到哈 :joy:

只能说理论很丰满,现实很骨感。虽说效果不如neovim,但也算勉强支持了。 test4

2 个赞

大佬!怎么做到的?目前这个看起来图片是悬浮在文字上的,会遮盖住文字?

因为本质就是浮动的。我这个例子的链接是手动隔开的。讲道理应该可以做内联挤开文字的,不过效果也一般,没啥动力继续做。

我也不是啥大佬,只是想用AI扩展一下emacs的用途,另外也是因为我主要在终端上用emacs。

话说之前reddit又有人来讨论kitty 图形协议的支持, GitHub - cashmeredev/kitty-graphics.el: Display images in terminal Emacs (emacs -nw) via the Kitty graphics protocol. 这个项目确实可以让emacs在终端上可以丝滑显示图片。

于是我重新改造了之前的项目。效果如下:

test

其实有改进空间,可以把图片对齐的,但是需要给这个人提pr,我暂时懒得做了。