Gibt es eine Möglichkeit, Namen mit Kamelhülle in Unterstriche in Emacs umzuwandeln?


8

Zum Beispiel möchte ich "CamelCasedName" in "camel_cased_name" konvertieren. Gibt es eine Möglichkeit, dies in Emacs zu tun?


4
Die kurze Antwort auf jede Frage der Form "Gibt es eine Möglichkeit, _____ in Emacs?" ist immer "JA"
Brian Postow

Antworten:


4

Dieses kleine Stück Code von dieser Seite mit einer Wrapper-Funktion und einem Unterstrich, der den Bindestrich durch einen Unterstrich ersetzt, könnte leicht in einen Befehl umgewandelt werden, um dies zu tun. (Überprüfen Sie, ob die führenden Kappen zu Ihnen passen):

Beispiel für einen EmacsLisp-Code zum Entfernen von CamelCase für eine Zeichenfolge (von 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)))



2

Sie können dies nur zu Anzeigezwecken verwenden:

M-x glasses-mode

Wenn Sie ein Skript möchten, das den Text tatsächlich konvertiert, müssen Sie wahrscheinlich etwas Elisp schreiben. Diese Frage wird beim Stapelüberlauf besser gestellt.


2

Ich war in der Lage, dies über eine ganze Datei schnell mit nur einer Abfrage zu tun, um regulären Ausdruck zu ersetzen .

Das Suchmuster ist \([a-z]+\)\([A-Z]\)\([a-z]+\)und der Ersatz ist \1_\,(downcase \2)\3.

Das Ersatzmuster verwendet elisp direkt im Muster. Dies erfordert Emacs 22 oder höher.

Im Emacs-Dokumentationsstil:

M-C-% \([a-z]+\)\([A-Z]\)\([a-z]+\) RET \1_\,(downcase \2)\3
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.