如何用Vim的Perl过滤器查找LaTeX文件中的重复\label?
查找TeX文件中重复\label的Vim过滤器实现
第一步:修正你的Perl脚本
你的原脚本存在几个问题:每次匹配到标签就立刻输出所有已存标签,导致重复内容泛滥;循环与条件判断的代码块闭合不完整;未针对重复出现的标签做筛选。下面是修正后的版本,用__DATA__模拟输入做测试:
#!/usr/bin/perl use strict; use warnings; my %seen; # 第一遍遍历:统计每个标签的出现次数 while ( <DATA> ) { if (/\\label\{([^}]+)\}/) { # 注意反斜杠需要转义 $seen{$1}++; } } # 重置DATA指针到开头,准备第二遍遍历找对应行 seek DATA, 0, 0; # 第二遍遍历:输出重复标签所在的行(带行号) while ( <DATA> ) { if (/\\label\{([^}]+)\}/ && $seen{$1} > 1) { print "$. : $_"; # $. 代表当前行号,方便定位 } } __DATA__ \label{fig:foo} \label{fig:bar} \label{fig:foo1} \label{fig:bar1} \label{fig:foo2} \label{fig:bar2} \label{fig:foo}
脚本说明
- 两次遍历逻辑:先统计所有标签的出现次数,再回滚到数据开头,筛选并输出重复标签的对应行。
- 运行脚本后会直接显示重复的
\label{fig:foo}所在两行:1 : \label{fig:foo} 7 : \label{fig:foo}
第二步:做成Vim过滤器
把脚本改成Vim可用的过滤器,有两种常用方式:
方式1:临时过滤当前文件
- 将修正后的脚本保存为
find_dup_labels.pl,添加执行权限:chmod +x find_dup_labels.pl。 - 在Vim中打开目标.tex文件,执行命令:
这条命令会把当前文件内容作为脚本输入(替代:%!./find_dup_labels.pl__DATA__),用脚本输出替换当前文件内容,直接显示所有重复标签的行。
方式2:添加Vim命令快速调用
如果需要频繁使用,可以把脚本路径加入Vim配置文件(比如~/.vimrc):
command! -nargs=0 FindDupLabels %!~/path/to/find_dup_labels.pl
保存配置后,在Vim中打开.tex文件,直接输入:FindDupLabels就能快速触发重复标签查找。
额外优化:只输出重复标签汇总
如果不需要显示对应行,只想看哪些标签重复及次数,可以简化脚本:
#!/usr/bin/perl use strict; use warnings; my %seen; while ( <> ) { $seen{$1}++ if /\\label\{([^}]+)\}/; } print "重复的标签:\n"; foreach my $label (sort keys %seen) { print "$label 出现了 $seen{$label} 次\n" if $seen{$label} > 1; }
运行后会输出:
重复的标签: fig:foo 出现了 2 次
内容的提问来源于stack exchange,提问作者Marek Stepanek
相关产品推荐
相关产品推荐

