2016-04-22 13 views
1

Angenommen, ichWie Vektor am Zugang zum Bediener konvertieren [] Zugang in vim

var.at(i*w+j) = something; 

in

var[i*w+j] = something; 

konvertieren will Was ist der richtige Befehl in Vim zu geben? Ich versuchte

:%s/\.at\(.*\)/[\1]/g 

was dazu führt,

var[(i*w+j) = something;] 

funktioniert, aber es wird noch besser, wenn die Klammern entfernt werden können.

EDIT: correct resultierende Versuch zeigt

+0

Würde nicht diese Ersetzung dir 'var [(i + w + j) = etwas] geben?'? '. *' ist gierig ... – Barry

Antwort

2

Mit einem rekursiven Makro:

qqqqq/\.at(<CR>%"adi)F.c%[<Esc>"apa]<Esc>@[email protected] 

Erläuterung:

qq             record macro `q` 
    q             end empty macro 
    qq            record macro `q` 
     /\.at(<CR>          search for `.at(` 
       %         go to the matching closing `)` 
       "adi)        delete inside the parenthesis into register `a` 
         F.        go back to the previous `.` 
         c%       change what’s in the matching parenthesis 
          [<Esc>      with `[` and leave insert mode 
           "ap     paste what’s in register `a` 
            a]<Esc>   append `]` and leave insert mode 
              @q   call the (currently empty) `q` macro recursively 
              q  end macro 
              @q  call the (now non-empty) macro `q` 

Dies auch Sachen wie var.at(foo(bar, baz)) = something; richtig handhaben.

+0

Wow, aber ich versuchte, dieses zu tippen und es zeigt 'E486: Muster nicht gefunden: \ .at (%" adi) Fc% [ "apa] @ qq @ q' . Mache ich etwas falsch? – user3667089

+0

'' bedeutet Enter, '' bedeutet Escape – mcarton

+0

Wow, funktioniert wie Magie. – user3667089

2

Was den richtigen Befehl vim einzugeben ist? Ich versuchte

:%s/\.at\(.*\)/[\1]/g 

Das Problem ist, dass Sie die Pars sind entkommen. Aufgrund Ihrer "magic" Einstellungen, \( und \) Arbeit für die Gruppierung, während Sie für mich wörtlichen wollen ( und )

:%s/\.at(\(.*\))/[\1]/g 

Arbeiten entsprechen. (Beachten Sie, dass Sie müssen noch die Gruppierung)

+0

Ich habe gerade gemerkt, dass das mit dem Fall von 'something = var1.at (i * w + j) + var2.at (i * w + j)' nicht funktioniert Der Befehl wird 'something = var1 [i * w + j) + var2.at (i * w + j]' Könntest du mich wissen lassen, wie man es löst? – user3667089

+1

Grundsätzlich ist das Problem, dass. * gierig so viel wie passt Sie können '. *' durch '[^)] *' (passen Sie alles außer einem paren) um das Problem – jkerian

+1

oder verwenden Sie die hässliche ungreedy, '. \ {-}' – sidyll