2016-10-28 2 views
0

I Codezeile haben wie diese:Vim einfangenden Gruppen regex am Ende Kamel Fall Zeichenfolge mit Leerzeichen ersetzen

variableInCamelCase <- map["variableInCamelCase"] 

ich es so machen müssen:

variable_In_Camel_Case <- map["variableInCameCase"] 

Nur das erste Wort muss konvertiert werden, ich versuche eine Regex dafür zu finden, und ich muss es in Vim tun, aber ich kann es nicht. Ein regex wie diese:

var rex = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g; 

"CSVFilesAreCoolButTXT".replace(rex, '$1$4_$2$3$5'); 

ist nicht gut, weil ich es nur auf dem ersten Wort tun müssen. Plus, ich brauche es für VIM, die eine spezielle Syntax verwendet, um eine Gruppe zu erfassen.

habe ich versucht, so etwas wie diese: in oder mit den für mein Problem s/\(\l\)\(\u\)/\1_\2/g, die ([a-z])([A-Z]) äquivalent ist, aber ich kann es nicht ([A-Z])([A-Z])([a-z])

Es gibt jemand mit einem guten vim bereit regex setzen? Eine Erklärung wäre auch willkommen.

+0

Dies ist das Beste, was ich bisher finden kann. Leider fügt es nach dem Variablennamen ein abschließendes '_ 'hinzu. Ich denke immer noch darüber nach, ob es einen Weg gibt. 's/\ v ([AZ]) ([AZ]) ([az]) | ([az]) ([AZ]) | (. * $)/\ 1 \ 4_ \ 2 \ 3 \ 5 \ 6/g' – eddiem

+0

Dies ist eine extrem hack Lösung, aber Sie könnten tun 'qq: s/\ v^\ w {-} \ a \ zs \ u/_ & @qq @ q' – DJMcMayhem

+1

Tim Papst [abschaffen] (https : //github.com/tpope/vim-abolish) kann es für dich tun. –

Antwort

1

Ich habe zwei Befehle bekommt snake_case von UpperCamelCase oder lowerCamelCase, und umgekehrt, in lh-dev zu verwandeln. Einer gilt für das aktuelle Wort, der andere funktioniert wie substitute. Tatsächlich sind mehr Benennungsoptionen verfügbar, wenn Sie die Bibliothek für Ihr aktuelles Projekt konfigurieren (-> Variablen, Attribute, Konstanten, Getter, Typen usw.).

Wie funktioniert es? Nun, es ist die lh#dev#naming#to_underscore() Funktion im Fall von CamelCase ->snake case.

Dieser ist eigentlich ganz einfach:

" Function:lh#dev#naming#to_underscore(identifier)   {{{3 
function! lh#dev#naming#to_underscore(identifier) 
    " first I make sure the first letter is in lower case 
    let identifier = substitute(a:identifier, '\%(^\|[^A-Za-z0-9]\)\zs\(\u\)', '\l\1', '') 
    " then I replace uppercase letters by '_' + their lower case flavour 
    let identifier = substitute(identifier, '\l\zs\(\u\)', '_\l\1', 'g') 
    return identifier 
endfunction 

Dann wird :[range]ConvertNames/pattern/policy/flag in wie :[range]substitute/pattern/\=lh#dev#naming#{snake}(submatch(0))/flags etwas umgewandelt werden.

Mit einem generischen Muster wie \w\+ wendet es die Transformation auf das erste gefundene Wort an - die Umwandlung ersetzt das gefundene Wort durch seine Schlangenfallform.

Verwandte Themen