2016-10-28 1 views
0

J'ai ligne de code comme celui-ci:groupes de capture Vim regex pour remplacer la chaîne de cas de chameau avec un espace vide à la fin

variableInCamelCase <- map["variableInCamelCase"] 

je dois faire comme ceci:

variable_In_Camel_Case <- map["variableInCameCase"] 

seulement le premier mot doit être converti, j'essaie de trouver une regex pour le faire, et je dois le faire dans Vim mais je ne peux pas. Un regex comme celui-ci:

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

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

est pas bon parce que je dois le faire que sur le premier mot. De plus, j'en ai besoin pour VIM qui utilise une syntaxe spéciale pour capturer un groupe.

J'ai essayé quelque chose comme ceci: s/\(\l\)\(\u\)/\1_\2/g, ce qui équivaut à ([a-z])([A-Z]), mais je ne peux pas le mettre dans ou avec le ([A-Z])([A-Z])([a-z])

Il y a quelqu'un avec un bon vim prêt regex pour mon problème? Une explication serait la bienvenue également.

+0

C'est le meilleur que je peux trouver jusqu'à présent. Malheureusement, il ajoute un '_' derrière le nom de la variable. Je réfléchis toujours à la possibilité de contourner cela. 's/\ v ([AZ]) ([AZ]) ([az]) | ([az]) ([AZ]) | (. * $)/\ 1 \ 4_ \ 2 \ 3 \ 5 \ 6/g' – eddiem

+0

Ceci est une solution extrêmement hack, mais vous pouvez faire 'qq: s/\ v^\ w {-} \ a \ zs \ u/_ & @ qq @ q' – DJMcMayhem

+1

Tim Pope [abolir] (https : //github.com/tpope/vim-abolish) peut le faire pour vous. –

Répondre

1

J'ai deux commandes pour transformer à snake_case de UpperCamelCase ou lowerCamelCase, et l'inverse, en lh-dev. L'un s'applique sur le mot courant, l'autre fonctionne comme substitute. En fait, plus de choix de noms sont disponibles si vous configurez la bibliothèque pour votre projet actuel (-> variables, attributs, constantes, getters, types, etc).

Comment ça marche? Eh bien, il utilise la fonction lh#dev#naming#to_underscore() dans le cas de CamelCase ->snake case.

Celui-ci est assez simple en fait:

" 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 

Ensuite, :[range]ConvertNames/pattern/policy/flag seront convertis en quelque chose comme :[range]substitute/pattern/\=lh#dev#naming#{snake}(submatch(0))/flags.

Avec un modèle générique comme \w\+, il appliquera la transformation sur le premier mot trouvé - la transformation remplaçant le mot trouvé avec sa forme de casse-serpent.