emacs 28包loading规则有什么变化吗?

升到emacs 28后发现一个问题,之前用来作为mpd前端听歌的mingus不能用了。排查了一番之后发现原因似乎在于mingus中require了libmpdee这个包,但是这个包在emacs 28中无法正常的自动载入。

特别是我发现即便手动(require 'libmpdee),这个包中定义的一些macro仍然无法在启动时自动载入,所以导致mingus无法运行,除非我手动eval-buffer。特别是,这些无法载入的macro都放在eval-after-compile中,就像如下形式。

(eval-when-compile
  (defmacro _mpdgv () `(aref conn 0))
  (defmacro _mpdsa (val) `(aset conn 9 ,val)))

在emacs 27中我没有遇到这个问题,emacs 28是有什么变化吗?有什么办法克服这个问题吗?

你没 byte compile mingus

我把mingus重新byte compile生成elc文件后,还是不行。我要是把libmpdee重新byte compile一次,那么mingus就可以用了。但问题是下次emacs启动后,就又不能用了。

你有没有试过先 byte compile libmpdee 再 byte compile mingus。记得用 byte-force-recompile。

我以这个次序试过了,还是当时可以,重启emacs后就失效。

我看了下 libmpdee 的代码,它太老了,在 Emacs 28 上编译起来有问题。

我可以给整个修改版的。

https://pastebin.com/w0n2HXWU

'(lambda 改成 #'(lambda 再编译就好了。

2 个赞

话说mpd用起来好玩吗?

谢谢大佬帮忙!果然可以了。

'(lambda 改成 #'(lambda 再编译就好了

我之前听说这个#符号在这种情况下加不加应该对语义没有什么影响。但升到28后,如果匿名函数之前没有这个#符号,编译时的确会产生警告。28是有什么相关改变吗?

我觉得算是挺好用的。

其实,我发现内置的mpc就很好使。

1 个赞

好像也是啊 :sweat_smile:,我是之前论坛有人推荐mingus,试了试发现还不错,就一直用着了。这算是路径依赖?

内置竟然还有这个 :exploding_head:,除了没有tag编辑之外感觉功能不比ncmcpp少,而且基本上配置好mpd之后开箱即用,感觉之前错过了一个亿 :joy:

mingus最新版已经解决这个问题,可以直接升级使用了。不过我使用中发现两个问题:

  1. playlist 界面中,timer 刷新会导致 face 失效。
  2. 是不是会卡死 emacs,只能重启,C-g都不好使。