2012-09-28 174 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() 
相關問題