【发布时间】:2021-01-16 03:18:42
【问题描述】:
我有一个 vim 脚本来帮助重构 Python 代码;根据文件,它会插入多个相等的 import 行,例如如果将许多行更改为使用getToolByName,则会出现多次from Products.CMFCore.utils import getToolByName。
为了清理,我在脚本末尾附近有几行如下所示:
normal gg
/^\(from AccessControl import Unauthorized\>\)\?/
.+1,$s,^from AccessControl import Unauthorized\n,,e
normal gg
/^\(from Products.CMFCore.utils import getToolByName\>\)\?/
.+1,$s,^from Products.CMFCore.utils import getToolByName\n,,e
这个想法是:
- 对于每个可能插入的导入行,
- 转到文件顶部,
- 查找包含此导入的第一行(好吧,从它开始,并且可能包含更多),
- 并删除所有进一步行(
.+1,$)与完全插入的导入匹配。
为了避免错误(这会伤害很多,尤其是通过:argdo 使用脚本时),我将搜索设为可选(\?),因为e 标志适用于仅限 :s 命令。如果该搜索未找到真正的匹配项,则以下 :.+1,$ s 命令也不应删除任何内容,因为它更具限制性。
(剩余插入的行需要手动移动)
但是,由于 \?,替换不仅删除了以下出现 (.+1),而且 所有 - 包括我想保留的第一个。
我该如何解决这个问题?
基于sed 的解决方案也会对我有所帮助。
版本: vim v7.4 (CentOS Linux) 和 gvim 8.1 在 Windows 上的问题相同。
谢谢!
编辑:
现在我有了一个解决方法,我仍然对不需要临时更改的“适当”解决方案感兴趣,因此如果一切正常,vim 会考虑文件未更改。
【问题讨论】:
-
考虑使用Vi and Vim StackExchange 来解决有关 Vim 的问题!