Apakah ada cara untuk mengonversi nama yang dilampirkan unta untuk menggunakan garis bawah di emacs?

8

Misalnya, saya ingin mengonversi "CamelCasedName" menjadi "camel_cased_name". Apakah ada cara untuk melakukan ini di emacs?

Jason Baker
sumber
4
Jawaban singkat untuk pertanyaan apa pun dari formulir "Apakah ada cara untuk _____ dalam emacs?" is Always "YA"
Brian Postow

Jawaban:

4

Ini sedikit kode dari halaman ini , dengan fungsi pembungkus dan garis bawah menggantikan tanda hubung dengan garis bawah, dapat dengan mudah diubah menjadi perintah untuk melakukan itu. (Periksa apakah itu memperlakukan caps terkemuka yang sesuai dengan Anda):

Contoh kode EmacsLisp untuk membatalkan CamelCase sebuah string (dari 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
sumber
4

Emacs memiliki mode kacamata yang menampilkan nama camelcase dengan garis bawah di antaranya. (Lihat juga http://www.emacswiki.org/emacs/GlassesMode ).

Jika Anda ingin benar-benar mengubah teks file M-x query-replace-regexpmungkin cocok.

Allen
sumber
3

Moritz Bunkus menulis fungsi elisp untuk beralih antara CamelCase dan c_style

Natan Yellin
sumber
paket string-inflectionlebih lengkap sekarang: github.com/akicho8/string-inflection (perhatikan bahwa ada juga string-inflection-camelize-loweruntuk mengubah hello_worldke helloWorld).
Ehvince
2

Hanya untuk tujuan tampilan, Anda dapat menggunakan ini:

M-x glasses-mode

Jika Anda ingin skrip yang benar-benar mengubah teks, saya kira Anda harus menulis beberapa elisp. Pertanyaan itu lebih baik ditanyakan pada stack overflow.

Trey Jackson
sumber
2

Saya bisa melakukan ini di seluruh file dengan cepat hanya dengan permintaan ganti regexp .

Pola pencarian adalah \([a-z]+\)\([A-Z]\)\([a-z]+\)dan penggantiannya \1_\,(downcase \2)\3.

Pola penggantian menggunakan hak kanan dalam pola. Ini membutuhkan Emacs 22 atau lebih baru.

Dalam gaya dokumentasi emacs:

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