Package cl is deprecated

(eval-when-compile (setq lexical-binding t))

不就行了

你这个应该是没管用。。。

也可以试试 eval,eval 的可选参数可以控制 lexical scoping 的开关的

EmacsLisp中的静态作用域与动态作用域

开启 lexical scoping

(eval
 '(let ((i1 0))
    (defun my-test ()
      (let ((i2 0))
	(prog1
	    (list i1 i2)
	  (setq i1 (1+ i1))
	  (setq i2 (1+ i2))))))
 t)
(my-test) ; => (0 0)
(my-test) ; => (1 0)
(my-test) ; => (2 0)

关闭 lexical scoping

(eval
 '(let ((i1 0))
    (defun my-test ()
      (let ((i2 0))
	(prog1
	    (list i1 i2)
	  (setq i1 (1+ i1))
	  (setq i2 (1+ i2))))))
 nil)

执行 (my-test)直接报错

eval很坑爹,只能手动传lexical env,不是开了就自动有

我看有一堆都用了 这个’cl 啊,都不知道那警告是出于哪一个~~

升级到 Emacs 27 就有这个警告了,很多的 packagesrequirecl

cd ~/.emacs.d/elpa
rg "require 'cl\)" .
(setq byte-compile-warnings '(cl-functions))

将这个写到 init.el 就没有警告了。

1 个赞

升级到27之后我也遇到了同样的问题,把上边的话放在init.el里解决,但是必须放在加载一些包之前,具体是哪个还没有一一排查。

1 个赞

岂不是掩耳盗铃了

最后我把我的配置拆成了很多文件,有的开 lexical binding,有的不开。我用的包比较少,很早之前就没有用 cl 的了。

用如下的语句应该能得到cl依赖的包:

(require 'loadhist)
(file-dependents (feature-file 'cl))
9 个赞

感谢提供,我这边是adoc-mode这个包。

我们坐等着相应包的升级啊?~

还是找到相应的包进行替换 ( cl-mac cl-lib

哪个大牛能不能讨论下使用影响?

使用上短期内应该没太大影响。

目前大多数 cl- 函数就是归类到不同的子文件,然后在 cl.el 再声明一个别名:

所以 (require 'cl) 就还能使用到原先那些函数,只不过会收到警告。

函数本身并没有什么改动。要是改动太多的话,估计 Emacs 生态圈都要崩了。

3 个赞

只是一个warning提示而已,自己没必要处理吧

我有用一些 较老的包, 这些包是 不可能, 再会有人 更新的, 真担心 「万一」 弃用了, 我可不会改 :innocent:

直接丢掉这些老的包,选择新的包替代。

  1. visual-basic-mode, wps vba要用

  2. 自己用来做 窗口管理

kiwanami/emacs-window-layout: A simple window layout management framework for emacs

  1. 这两个有什么包可以 替换呢, 相关功能的 包可不会找
  1. visual-basic-mode 可以自己fork修改下就行(用cl-lib);
  2. 窗口布局管理的就多了,eyebrowse、persp-mode、workgroups等都可以。

你慢慢就学会改了。。。。

大概看了下, eyebrowse 以前也有试过, persp-mode 也看了下, workgroups 也粗看了下, 可能我理解的不对, 这几个包 针对的是 较普遍性的, 我想用的是 window-layout 这种 api 的, 它可操作性 与自定义性, 比较强, 那这几个包了, 可能也有 开放 一些 API, 我没看, 也应该 也是看不会的, window-layout 较直观些, 好像 代码也不长, 当做学习, 我是边用边学的, 如有点底了, 就自己改吧, 把 cl 改成 cl-lib, 我想用好 emacs 还是要在关键的时候, 自己会改些