2012-09-28 43 views
1

写时有时需要依次替换几个不同的单词,比如说a1-> a2,b1-> b2,c1-> c2等。如何交互地用第二个列表的元素替换一个值列表的元素?

对于这个让我去后

:s/a1/a2/gc 

开始我手动编辑命令历史和b1和b2更换a1和a2,做替代,并继续到下一个项目。

工作流程我想有会是这样的:

:let in = ['a1', 'b1', 'c1'] 
:let out = ['a2', 'b2', 'c2'] 
:call ReplaceAllWithConfirmation(in, out) 

其中ReplaceAllWithConfirmation将是将执行的替代功能,但要我每次确认。

这可能吗?

谢谢!

回答

3

您不需要编写函数。只需运行以下命令:

:%s/[a-c]1/\={'a1':'a2','b1':'b2','c1':'c2'}[submatch(0)]/gc 

您可以在\=之后有一个表达式。

+0

这是一个巧妙的使用替换表达式,尽管模式重复和语法仍然会很麻烦,每次键入。 –

2

与蒂姆教皇的Abolish plugin,你的例子是

%Subvert/{a,b,c}1/{}2/g 
0

后,我问的问题我想出了这个功能和映射,几乎做什么我想要的。这不像其他两个答案那样优雅,但它可以适用于执行一系列由每个命令之间暂停的列表指定的一般命令,所以我在这里写。

function! MyLatexReplaceText(...) 
    if a:0 > 0 
    if a:0 != 2 
     echom "provide two lists to the function" 
     return '' 
    endif 
    let g:replace_list_in = a:1 
    let g:replace_list_out = a:2 
    let g:replace_ncur = 0 
    endif 
    if a:0 == 0 && !exists("g:replace_ncur") 
    let g:replace_list_in = ['a1', 'b1', 'c1'] 
    let g:replace_list_out = ['a2', 'b2', 'c2'] 
    let g:replace_ncur = 0 
    endif 
    if g:replace_ncur == len(g:replace_list_in) 
    let g:replace_cmd = ":echom 'reached end of list'\<CR>" 
    let g:replace_ncur = -1 
    else 
    let range_ = "'<,'>" 
    let extra_flags = 'gc' 
    let g:replace_cmd = ':' .range_ . "s/" . g:replace_list_in[g:replace_ncur] 
      \ . "/" . g:replace_list_out[g:replace_ncur] . "/" . extra_flags 
      \ . "\<CR>" 
    call histadd("cmd", g:replace_cmd) 
    endif 
    let g:replace_ncur += 1 
    return g:replace_cmd 
endfunction 
nnoremap <silent><expr> <Leader>ns MyLatexReplaceText() 
相关问题