微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Exuberant Ctags不能在Windows上正确排除文件

像这样执行Ctags

ctags -V -R --exclude=*.js

它不会正确排除*.js文件,正如您可以通过日志看到的那样

Reading initial options from command line Option: --exclude=*.js adding exclude pattern: *.js Reading command line arguments opening app.js as JavaScript language file sorting tag file

这是Ctags版本:

Exuberant Ctags 5.8,copyright (C) 1996-2009 Darren Hiebert Compiled: Jul 9 2009,17:05:35 Addresses: <dhiebert@users.sourceforge.net>,http://ctags.sourceforge.net Optional compiled features: +win32,+regex,+internal-sort

我已经尝试用双引号和单引号围绕模式,它仍然不起作用。

在windows上使用gvim中的taglist插件

显示一个函数在vim中所有地方的列表

为C / C ++标准libs,boost和第三方库设置单独的ctags db

vim用绝对path设置标签

如何使cscope在search过程中显示完整的文件path

如何通过Windows上的Ctagsparsing目录树中的文件时parsing*.js文件

Windows上的.ctags文件在哪里?

Vim + OmniCppComplete:完成对STL容器的类成员

从C ++源文件创build全局variables列表

我如何在一个大的代码库中运行ctags?

在Windows上使用Ctags和Gvim

Exuberants Ctags手册描述了选项 – --exclude :

…如果C编译器的运行时库提供了适当的支持,那么pattern可能包含Unix(…)上常见的常用shell通配符(不是正则表达式)。 您可以通过检查–version选项的输出来确定您的平台上是否可以使用shell通配符,这将在编译的功能列表中包含“+通配符”; 否则,使用简单的文本比较将模式与文件名进行匹配。

接下来看看运行ctags.exe --version输出的最后一行ctags.exe --version :

可选的编译特性:+ win32,+ regex,+ internal-sort

没有+wildcards 。 这意味着根据手册,Windows上使用的ctags.exe不支持*.js通配符模式。

在提供多种解决方案之前,让我们看看使用-R -V和-V -R开始选项列表。

Ctags输出Ctags ctags -V -R首先完成与列表的内部初始化

哪些解析器被安装,

哪些文件被解释为头文件

哪些语言映射是设置的,

使用哪些认的排除模式

哪些目录和文件搜索加载认选项。

但用-R -V启动选项列表时不会输出内部初始化。

所以当对内部初始化不感兴趣时​​,在命令行中指定-V不作为第一个选项。

要了解使用的命令以及它们如何在下面的批处理代码中运行,请打开命令提示符窗口,执行以下命令,并仔细阅读为每个命令显示的所有帮助页面

del /?

dir /?

echo /?

endlocal /?

for /?

if /?

set /?

setlocal /?

另请参阅Microsoft文章使用命令重定向操作符来解释>>和2>nul以及2^>nul ,其中重定向操作符>被脱字符符号^在解析FOR命令行时被解释为文字字符,但是作为通过FOR命令执行DIR命令行的重定向操作符。

解决方案1:完全排除语言JavaScript

排除* .js文件一个解决方案是完全使用命令行排除语言JavaScript:

ctags.exe -R -V --languages=-JavaScript

解决方案2:在命令行中指定要排除的每个* .js文件名称

一个解决方案是使用一个批处理文件,该文件将当前目录树中的每个* .js文件名称与选项--exclude到命令行中:

@echo off setlocal EnableExtensions EnableDelayedExpansion set "ExcludeOptions=" for /R %%I in (*.js) do ( if not defined JS_%%~nxI ( set "JS_%%~nxI=1" set "ExcludeOptions=!ExcludeOptions! "--exclude=%%~nxI"" ) ) ctags.exe -R -V%ExcludeOptions% endlocal

仅仅指定带有文件扩展名而没有(相对)路径的文件名就足够了,因为所有的* .js文件在独立于* .js文件所在的目录创建标签文件时应该被忽略。

编写代码是为了避免命令行上的重复,以使命令行尽可能短。

命令FOR忽略具有隐藏文件属性集的* .js文件以及具有隐藏属性集的目录。 但Ctags不会忽略具有隐藏属性集的文件文件夹。 下面的代码使用命令DIR可以用来添加隐藏文件夹中隐藏* .js文件和* .js文件的排除选项。

@echo off setlocal EnableExtensions EnableDelayedExpansion set "ExcludeOptions=" for /F "delims=" %%I in ('dir /AD /B /S *.js 2^>nul') do ( if not defined JS_%%~nxI ( set "JS_%%~nxI=1" set "ExcludeOptions=!ExcludeOptions! "--exclude=%%~nxI"" ) ) ctags.exe -R -V%ExcludeOptions% endlocal

这个解决方案的小缺点:

文件名中带有感叹号的* .js文件不会被排除,因为分别在扩展%%~nxI之后从文件名中删除了单个感叹号,两个感叹号之间的字符串将被完全删除或替换为匹配环境的值由于启用延迟扩展而变化。

解决方案3:使用临时创建的列表文件,并将所有* .js文件名称排除

在许多* .js文件中,将它们的文件名写入一个临时列表文件中可能会更好, Ctags将读取要排除的文件名称

@echo off setlocal EnableExtensions disableDelayedExpansion set "ExcludeListFile=%TEMP%ExcludeList.tmp" del "%ExcludeListFile%" 2>nul for /R %%I in (*.js) do ( if not defined JS_%%~nxI ( set "JS_%%~nxI=1" echo %%~nxI>>"%ExcludeListFile%" ) ) set "ExcludeOption=" if exist "%ExcludeListFile%" set "ExcludeOption= "--exclude=@%ExcludeListFile%"" ctags.exe -R -V%ExcludeOption% del "%ExcludeListFile%" 2>nul endlocal

解决方案不需要延迟扩展,因此也适用于文件名中包含感叹号的* .js文件

再次几乎相同的代码,不会忽略* .js文件与隐藏的文件属性集或在一个隐藏的文件夹:

@echo off setlocal EnableExtensions disableDelayedExpansion set "ExcludeListFile=%TEMP%ExcludeList.tmp" del "%ExcludeListFile%" 2>nul for /F "delims=" %%I in ('dir /AD /B /S *.js 2^>nul') do ( if not defined JS_%%~nxI ( set "JS_%%~nxI=1" echo %%~nxI>>"%ExcludeListFile%" ) ) set "ExcludeOption=" if exist "%ExcludeListFile%" set "ExcludeOption= "--exclude=@%ExcludeListFile%"" ctags.exe -R -V%ExcludeOption% del "%ExcludeListFile%" 2>nul endlocal

解决方案4:使用临时创建的列表文件来解析所有文件

在命令行上指定要使用通配符模式进行解析的文件应该足够了,因为这是由Windows编译的Ctags支持的。

ctags.exe -R -V *.htm

这个命令行应该导致解析当前目录的整个目录树中的所有* .htm和* .html文件。 * .html也与此通配符模式相匹配,因为8.3名称的缩写为* .html文件文件扩展名为HTM。 认情况下用于搜索匹配通配符模式的文件的Windows内核函数始终在长文件名和短文件名上应用模式,以确定模式是否与文件名相匹配。

可以在命令行中指定多个文件扩展名,而不是C / C ++中的一个

ctags.exe -R -V *.c *.cpp *.h

但问题是Ctags版本5.8不搜索递归匹配通配符模式的文件,尽管选项-R被指定。 它看起来像编译器添加的启动代码用于创建ctags.exe已经搜索匹配通配符模式的文件,因此Ctags的 main功能获取参数列表与参数*.htm已被替换为多个参数,每个参数包含文件名匹配当前文件夹中的通配符模式。

在Unix / Linux上,像*.htm *.html这样的通配符模式不会被引号引起来,将导致当前目录中的所有文件名都被这个shell(sh,bash,ksh, )在调用Ctags可执行文件之前。

换句话说,指定要在命令行上解析的文件类型不能工作递归,因此在这里没有解决方案,因为-R意味着需要递归解析文件

但是,工作是创建临时的列表文件文件扩展名和所有文件的完整路径的文件名解析和指定该列表文件的命令行上的文件名。

首先忽略具有隐藏属性集的文件和目录,因为使用for /R :

@echo off setlocal EnableExtensions disableDelayedExpansion set "IncludeListFile=%TEMP%IncludeList.tmp" del "%IncludeListFile%" 2>nul for /R %%I in (*.htm) do echo %%I>>"%IncludeListFile%" if exist "%IncludeListFile%" ( ctags.exe -L "%IncludeListFile%" -V del "%IncludeListFile%" 2>nul ) endlocal

其次,由于使用dir /AD还隐藏了隐藏文件文件

@echo off setlocal EnableExtensions disableDelayedExpansion set "IncludeListFile=%TEMP%IncludeList.tmp" del "%IncludeListFile%" 2>nul for /F "delims=" %%I in ('dir /AD /B /ON /S *.htm 2^>nul') do echo %%I>>"%IncludeListFile%" if exist "%IncludeListFile%" ( ctags.exe -L "%IncludeListFile%" -V del "%IncludeListFile%" 2>nul ) endlocal

在这两个批处理代码中,单个通配符模式*.htm可以替换为空格分隔的通配符模式列表, * *.c *.cpp *.h或更复杂的模式。

DIR选项/ON导致通过命令DIR对NTFS驱动器上不需要的命令DIR排序文件名称,因为新技术文件系统将总是按名称排序的文件名称列表返回到调用Windows核心功能,但FAT(文件分配表)驱动器(FAT16,fat32,exFAT)不需要。 这在这里并不重要,但是按名称排序时查看已处理文件更容易,与当前驱动器的文件系统无关。

带有临时列表文件解决方案包含要解析的文件文件名是由内置Ctags支持的文本编辑器和IDE使用的方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐