1

書くとき、いくつかの異なる単語を連続して置き換えなければならないことがあります。たとえば、a1 -> a2、b1 -> b2、c1 -> c2 などです。

このために、コマンド履歴を手動で編集するので、最初から始めます

:s/a1/a2/gc

a1 と a2 を b1 と b2 に置き換えた後、置換を行い、次の項目に進みます。

私が望むワークフローは次のようなものです。

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

ここで、ReplaceAllWithConfirmation は置換を実行する関数ですが、毎回確認を求めます。

これは可能でしょうか?

ありがとう!

4

3 に答える 3

3

関数を書く必要はありません。次のコマンドを実行するだけです。

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

の後に式を含めることができます\=

于 2012-09-29T00:08:27.107 に答える
2

Tim Pope's Abolish plugin を使用すると、例は次のようになります

%Subvert/{a,b,c}1/{}2/g
于 2012-09-29T10:24:40.767 に答える
0

質問をした後、私はこの関数とマッピングを思いつきました。これはほぼ私が望んでいたことです。これは他の2つの回答ほどエレガントではありませんが、各コマンドの間に一時停止するリストで指定された一連の一般的なコマンドを実行するように適応できるため、ここに書いています。

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()
于 2012-09-29T17:38:15.953 に答える