关于 emacs 替换时动态 eval 代码的问题

大家用emacs最爽的经历是? 正则替换也能玩出花来 上面两个网址都用上了替换时动态 eval 的操作,但我都没有成功过,显示 void variable count,init 里也 require 了 cl 和 cl-lib,是哪里出问题了吗?系统是 win10 64,用的 Emax 64。

报错意料之中,因为 count 没定义。或许作者自己定义了,却忘记提了。但是 \# 代表当前序号,用不着自己数,参考 C-h k C-M-%

\# 确实可以,但网址里给的那个功能更强大,如果是 count 没定义的问题的话,我再去问问作者好了:sob:

没有就自己定义一个呗 (defvar count 0)

本坛坛友已经总结过许多生成序列的骚姿势了

加入 (defvar count 0) 之后,所有替换都变成0了。另外我看你那个链接里,子龙山人最开始用的命令里也包含 count,我输入他那个命令也是不行的,是不是 Spacemacs 里集成了什么插件,我这里没有啊?

defvar单独用一次再用替换

你的意思是先 M-: (defvar count 0) ,再在正则里输入 \,(cl-incf count 0) 吗,我这样做也不行啊。

场景二提供一个 vim 的思路:先找 <li>,再往回找最近的 <ul> 。两者行数减一下,就知道奇/偶数行了。

:%s/<li>/\='<li class='.((search('<ul>','b')-search('<li>'))%2?'"odd">':'"ever">')/g

就是基础操作 :%s/pat/sub/g 扩展了一下。无需定义新变量,简洁直观,一行搞定。


论坛可能有几个 vim 党,这里再贴一遍好了。

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs_20190218163426

不知道你的emacs是怎么样的,我这是开着emacs -q测试

我这么输之后,第一次是最底下的id为1,依次往上递增。然后加了个0再删掉,数字就开始变了(装了可视插件,所以全程没有执行,但替换后的结果一直在变)。先暂时放弃了…反正现在也还用不上,到时候再说吧 :sweat:

\#吧,如果想骚操作,用子组匹配就可以获取内容然后用elisp操作了