Existe-t-il un moyen de convertir les noms en chameau pour utiliser des traits de soulignement dans emacs?

8

Par exemple, je veux convertir "CamelCasedName" en "camel_cased_name". Existe-t-il un moyen de le faire dans emacs?

Jason Baker
la source
4
La réponse courte à toute question du formulaire "Y a-t-il un moyen de _____ dans emacs?" est toujours "OUI"
Brian Postow

Réponses:

4

Ce petit morceau de code de cette page , avec une fonction wrapper et un trait de soulignement remplaçant le tiret par un trait de soulignement, pourrait facilement être transformé en une commande pour ce faire. (Vérifiez qu'il traite les majuscules pour vous convenir):

Exemple de code EmacsLisp pour décompresser une chaîne (à partir de http://www.friendsnippets.com/snippet/101/ ):

(defun un-camelcase-string (s &optional sep start)
  "Convert CamelCase string S to lower case with word separator SEP.
Default for SEP is a hyphen \"-\".

If third argument START is non-nil, convert words after that
index in STRING."
  (let ((case-fold-search nil))
    (while (string-match "[A-Z]" s (or start 1))
      (setq s (replace-match (concat (or sep "-") 
                                             (downcase (match-string 0 s))) 
                                     t nil s)))
    (downcase s)))
JRobert
la source
4

Emacs a un mode lunettes qui affiche les noms des chameaux avec des soulignements entre les deux. (Voir aussi http://www.emacswiki.org/emacs/GlassesMode ).

Si vous souhaitez réellement modifier le texte du fichier M-x query-replace-regexpest probablement approprié.

Allen
la source
3

Moritz Bunkus a écrit une fonction elisp pour basculer entre CamelCase et c_style

Natan Yellin
la source
le paquet string-inflectionest plus complet maintenant: github.com/akicho8/string-inflection (note qu'il ya aussi string-inflection-camelize-lowerdes changements hello_worldà helloWorld).
Ehvince
2

À des fins d'affichage uniquement, vous pouvez utiliser ceci:

M-x glasses-mode

Si vous voulez un script qui convertit réellement le texte, j'imagine que vous devrez écrire un peu d'élisp. Cette question est mieux posée en cas de débordement de pile.

Trey Jackson
la source
2

J'ai pu le faire rapidement sur un fichier entier avec juste une requête remplacer regexp .

Le modèle de recherche est \([a-z]+\)\([A-Z]\)\([a-z]+\)et le remplacement est \1_\,(downcase \2)\3.

Le modèle de remplacement utilise elisp directement dans le modèle. Cela nécessite Emacs 22 ou une version ultérieure.

Dans le style de documentation emacs:

M-C-% \([a-z]+\)\([A-Z]\)\([a-z]+\) RET \1_\,(downcase \2)\3
derekv
la source