Czy istnieje sposób na konwersję nazw wielbłądów w celu użycia znaków podkreślenia w emacsie?


8

Na przykład chcę przekonwertować „CamelCasedName” na „camel_cased_name”. Czy istnieje sposób, aby to zrobić w emacs?


4
Krótka odpowiedź na dowolne pytanie w formularzu „Czy jest jakiś sposób na _____ w emacs?” jest zawsze „TAK”
Brian Postow

Odpowiedzi:


4

Ten mały fragment kodu z tej strony , z funkcją otoki i znakiem podkreślenia zastępującym łącznik znakiem podkreślenia, można łatwo przekształcić w polecenie, aby to zrobić. (Sprawdź, czy pasują do Ciebie najlepsze czapki):

Przykładowy kod EmacsLisp w celu odblokowania Camel Wpisz ciąg (z 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

Wyłącznie do celów wyświetlania możesz użyć tego:

M-x glasses-mode

Jeśli chcesz skrypt, który faktycznie konwertuje tekst, wyobrażam sobie, że będziesz musiał napisać trochę elisp. To pytanie lepiej zadać w przypadku przepełnienia stosu.


2

Byłem w stanie to zrobić szybko dla całego pliku za pomocą tylko wyrażenia zastępującego wyrażenie regularne .

Wzorzec wyszukiwania jest, \([a-z]+\)\([A-Z]\)\([a-z]+\)a zamiennik jest \1_\,(downcase \2)\3.

Zastąpiony wzorzec używa elisp bezpośrednio we wzorcu. Wymaga to Emacsa w wersji 22 lub nowszej.

W stylu dokumentacji emacsa:

M-C-% \([a-z]+\)\([A-Z]\)\([a-z]+\) RET \1_\,(downcase \2)\3
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.