Bir makrodaki kelimeleri camelCase'e nasıl dönüştürebilirim?


14

Kelimelerin bir listesi var, böyle:

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

Örneğin, bir makro camel caseiçine camelCase(veya bir görsel çizgi seçimi deve durumda her satırı açmak için bir yol) açmak için bir yol gerekir.

wgUlhxGerektiği kadar çok şey gibi bir şey kullanabilirim , ama sorun şu ki, farklı uzunluklarda kelimeler için işe yaramıyor (örneğin, wgUlhxwgUlhxişe yarayacaktı, convert this pleaseama işe yaramayacaktı convert these pretty please).

Yukarıdaki satırlar için istenen çıktı

theseAre
some
wordsThatIWant
toConvertTo
camelCase

Bunu otomatikleştirmenin bir yolu var mı?

Yanıtlar:


16

Bir Astar

Basit bir düzenli ifade değiştirme buldum ('büyü' ayarlanmış varsayarak):

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

Bu, bir boşluktan sonraki herhangi bir harfi eşleştirerek harfi kaydeder. Ardından, satırdaki her eşleşme için büyük harfle kaydedilmiş büyük harfle ( \u= büyük harf, \1= ilk kaydedilen eşleşme) değiştirir.

Ve %arasına koyarak dosyanın tamamına uygulayın .:s

Bu çözümün dezavantajı, (örnekleriniz için işe yarayan) çizgisel olması, ancak bir satırdaki birçok kelimeden sadece birkaç kelimeyi deve etmek istiyorsanız kısa düşecektir.

Daha kapsamlı bir çözüm

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

Bu, hareket halinde çalışabilen yeni bir operatör yaratır. Eğer varsa <leader>olarak \, o zaman (ile şu metni verilen |imleç gibi):

This is some |example text to work with.

Yazarak \g~3wverir

This is some exampleTextTo work with.

Yani, 3 kelimeden fazla deve kaplıyoruz.

Bu ikamenin açıklaması:

s/oyuncu değişikliği başlar.
\%>'\[biraz acı verici. \%>'mBir işaretin sağında maç için söylüyor. İşaret istiyoruz [, ama bu da bu modelden kaçmalı. Böylece, operatöre verilen hareketten sonra maç başlar.
\([a-zA-Z\)yukarıdaki tek astarla aynıdır.
\%<']bu, hareketin sonundan önce eşleşen diğer sondur.
/\u\1/gyukarıdaki tek-astarın yerini almıştır.


Aslında, bu tek bir astar olduğu kadar çok bir makro değil, ama bunu anahtar bir kombinasyonla eşleştirebilirsiniz.
John O'M.

Bunu yapmak için bir operatör sürümü eklendi. Biraz daha iyi çalışır.
John O'M.

Cevabınız özellikle bir makro kullanmıyorsa bence sorun yok; asker bana göre bir XY sorunu sundu .
tommcdo

@tommcdo Evet, haklısın; gerçek bir makro olması gerekmez. Sadece bir tür otomatik yöntem olması gerekiyor.
Doorknob

12

Alternatif olarak , bir baskı özelliği sunan vim-abolish eklentisini kullanıyorum:

Çevirmek ister fooBariçine foo_bar? crs(Yılan_kablosuna zorla) tuşuna basın . MixedCase ( crm), camelCase ( ), crcsnake_case ( crs) ve UPPER_CASE ( cru) sadece 3 tuş vuruşu uzaklıktadır. Bu komutlar repeat.vim dosyasını destekler .


2
+1 çünkü her zaman bilmediğim bir Tim Pope eklentisi var.
zool

5

Aşağıdaki tuş vuruşlarıyla tek bir satır için bunu yapan özyinelemeli bir makro oluşturabilirsiniz:

qqqqqf xgUl@qq

(Not arasındaki boşluk o fve xara çubuğu bir musluktur, bir duraklama)

Detayda:

  1. Q kaydını temizle. Bu gereklidir, çünkü yinelemeli bir makro yaratırız. (Bkz. Adım 5):qqq

  2. Q kaydında bir makro kaydetmeye başlayın: qq

  3. wBuradaki hareketi kullanamazsınız , çünkü bir sonraki satıra atlamak yerine makronun satır sonuna geldiğinde iptal etmesini istersiniz. Bunun yerine, tuşuna ve fardından boşluk çubuğuna basarak satırdaki bir sonraki boşluk karakterine atlayın :f<space>

  4. Boşluğu silin ve aşağıdaki harfi büyük kullanın: xgUl

  5. Recurse. q1. adımdaki kayıt defterini temizlediğimiz için henüz bir şey yok, bu yüzden hiçbir şey yapmaz:@q

  6. Makroyu kaydedin: q

Daha sonra bu makroyu bir aralık kullanarak birden çok satıra uygulayabilirsiniz:

Makroyu dosyadaki her satıra uygulayın:

:%normal @q

Makroyu 2–5 dahil satırlara uygulayın:

:2,5normal @q

Görsel bir seçim yapın ve yazın :normal @q. Bu, :tuşa bastığınızda komut satırını önceden doldurur ve makroyu seçimdeki her satıra uygulayan bir komutla sonuçlanır:

:'<,'>normal @a

Tuş vuruşlarını kaydetmeye başlamadan önce olduğu qgibi , kayıt defterini temizlemek gereksizdir qq. Aslında, bu yüzden kaydı qqqtemizlemek için çalışıyor q:)
tommcdo

Tabii ki, bir şey yapacak olsan gerektirdiğini ekleme için qkayıt (yani kullanarak qQönce onu temizleyerek muhtemelen gerekli olacaktır).
tommcdo

2
@tommcdo Vim kopyamda bu kesinlikle doğru değil. (Vim 7.3.87, ile çağrıldı vim -u NONE). Mevcut içerik, yalnızca 6. adımda kaydı kaydettiğinizde silinir. Bu nedenle, yeniden başlatmak istiyorsanız, kaydı başlatmadan önce temizlemeniz gerekir.
Zengin

@tommcdo Bu adımın neden gerekli olduğunu daha net hale getirmek için cevabı güncelledim.
Zengin

Benim hatam, silahı oraya atladım. Mükemmel açıklama!
tommcdo

1

Bkz. Http://vim.wikia.com/wiki/Changing_case_with_regular_expressions \ U, \ L, \ u, \ l değiştiricileri oldukça açık ve öz bir şekilde açıklar!

Özü şudur:

Bir dosyadan geçmek ve bazı rastgele ölçütlerle eşleşen karakterlerin durumunu değiştirmek isteyebileceğiniz zamanlar vardır. Düzenli ifadeleri iyi anlarsanız, bunu oldukça kolay bir şekilde yapabilirsiniz.

Durumunu değiştirmek istediğiniz geri başvuruların önüne \ U veya \ L yerleştirmek kadar basittir ve sonunda \ E. Vim, metni arka başvuru büyük veya küçük harf (sırasıyla) yapar. \ U ve \ l (sonunda \ E olmadan) sadece arka başvurudaki ilk karakterin durumunu değiştirmek için kullanın.

("Backreference", normal ifadenin önceki bölümüne ait olan normal ifadenin bir parçasıdır. En yaygın arka referanslar &, \ 1, \ 2, \ 3, ..., \ 9'dur).

Bu tekniğin gücünü gösteren bazı örnekler:

Tüm dosyayı küçük harfe çevirme

% S /.*/ \ L ve / g

(&, eşleşmenin tam metnini ifade eden kullanışlı bir arka referanstır.)

Öncesinde <olan tüm kelimeleri büyük harfle (ör. HTML etiketi adlarını açma):

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

Ayrıca gu ve gU komutlarına da dikkat edin.

Örneğin, ggguG tüm dosyayı küçük harfe çevirir. (gg = yukarı git, gu = küçük harf, G = EOF'a git).

Normal adın yerine \ 0 genel backref'i kullanarak (\ 1, \ 2 vb.) Normal ifadenin yerini değiştirmek için yazarak kaydedebilirsiniz.

Bu normal ifade, bir dosyada büyük harfe açık bir kelime kümesi büyük / küçük harf kullanır:

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

Roket bilimi değil, aksi takdirde bunu yapmanız gerekir:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
Cevabınızda bahsettiğiniz makaleyi özetleyebilir misiniz?
EvergreenTree

Görüşürüz? Tek linkli cevaplar iyi olacaksa, birkaç yıl sonra bu site silinen linklerle dolu olacaktır. Yalnızca bakın bağlantının önemli bir bölümünü kopyalamak, Ama eğer ve aynı zamanda OP ayrıca infos alabilirsiniz linki vermek, bu tamamdır.
peterh - Monica'yı geri yükle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.