2013-06-27 17 views
6

Ich möchte vim search-andreplace verwenden, um alle "mit" und umgekehrt zu ersetzen. Gibt es eine Möglichkeit, dies in einem Schritt zu erreichen? Ich denke an so etwas:Bedingte Ersetzung in vim

:s/\("\|'\)/\1=="?':"/ 

Wo natürlich die \1=="?':" -Teil ist etwas, das in vim arbeitet

Vielen Dank im Voraus

Antwort

14

Das ist ein Fall für :help sub-replace-special:

:s/["']/\=submatch(0) == '"' ? "'" : '"'/g 

Dies entspricht einem der beiden Zitate (in einfacher Art und Weise mit [...]) und verwendet dann den ternären Operator jedes Zitat in ihr Gegenteil zu verwandeln. (Für komplexere Fälle könnten Sie Dictionary-Lookups verwenden.)

+0

Nice one! Vielen Dank! – Vince

+0

Können die übereinstimmenden Muster '\ 1',' \ 2', ... in den substituierenden Ausdrücken verwendet werden?Ich habe es versucht, aber Backslashes werden buchstäblich eingefügt. –

+1

@ EnricoMariaDeAngelis: Ja, über 'submatch (1)' etc .; das Literal '\ 1' funktioniert hier nicht. –

0

Wahrscheinlich die faulste/einfachste Weg:.!

:%s/'/__/g | %s/"/'/g | %s/__/"/g 

Drei grundlegende Schritte in einer Zeile kombiniert:

  1. konvertieren '-__ (oder etwas zufällig)
  2. konvertieren " zu '
  3. konvertieren __ zu "

sie dann kombinieren mit das | Symbol.

Ich bin sicher, einige Vim-Assistenten werden eine bessere Lösung haben, aber das hat für mich funktioniert.

+0

Ich dachte darüber nach, dass, und ich konnte es sicher tun, aber vim ist mächtig, und ich bin nur neugierig, wenn es eine ist eine Schritt-Lösung für dieses Problem ;-) – Vince

+0

Vim ist mächtig. Ich bin sicher, die Leute werden etwas noch einfacher haben. – jahroy

3

Ein anderer Ansatz (der sich mehr für Scripting eignet) ist die Verwendung der integrierten tr()-Funktion. Um es auf den Puffer anwenden, wird getline()/setline() verwendet:

:call setline('.', tr(getline('.'), "'\"", "\"'")) 
2

Sie können tun, so einfach mit dem abolish.vim Plugin.

Abolish.vim hat einen :Subvert Befehl, der Ihnen einen anderen Ansatz zum Suchen und Ersetzen in seiner eigenen kleinen DSL gibt.

:%S/{\",'}/{',\"}/g 

Dieses Plugin hat die besondere Auszeichnung erhielt auf Vimcasts.org einen dreiteiligen Screencasts von mit ihm gewidmet: one, two, three.

+0

Was ist mit der Flucht von '\" 'das ist sehr unintuitiv ?! (Ich bekomme ein' E64', wenn ich das entferne. –

3

Macht von Unix-Tool;)

:%!tr "'\"" "\"'"

Verwandte Themen