Je ferais comme ça:
:%s/\v(foo|bar)/\={'foo':'bar','bar':'foo'}[submatch(0)]/g
Mais c'est trop taper, donc je ferais ceci:
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
Mais cela nécessite encore taper foo
et bar
deux fois, donc je ferais quelque chose comme ceci:
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'})
Si l'un de vos mots contient une /
, vous devez passer dans un séparateur que vous savoir qu'aucun de vos mots contient, .EG
:call SwapWords({'foo/bar':'foo/baz'}, '@')
Cela a aussi l'avantage de pouvoir échanger plusieurs paires de mots à la fois.
:call SwapWords({'foo':'bar', 'baz':'quux'})
Vous pouvez aussi essayer cette question sur SuperUser.com. – janmoesen
C'est une bonne question - on pourrait penser que c'est facile ... J'imagine que l'on pourrait écrire une fonction qui accepte deux paramètres et passe par les trois étapes pour vous, mais je m'attendais aussi à trouver une telle fonction avec une recherche rapide sur le web . – Jay
Cette approche échouerait si votre fichier contenait déjà "string_c". C'est bien si vous êtes un humain et que vous pouvez choisir un mot qui, vous le savez, n'est pas dans votre fichier, mais il serait plus difficile d'enseigner une fonction pour deviner un bon mot intermédiaire. Mieux vaut le faire en un seul passage. –