加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Vim以C/C++代码行搜索

发布时间:2020-12-15 19:55:53 所属栏目:安全 来源:网络整理
导读:有没有办法在跳过注释行时在C/C++源文件中搜索字符串? 这是一个有趣的问题。 我认为@sixtyfootersdude有正确的想法 – 让Vim的语法突出显示告诉你什么是评论,什么不是,然后在非评论内搜索匹配。 我们从一个模仿Vim的内置search()例程的函数开始,但也提供
有没有办法在跳过注释行时在C/C++源文件中搜索字符串?
这是一个有趣的问题。

我认为@sixtyfootersdude有正确的想法 – 让Vim的语法突出显示告诉你什么是评论,什么不是,然后在非评论内搜索匹配。

我们从一个模仿Vim的内置search()例程的函数开始,但也提供了一个“skip”参数,让它忽略一些匹配:

function! SearchWithSkip(pattern,flags,stopline,timeout,skip)
"
" Returns true if a match is found for {pattern},but ignores matches
" where {skip} evaluates to false. This allows you to do nifty things
" like,say,only matching outside comments,only on odd-numbered lines," or whatever else you like.
"
" Mimics the built-in search() function,but adds a {skip} expression
" like that available in searchpair() and searchpairpos().
" (See the Vim help on search() for details of the other parameters.)
" 
    " Note the current position,so that if there are no unskipped
    " matches,the cursor can be restored to this location.
    "
    let l:matchpos = getpos('.')

    " Loop as long as {pattern} continues to be found.
    "
    while search(a:pattern,a:flags,a:stopline,a:timeout) > 0

        " If {skip} is true,ignore this match and continue searching.
        "
        if eval(a:skip)
            continue
        endif

        " If we get here,{pattern} was found and {skip} is false," so this is a match we don't want to ignore. Update the
        " match position and stop searching.
        " 
        let l:matchpos = getpos('.')
        break

    endwhile

    " Jump to the position of the unskipped match,or to the original
    " position if there wasn't one.
    "
    call setpos('.',l:matchpos)

endfunction

这里有一些基于SearchWithSkip()的功能来实现语法敏感搜索:

function! SearchOutside(synName,pattern)
"
" Searches for the specified pattern,but skips matches that
" exist within the specified syntax region.
"
    call SearchWithSkip(a:pattern,'', 'synIDattr(synID(line("."),col("."),0),"name") =~? "' . a:synName . '"' )

endfunction


function! SearchInside(synName,but skips matches that don't
" exist within the specified syntax region.
"
    call SearchWithSkip(a:pattern,"name") !~? "' . a:synName . '"' )

endfunction

以下是使语法敏感搜索功能更容易使用的命令:

command! -nargs=+ -complete=command SearchOutside call SearchOutside(<f-args>)
command! -nargs=+ -complete=command SearchInside  call SearchInside(<f-args>)

这还有很长的路要走,但现在我们可以这样做:

:SearchInside String hello

它搜索hello,但只在Vim认为一个字符串的文本内。

和(最后!)这个搜索双重的地方,除了评论:

:SearchOutside Comment double

要重复搜索,请使用@:宏重复执行相同的命令,如按n重复搜索。

(感谢您提出这个问题,现在我已经构建了这些例程,我期望使用它们。)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读