【问题标题】:Matching does not stop at EOL when searching in VsVim在 VsVim 中搜索时匹配不会在 EOL 处停止
【发布时间】:2014-10-01 14:56:28
【问题描述】:

将 VS 2010 与 VsVim 结合使用。

我发现搜索引用的文本,例如

/["][^"]\{0,\}["]

这是我为查找引用所做的几种不同努力之一,可能是一些不包括引号的内容,然后是另一个引用,例如"stuff",或""(空字符串),或任何其他引用字符串。

此搜索不一定限于单行。我还没有做任何详尽的分析来确定所有这些多行匹配是否有共同点,尽管转义引号 (\") 似乎相当普遍。

我尝试了一些限制性添加,但直到我将 \n 添加到排除集后它才停止这样做。

在 gVim 中,默认情况下,搜索仅限于一行。

我可以看到跨行结束边界进行搜索的优势,但这不是我想要的默认设置。

有没有我错过的设置?

以下是该正则表达式的匹配示例:

        oss << "bonus game conditions \"" << index << "\" not found for bonus game \""
        << bonusGameID << "\"";

这是两行代码,包含五个匹配项。

"bonus game conditions \"
" << index << "
" not found for bonus game \"

然后

"
        << bonusGameID << "

""

我们感兴趣的比赛是这个:

"
        << bonusGameID << "

因为那是跨越换行符的那个。


这是另一个,第一个引号用单引号括起来:

                CharReplace( *it, wchar_t( '"' ), L"<DQ>" );

            if ( !arg.empty() )
            {
                args.push_back( arg );
            }
        }

        it++;
    }

    // Re-compose the string from words
    WordsToString( words, delimiters, _str );

    // Replace newlines with ICU specifiers (NOTE: CS3 uses '\r' instead of '\n' for a newline)
    CharReplace( _str, wchar_t( '\n' ), L"<NL>" ) || CharReplace( _str, wchar_t( '\r' ), L"<NL>" );

第一场比赛开始,'"' 在第一行直到&lt;DQ&gt; 之前的L",第二场比赛在&lt;DQ&gt; 之后拿起",一直持续到@ 的开场报价最后一行是 987654338@。

发生的事情并不是一个谜。令人费解的是允许匹配默认包含换行符的决定。


好的,所以我做了更多的实验。这就是我认为正在发生的事情。

据我所知,这是[^"] 子表达式。不管我用什么开始表达式,如果我写 /_[^_]_/ 我会得到类似的行为,换行符是——从字面上看——“不是只有下划线的集合的成员”。 (或者,它隐含地是“所有非下划线”的成员。)

在普通搜索中(/_.*_/,对两个下划线之间的内容进行贪婪搜索),搜索停留在单行上(或者更准确地说,不跨越换行符),因为换行符实际上不是“零个或多个任何东西”的成员。

所以换行符不是.* 的成员,但它[^_][^"] 的成员,或者选择您想要排除的任何内容。

为确保搜索不跨越换行符边界,排除集必须明确包含\n(换行符)。

我已经确认 gVim 隐含地从“not-one-of-these”集合中排除了换行符。为了让 gVim 包含行尾,必须在集合括号前添加 \_,因此:\_[](或在集合中包含 \n)。


结论:如果这是 VsVim 中的“功能”,它应该是你可以打开和关闭的东西。如果是出乎意料的行为,那会是一个错误吗?

【问题讨论】:

  • 好的,稍后进行大量编辑。 . .我认为现在是正确的。
  • 我快速浏览了一下,它似乎只是一个错误。处理$\n 的逻辑是不正确的,会导致这种行为。如果您可以提交错误github.com/jaredpar/VsVim 我可以尝试在下一个版本中修复此问题

标签: regex vim vsvim


【解决方案1】:

Jared 对 1.8.0 中的 Regex 内容进行了一系列修复,以使其更符合 Vim 对 Regex 的看法。在 Visual Studio 2010 和 2013 上运行 VsVim 1.8.0 我无法再重现此问题。

看来您的解决方案是升级到最新版本。

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多