vim搜索或匹配模式与变量

时间:2015-06-24 09:01:28

标签: vim

在我的上一个问题中,python code in vim scriptlcd047为我提供了一个漂亮的vimscript。我试图让它更通用,因此,我将固定搜索字"Program"替换为a:arg

function! FixName(arg)
    let [buf, l, c, off] = getpos('.')
    call cursor([1, 1, 0])

    :let lnum = search('\v\c^" . a:arg ."\s+', 'cnW')
    if !lnum
        call cursor(l, c, off)
        return
    endif

    "let parts = matchlist(getline(lnum), '\v\c^Program\s+(\S*)\s*$')
    :let parts = matchlist(getline(lnum),'\v\c^" . a:arg ."\s+(\S*)\s*', 'cnW')
    if len(parts) < 2
        call cursor(l, c, off)
        return
    endif

    let lnum = search('\v\c^End\s+Program\s+', 'cnW')
    call cursor(l, c, off)
    if !lnum
        return
    endif

    call setline(lnum, substitute(getline(lnum), '\v\c^End\s+Program\s+\zs.*', parts[1], ''))
endfunction

它不起作用。没有错误,没有变化,如替代品所预期的那样。

我还想让它不区分大小写。

1 个答案:

答案 0 :(得分:2)

只需用Program替换每个a:word字词,例如:

function! FixName(word)
    let [buf, l, c, off] = getpos('.')
    call cursor([1, 1, 0]) 

    let lnum = search('\v\c^' . a:word . '\s+', 'cnW')
    if !lnum
        call cursor(l, c, off)
        return
    endif

    let parts = matchlist(getline(lnum), '\v\c^' . a:word . '\s+(\S*)\s*$')
    if len(parts) < 2 
        call cursor(l, c, off)
        return
    endif

    let lnum = search('\v\c^End\s+' . a:word . '\s+', 'cnW')
    call cursor(l, c, off)
    if !lnum
        return
    endif

    call setline(lnum, substitute(getline(lnum), '\v\c^End\s+' . a:word . '\s+\zs.*', parts[1], ''))
endfunction

lcd047解决方案已经匹配忽略大小写,因为每次搜索开始时都有\c个原子。