Vim'den çıkmadan bir dosyanın bir kısmındaki sözcükleri nasıl sayabilirim?


10

Metin dolu bir dosya var (Markdown veya LaTeX diyelim). Bu dosyanın bir bölümündeki kelime sayısını saymak istiyorum.

:! wc -w %Geçerli arabellek wc -w çalıştırmak için yapabileceğimi biliyorum . İlgilendiğim bölümü adlandırılmış bir kayıt altına çekebileceğimi biliyorum. Bir komut veya kanalda kullanılmak üzere işletim sistemine adlandırılmış bir kayıt göndermenin bir yolu olduğunu tahmin ediyorum, ancak bir tane bulamadım. Yoksa bir kayıttaki kelimeleri saymanın daha iyi bir yolu var mı?

Kullanım durumum, vim'de çok fazla programlama olmayan yazı (notlar, tez vb.) Yapmam ve bir düzenlemenin ortasında dosyanın belirli bir bölümüne kaç kelime eklediğimi saymak istiyorum oturum, toplantı, celse.

Yanıtlar:


16

Kullanabilirsiniz gCTRL+g, bu size verecek:

Col 1 of 118-121; Line 1 of 5; Word 1 of 142; Byte 1 of 678

Görsel moddan da kullanabilirsiniz, sadece seçim için kelime sayısını almak istiyorsanız, özellikle metin nesneleriyle birlikte yararlıdır ip. (örneğin vipg<C-g>, geçerli paragrafın kelime sayısını almak için kullanabilirsiniz ).

Bakınız: :help word-countve :help text-objects.


Yukarıdaki seçenek muhtemelen daha iyidir, ancak wcbir bölümdeki sözcük sayısını saymak için yardımcı programı da kullanabilirsiniz . Kullandığınız :! wc -w %formun yanı sıra kullanabilirsiniz :%!wc -w. Bu, bir hareketi kabuk aracına (bu durumda %tüm arabelleğe) filtreleyecektir , ancak başka aralıklar da kullanabilirsiniz ( :1,5!wc -wilk 5 satır !,+5!wc -wiçin, geçerli ve sonraki 5 satır için, vb. Gibi). Görsel modda da metin seçebilir ve :!wc -wseçiminizi filtrelemek için yazabilirsiniz .

Bunun, hareketi kabuk aracının çıktısıyla değiştireceğini unutmayın, ancak bunu ugeri alabilirsiniz .

Bkz :help :range!, :help rangeve bu cevabı ben aralıkları için daha fazla örnek.


Arama yaparken böyle bir şey buldum, ancak ilk g sayım komutunun bir parçası değil, bir konum belirleyici değil. Bu çözüm şimdi mantıklı. Görünüşe göre Görsel modda da okumalıyım; Ben yeterince sık kullanmıyorum.
Colin McFaul

1
g<C-g>Bu şekilde kullanabileceğine dair hiçbir fikrim yoktu . Müthiş!
EvergreenTree

3

Bunun iki yolu vardır, saf vimscript yolu ve wcyolu.

Saf vim yolu

Bunu yapmak için arama ve değiştirme komutunu kullanabilirsiniz. Örneğin:

:%s/\<\w\{-}\>//gn

Bunun yaptığı, verilen bir kalıbı bir şeyle değiştirmek yerine, sadece kalıbın oluşumlarını sayar. Bu nbayrak yüzünden . Belirli bir bölümdeki kelimeleri saymak için (bu durumda 5-15 arasındaki satırlar), şöyle bir şey yapabilirsiniz:

:5,15s/\<\w\{-}\>//gn

Bu, bir seçimin içeriğini bir kayıt defterine alma ihtiyacını ortadan kaldırır. Nelerin yerleştirilebileceğine ilişkin daha fazla olasılık görmek 5-15için yardım konusunu okuyun cmdline-ranges. Bunu sık sık yapmak istiyorsanız, muhtemelen bir eşleme (veya komut) oluşturmak iyidir. Ayrıca, hlsearchetkinleştirdiyseniz, :nohlsearchvurgulamayı temizlemek için daha sonra çalıştırmak isteyebilirsiniz .

wcyol

Aynı şey başarılabilir wc. Aynı şekilde komutu cmdline-rangesiçeren alanı seçmek için :skullanabilirsiniz, bunları harici komutlarla kullanabilirsiniz. Örneğin:

:5,15!wc -w

Bu wckomut 5 ile 15 arasındaki satırları komut aracılığıyla çalıştırır . Bunun dezavantajı, bu satır aralığını komutun çıktısıyla değiştirmesidir. Düğmesine basarak bu değişikliği geri alabilirsiniz u. Ayrıca, vimscript çözümünün farklı dillerde çalışmayabileceğine dikkat edin, çünkü \wnormalde diğer dillerdeki kelime karakterleri ile eşleşmez. wcbundan daha iyisini yapabilir \w. Ayrıca, bunu daha hızlı yapmak için süslü bir komut:

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

Bu kaydın clobbers olduğunu unutmayın a.

Not

Bunun g<C-g>tuş kombinasyonu ile görsel modda da gerçekleştirilebileceği anlaşılmaktadır . Bunun açıklaması için Carpetsmoker'ın cevabına bakınız.


Bunları n ile birlikte küresel hale getirmek için ag gerekir (aksi takdirde, satır başına sadece bir kelime ile eşleşirler). İkincisinin de başında s olması gerekir.
Colin McFaul

1
Sabit, bunun için üzgünüm.
EvergreenTree

1
\wSesleri ilk başta hoş bir fikir gibi kullanmak , ama test ettikten sonra bir takım sorunlar buldum. En büyüğü, ascii olmayan karakterlerle eşleşmeyeceğidir, bu yüzden benzer bir kelime überatlanır ( dün hakkında bir soru vardı ). Ayrıca, gibi bir kelime e-mail2 kelime olarak sayılır, çünkü -içinde değildir \w(a -kullanımı İngilizce'de biraz nadirdir, ancak örneğin Hollandacada çok yaygındır). Bu şekilde göz ardı edilen başka karakterler de olabilir, bu da beni son noktaya getiriyor: "kelime" olarak kabul
edilenlere ilişkin sözleşmeler

... çeşitli dillerde, ve "uygun" araçlar gibi wcyerel alabilir (GNU wcgerçekten bu arada başa çıkıp başaracağını bilmiyorum , GNU araçları mükemmel unicode desteği ile tanınmıyor).
Martin Tournoij

Bu ilginç. Bunu bir artı olarak wcçözüme ekleyebilirim .
EvergreenTree

1

Kelimeler için kullanın:

:.,+4 s/\i\+/&/gn

. geçerli satırı belirtir.

Ayrıca .vimrc dosyama şunları koydum:

:cabbrev zzcc   s/./&/gn

:cabbrev zzcw   s/\i\+/&/g

Şunu yazabilirim:

:.,+6 zzcw

ve zzcwirade genişleyeceks/\i\+/&/g

zzcw(Benim için) bir şey uymayacak sadece tek isimdir.

Bir yan etki, tüm dosyanın seçili ve vurgulanmış olmasıdır.

Bir dosyaya çok satırlı tweet'ler yazmak, çok fazla karakter olmadığından emin olmak ve tweet'i twitter'a yapıştırmak istedim.

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.