Bagaimana saya bisa mengonversi kata menjadi camelCase di makro?

14

Saya punya daftar kata-kata, seperti ini:

these are
some
words that I want
to convert to
camel case

Saya perlu cara untuk mengubah, misalnya, camel casemenjadi di camelCasedalam makro (atau cara untuk mengubah setiap baris dari pemilihan garis visual menjadi kotak unta).

Saya dapat menggunakan sesuatu wgUlhxsebanyak yang diperlukan, tetapi masalahnya adalah ini tidak bekerja untuk kata-kata dengan panjang yang berbeda (jadi, misalnya, wgUlhxwgUlhxakan bekerja untuk convert this pleasetetapi tidak untuk convert these pretty please).

Output yang diinginkan untuk jalur di atas adalah

theseAre
some
wordsThatIWant
toConvertTo
camelCase

Apakah ada cara untuk mengotomatisasi ini?

Gagang pintu
sumber

Jawaban:

16

A One Liner

Saya menemukan pengganti ekspresi reguler sederhana (dengan asumsi 'sihir' diatur):

:s/ \([a-zA-Z]\)/\u\1/g

Ini cocok dengan satu huruf setelah spasi, menyimpan surat itu. Kemudian, itu menggantinya dengan huruf yang disimpan membuat huruf besar ( \u= huruf besar, \1= pertandingan yang disimpan pertama), untuk setiap pertandingan di baris.

Terapkan di seluruh file dengan menempatkan %antara :dan s.

Kelemahan dari solusi ini adalah bahwa itu adalah linewise (yang berfungsi untuk contoh Anda), tetapi akan gagal jika Anda hanya ingin unta huruf beberapa kata keluar dari banyak dalam satu baris.

Solusi yang lebih lengkap

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

Ini menciptakan operator baru yang dapat beroperasi dengan gerakan. Jika sudah <leader>seperti itu \, maka berikan teks berikut (dengan |kursor):

This is some |example text to work with.

Mengetik \g~3wmemberi

This is some exampleTextTo work with.

Artinya, kita unta lebih dari 3 kata.

Deskripsi substitusi itu:

s/memulai substitusi.
\%>'\[Agak menyakitkan. Kata \%>'mmengatakan untuk mencocokkan dengan hak tanda. Kami ingin tanda [, tetapi itu juga harus lolos dalam pola ini. Jadi, ini memulai pertandingan setelah gerakan diberikan kepada operator.
\([a-zA-Z\)sama dengan dari one-liner di atas.
\%<']ini adalah ujung yang lain, cocok sebelum akhir gerakan.
/\u\1/gadalah pengganti dari one-liner di atas.

John O'M.
sumber
Sebenarnya, itu bukan makro sebanyak itu adalah satu liner, tetapi Anda bisa memetakannya ke kombinasi tombol.
John O'M.
Menambahkan versi operator untuk melakukannya. Beroperasi sedikit lebih baik.
John O'M.
Saya pikir tidak apa-apa jika jawaban Anda tidak secara khusus menggunakan makro; penanya menyajikan masalah XY , menurut saya.
tommcdo
@tommcdo Ya, Anda benar; itu tidak harus menjadi makro yang sebenarnya. Itu hanya perlu semacam metode otomatis.
Gagang pintu
12

Untuk alternatif saya menggunakan plugin vim-abolish yang menawarkan fitur paksaan:

Ingin berubah fooBarmenjadi foo_bar? Tekan crs(memaksa untuk snake_case). MixedCase ( crm), camelCase ( crc), snake_case ( crs), dan UPPER_CASE ( cru) semuanya hanya berjarak 3 penekanan tombol saja. Perintah-perintah ini mendukung repeat.vim .

Sukima
sumber
2
+1 karena selalu ada plugin Tim Pope yang tidak saya ketahui.
zool
5

Anda bisa membuat makro rekursif yang melakukan ini untuk satu baris dengan penekanan tombol berikut:

qqqqqf xgUl@qq

(Perhatikan bahwa ruang antara fdan xadalah ketukan bilah spasi, bukan jeda)

Secara terperinci:

  1. Kosongkan daftar q. Ini diperlukan karena kami sedang membuat makro rekursif. (Lihat langkah 5.):qqq

  2. Mulai merekam makro dalam register, q: qq

  3. Anda tidak dapat menggunakan wgerakan di sini, karena Anda ingin makro untuk dibatalkan ketika sampai ke akhir baris, daripada melompat ke baris berikutnya. Sebagai gantinya, lompat ke karakter spasi berikutnya di telepon dengan menekan ftombol diikuti oleh bilah spasi:f<space>

  4. Hapus spasi dan huruf besar huruf berikut: xgUl

  5. Perulangan. Karena kami membersihkan qregister di langkah 1, belum ada apa-apa di dalamnya, jadi ini tidak akan menghasilkan apa-apa:@q

  6. Simpan makro: q

Anda kemudian dapat menerapkan makro ini ke beberapa baris dengan menggunakan rentang:

Terapkan makro ke setiap baris dalam file:

:%normal @q

Terapkan makro ke baris 2–5 inklusif:

:2,5normal @q

Buat pilihan visual, lalu ketik :normal @q. Ini akan mengisi lebih dulu baris perintah ketika Anda menekan :tombol, menghasilkan perintah yang menerapkan makro untuk setiap baris dalam seleksi:

:'<,'>normal @a
Kaya
sumber
Tidak perlu menghapus qregister, seperti qqhalnya sebelum mulai merekam penekanan tombol. Bahkan, itulah sebabnya mengapa qqqbekerja untuk menghapus qregister :)
tommcdo
Tentu saja, jika Anda melakukan sesuatu yang perlu ditambahkan ke qregister (yaitu menggunakan qQ) maka membersihkannya terlebih dahulu mungkin akan diperlukan.
tommcdo
2
@tommcdo Itu jelas tidak benar dalam salinan Vim saya. (Vim 7.3.87, dipanggil dengan vim -u NONE). Karenanya, konten yang ada hanya dihapus ketika Anda menyimpan register, pada langkah 6. Membersihkan register sebelum Anda mulai karena itu perlu jika Anda ingin recurse.
Kaya
@tommcdo Saya sudah memperbarui jawabannya untuk membuatnya lebih jelas mengapa langkah ini diperlukan.
Kaya
Kesalahan saya, saya semacam melompati pistol di sana. Klarifikasi luar biasa!
tommcdo
1

Lihat http://vim.wikia.com/wiki/Changing_case_with_regular_expressions Ini menjelaskan pengubah \ U, \ L, \ u, \ l dengan sangat jelas dan ringkas!

Esensinya adalah sebagai berikut:

Ada saat-saat Anda mungkin ingin menelusuri file dan mengubah huruf besar-kecil karakter yang cocok dengan beberapa kriteria sewenang-wenang. Jika Anda memahami ekspresi reguler dengan baik, Anda sebenarnya dapat melakukannya dengan cukup mudah.

Ini semudah menempatkan \ U atau \ L di depan referensi yang ingin Anda ubah kasusnya, dan \ E di akhir. Vim akan membuat teks dalam backreference huruf besar atau kecil (masing-masing). Gunakan \ u dan \ l (tanpa \ E di akhir) untuk hanya mengubah huruf karakter pertama di referensi belakang.

("Referensi-ulang" adalah bagian dari ekspresi reguler yang merujuk ke bagian sebelumnya dari ekspresi reguler. Referensi yang paling umum adalah &, \ 1, \ 2, \ 3, ..., \ 9).

Beberapa contoh yang menunjukkan kekuatan teknik ini:

Huruf kecil seluruh file

:% s /.*/ \ L & / g

(& adalah referensi balik praktis yang merujuk pada teks lengkap pertandingan.)

Huruf besar semua kata yang diawali dengan <(yaitu membuka nama tag HTML):

:%s/<\(\w*\)/<\U\1/g

Perhatikan juga perintah gu dan gU.

Misalnya, ggguG akan mengurangi seluruh file. (gg = pergi ke atas, gu = huruf kecil, G = pergi ke EOF).

Dengan menggunakan \ 0 backref umum alih-alih yang namanya (\ 1, \ 2 dll) Anda dapat menyimpan beberapa pengetikan untuk menggantikan bait dari regex.

Regex ini huruf besar set kata-kata eksplisit untuk huruf besar dalam file:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

Bukan ilmu roket, tetapi Anda harus melakukan ini:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g
Luke Kendall
sumber
1
Bisakah Anda meringkas artikel yang Anda sebutkan dalam jawaban Anda?
EvergreenTree
Sampai jumpa? Sangat penting, jika jawaban tautan tunggal tidak menjadi masalah, beberapa tahun kemudian situs ini akan dipenuhi dengan tautan yang dihapus. Tetapi jika Anda hanya menyalin bagian penting dari tautan yang Anda referensikan, dan juga memberikan tautan di mana OP dapat memperoleh informasi lebih lanjut, tidak apa-apa.
peterh