我试图编写一个替换所有缓冲区中文本的函数。所以我打电话给Ack搜索所有匹配项,下一步我要将此代码设置为Quickfix命令行
:QuickFixDoAll %s/foo/boo/gc
好像我只能打电话给'exec'立即运行此命令的功能,无法编辑或取消所有
我也试过"输入"函数读取用户输入但在运行时出现此错误
not an editor command
有什么想法吗?
的.vimrc:
function! ReplaceInFiles(o, n)
exec "Ack '" . a:o . "'"
exec "QuickFixDoAll %s/" . a:o . "/" . a:n . "/gc"
endfunction
" QuickFixDoAll
function! QuickFixDoAll(command)
if empty(getqflist())
return
endif
let s:prev_val = ""
for d in getqflist()
let s:curr_val = bufname(d.bufnr)
if (s:curr_val != s:prev_val)
exec "edit " . s:curr_val
exec a:command
endif
let s:prev_val = s:curr_val
endfor
exec "quit"
endfunction
command! -nargs=+ QuickFixDoAll call QuickFixDoAll(<f-args>)
答案 0 :(得分:1)
以交互方式查询两个值:
function! ReplaceInFiles()
let l:o = input('search? ')
let l:n = input('replace? ')
exec "Ack '" . l:o . "'"
exec "QuickFixDoAll %s/" . l:o . "/" . l:n . "/gc"
endfunction
nnoremap <Leader>r :call ReplaceInFiles()<CR>
nnoremap <Leader>r :let o = ''<Bar>exec "Ack '" . o . "'"<Bar>exec "QuickFixDoAll %s/" . o . "//gc"<Home><Right><Right><Right><Right><Right><Right><Right><Right><Right>
这个将光标放在搜索的正确位置。由于此值使用两次(Ack和QuickFixDoAll),因此将其分配给变量。之后,移至命令的末尾并填写//gc
。
最舒适的选项是自定义命令:AckAndSubstAll/search/replacement/
。为此,您需要在自定义命令中解析这两部分(如:s
那样)。您可以使用matchstr()
执行此操作,或使用ingo-library plugin中的ingo#cmdargs#substitute#Parse()
。
答案 1 :(得分:0)
首先使用vim-qargs通过调用:Qargs
将所有文件从quickfix窗口复制到Vim的arglist中。
然后通过执行:argdo %s/search/replace/gc