ich es so tun würde:
:%s/\v(foo|bar)/\={'foo':'bar','bar':'foo'}[submatch(0)]/g
Aber das ist zu viel schreiben, würde ich dies so tun:
function! Mirror(dict)
for [key, value] in items(a:dict)
let a:dict[value] = key
endfor
return a:dict
endfunction
function! S(number)
return submatch(a:number)
endfunction
:%s/\v(foo|bar)/\=Mirror({'foo':'bar'})[S(0)]/g
Aber das erfordert noch zweimal foo
und bar
eingeben, so dass ich so etwas tun würde:
function! SwapWords(dict, ...)
let words = keys(a:dict) + values(a:dict)
let words = map(words, 'escape(v:val, "|")')
if(a:0 == 1)
let delimiter = a:1
else
let delimiter = '/'
endif
let pattern = '\v(' . join(words, '|') . ')'
exe '%s' . delimiter . pattern . delimiter
\ . '\=' . string(Mirror(a:dict)) . '[S(0)]'
\ . delimiter . 'g'
endfunction
:call SwapWords({'foo':'bar'})
Wenn einer Ihrer Worte ein /
enthält, müssen Sie in einem Begrenzer passieren die Sie weiß keiner Ihrer Worte enthält, .EG
:call SwapWords({'foo/bar':'foo/baz'}, '@')
Dies hat auch den Vorteil, in der Lage, mehrere Paare von Wörtern auf einmal zu tauschen.
:call SwapWords({'foo':'bar', 'baz':'quux'})
Sie könnten diese Frage auch auf SuperUser.com ausprobieren. – janmoesen
Das ist eine gute Frage - man würde das einfach denken ... Ich könnte mir vorstellen, dass man eine Funktion schreiben könnte, die zwei Parameter akzeptiert und die drei Schritte für Sie durchläuft, aber ich hätte auch eine solche Funktion mit einer schnellen Websuche erwartet . – Jay
Dieser Ansatz würde fehlschlagen, wenn Ihre Datei irgendwo schon "string_c" enthalten würde. Es ist in Ordnung, wenn Sie ein Mensch sind und ein Wort auswählen können, von dem Sie wissen, dass es nicht in Ihrer Datei ist, aber es wäre schwieriger, eine Funktion zu lehren, ein gutes Zwischenwort zu erraten. Besser, es in einem Durchgang zu tun. –