Vim的。从函数设置命令行

时间:2015-11-07 20:10:23

标签: vim

我试图编写一个替换所有缓冲区中文本的函数。所以我打电话给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>)

2 个答案:

答案 0 :(得分:1)

使用input()

以交互方式查询两个值:

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

对arglist中的所有参数运行替换