在我的上一个问题中,python code in vim script,lcd047
为我提供了一个漂亮的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
它不起作用。没有错误,没有变化,如替代品所预期的那样。
我还想让它不区分大小写。
答案 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
个原子。