Bir dosyaya kalıcı satır numaraları nasıl eklenir?


22

Böyle bir metin dosyası var (Windows'ta gVim kullanarak)

foo bar baz quux 
corge grault garply 
waldo fred plugh 
[...150 more lines...]
xyzzy thud

Dosyadaki her satıra bir sayı eklemek istiyorum. Kullanmıyor :set number, ancak sayıyı aşağıdaki gibi her satırdan önce metin olarak eklemek için sayı dosyanın bir parçası.

1. foo bar baz quux 
2. corge grault garply 
3. waldo fred plugh 
[...~150 more lines...]
155. xyzzy thud

awkmuhtemelen bu iş için bir araçtır. Ama Windows'dayım (iç çekiyorum).
roblogic

Yanıtlanan zaten burada :), aldırma
roblogic

1
Belki .. Yoksa bu daha genel mi?
muru

Benzer, ancak kalıcı satır numaralarının ne olduğunu bilmiyorum. İkincisi, diğer soru özellikle Windows'ta gVim için tüm satırlarla ilgilidir (ve cevap bunu yapar) ve bu sadece düz vim'de bir paragraf için basit numaralı listedir.
kenorb

3
Eh, post "kalıcı" ot kullanır sanırım tampon değiştirilecek olduğunu ve sayıları tamamen görsel bir şey değildir (sizinle aynı) değildir. Windows'ta gvim belirtmenin nedeni , sayı satırları yapabilen catveya nlgenellikle Windows'ta bulunmayan (OP'nin yorumlarından da belirtildiği gibi) gibi harici yardımcı programlardan kaçınmaktır awk. İlk iki çözüm saf Vim'dir. Son olarak, tüm paralar bir paraya karşı sadece aralık seçimi meselesidir. Açıkçası büyük bir sorun değil.
muru

Yanıtlar:


37

Saf Vim tarzında:

:%s/^/\=line('.').". "

Açıklama:

:%s/^/            " the substitution will be applied to the beginning of every line
\=                " the rest of the replacement part is an expression
line('.').". "    " the expression returns the current line number concatenated with a dot and a space

Bkz :help \=ve :help line().

Değiştirme kısmında bir ifade kullanmak çok güçlüdür ve FWIW vimscript'e oldukça iyi bir giriş noktasıdır.


Bu çok kullanışlı komutu vimrc'deki bir tuş eşlemesine nasıl ekleyebilirim?
cosmicraga

Vim yardım konusuna ikame için::help sub-replace-expression
akurtser

9

Vim makroları hakkında güzel bir şey, tekrar okuyabilmeleridir (kendilerini çağırabilirler):

  1. Kayıt s'yi temizle q: qqq
  2. İlk satıra numarayı ekleyin: ggI1.(boşluğu unutmayın!)
  3. Satırın başına git ve bir makro kaydetmeye başla: 0qq
  4. Numarayı kopyalayın: yW
  5. Bir satır aşağı gidin ve numarayı yapıştırın: +P
  6. Satırın başına git ve sayıyı arttır: 0<c-a>
  7. Satırın başına geri git (böylece çift rakamlara ulaştığında makro kırılmaz!): 0
  8. Özyinelemeli hale getirmek için makroyu bir kez çağırın. Hiçbir şey olmaz bu yüzden bu noktada, kayıt q hiçbir şey, hala var: @q.
  9. Makroyu kaydedin: q
  10. Makroyu bir kez daha arayın ve kıvılcımların uçmasını izleyin !: @@

Makro daha sonra dosyanın sonuna ulaşıncaya kadar kendini çağırmaya devam eder.

Diğer birçok benzer sorun için özyinelemeli makro hile kullanabilirsiniz, bu yüzden farkında olmak iyi bir şey.

Herhangi bir nedenle özyinelemeli makro kullanmak istemiyorsanız, 1. ve 8. adımları atlayabilir ve makroyu birden çok kez çalıştırmak için bir sayı kullanabilirsiniz ; örneğin 100@q, makroyu q100 kez çalıştıracaktır .


1
Güçlü şeyler, ustalığınıza boyun eğiyorum. Makrolar benim için kara büyü gibi ...
Roblogic

1
@ropata, bir makro (çoğunlukla) normal mod komutlarının bir dizisidir.
romainl

1
@romainl Bence bunu bir tuş vuruşu dizisi olarak düşünmek daha iyi .
Zengin

2
@Rich, eski komutlar da dahil olmak üzere birçok şeyin bir sırası olabilir.
romainl

2
@romainl Evet, bu yüzden bunu tuş vuruşları olarak düşünmenin en iyisi olduğunu düşünüyorum. Klavyede yazdıklarınızı (dediğiniz gibi ex komutları dahil), hepsini elle yazmış gibi oynatır.
Zengin

7

Bunun gibi görevleri yerine getirmek için vim global komutunu kullanmayı seviyorum. Bu, satırın başına yineleme eklemek veya metindeki bir sembolü değiştirmek için geçerlidir. Diğer çözümlerden daha karmaşık görünüyor, ancak kullanışlı olduğunda kullanmak için oldukça esnek bir modeldir ve çok fazla düşünmeden kolayca değiştirilebilir.

İlk olarak, aralığınızı seçin (bunu uygulamak istediğiniz satırlar). Genellikle işaretler kullanırım (örneğin mailk satırda ve mbikinci satırda , ancak satır numaralarını veya görsel seçimi de kullanabilirsiniz), sonra aşağıdaki komutun bir modifikasyonunu girin (şu anda kullanım durumunuz için ayarlanmıştır)

:let i=1|'a,'bg/^/s/^/\=i.". "/|let i=i+1

Yapıçözüm

:let i=1

Bu, değişkeni ibaşlangıç ​​değeriyle ayarlar . Genellikle listeler 1 ile başlar, bu yüzden i'yi 1 olarak ayarlıyorum.

|

Çubuk yeni bir komut başlatır

'a,'b

Bu, bir sonraki komutun aralığını ayarlar. Listenizin ilk satırında ve son satırında ayarlanacak aişaretten işarete gidiyorum b.

g/^/

Bu küresel komuttur. Belirli bir normal ifade için dosyayı (veya aralığı) arar ve eşleşen satırların her birinde komut satırının geri kalanını yürütür . "Satır başı" nı arayarak her satırı eşleştiriyorum. Şöyle bir metniniz olsaydı

Item some txt
other text

Item second item
whatever
Item third

ve yalnızca bu etiketleri Itemdiğer satırların önüne koymak ve yoksaymak, yapmak g/Item/veya g/^Item/bunun yerine (değişmez Öğe metnini varsayarak)

s/^/\=i.". "/

Bu, satırın başlangıcını ia ile bitiştirilmiş değerle değiştirmek için normal ifadeyi yürütür .. Genellikle bunu herhangi bir şeye yapabilirsiniz ( Itemörneğin etiketi numarayla değiştirin ).

|let i=i+1

Çubuk yeni bir komut başlatsa da, global tamamlandıktan sonra, global komut içinde çalışacak ikinci bir komut ayarlar. Sonuç, bir isonraki satırın g ile işlenmesinden önce artmamızdır. İşte başka bir esneklik yeri. İ'nin modifikasyonu herhangi bir şey olabilir (2 ile artırın, ne olursa olsun Fibonacci dizisinin bir sonraki elemanını üreten bir işlevi çağırın).


7

Tüm satırlara numara ekle

Kullanımı mümkündür :%!nl -baveya :%!cat -ntüm hatlara hat numaralarını katacak komutlar.

Windows'ta Cygwin / MSYS / SUA kurulu olmalıdır.

Seçili satırlara numara ekleme

Yalnızca seçili satırlara numara eklemek için lütfen bunları görsel modda ( vve imleçlerde) seçin, ardından bitirdiğinizde şu komutu yürütün: :%!nl(boş satırları yoksay) veya :%!cat -n(boş satırlar dahil).

Biçimlendirme

Fazla boşlukları kaldırmak için, bunları görsel blokta ( Ctrl+ v) seçin ve kaldırın ( x).

Bazı karakterler (eklemek için ., :, ), sayı sonra) görsel blokta (bunları seçin Ctrl+ vsonra (karakter eklenir,) Adaha sonra bitirmek, karakteri yazmak, Esc).


2
Bu, soruda verilenle aynı biçimlendirmeyi vermez. Ancak, çözümün basitliğini seviyorum.
Karl Yngve Lervåg

@ KarlYngveLervåg Teşekkürler, cevaba ekledi.
kenorb

5

Romainl'in cevabında bir değişiklik :

:%s/^\(\d\+\. \)\?/\=line('.').". "

Bu sadece olmaz eklemek , satır numaralarını da olacak yerine onlar zaten oradayız çıkan satır numaralarını. Bir çizgi eklediyseniz, her şeyi beklendiği gibi yeniden numaralandırır.

Bu, herhangi bir sayıyı ve ardından a'yı değiştirerek çalışır. ve satırın başında yeni bir sayı içeren bir boşluk. Bu desenle başlayan bir çizginiz varsa, bu kesinlikle kırılacaktır, bu yüzden düşünce ile kullanın.

Eklenen bölüm:

  • ^ - Hattın başlangıcı
  • \( - Yeni alt grup başlat
  • \d\+ - Bir rakamı bir veya daha fazla eşleştirin
  • \. - Bir nokta ( .) ve bir boşluk eşleştirin .
  • \) - Alt grubu sonlandır
  • \? - Grubu isteğe bağlı yapın, böylece bu satırda henüz hiç numara yokmuş gibi çalışır.

Bonus ipucu:
To kaldırmak hat numarası varsa boşaltmak repalce kısmı ile aynı desen kullanabilirsiniz:

:%s/^\(\d\+\. \)\?//

5
I1. <esc>^qqyWjP^<C-a>q

Bu, ilk iki satırı numaralandırır ve @qsonraki satırları numaralandırmak için tuşuna basabilirsiniz (veya 18@qtoplam 20 satır numaralandırmak istiyorsanız Örn. Yazın).

Açıklama:

I1. <esc>  Number the first line
hqq        Go back to the start of the line and start recording a macro
yWjP       Copy the line number to the next line
^<C-a>     Increment the next line's line number
q          Finish recording

Bunun yararı, herhangi bir harici komut gerektirmemesidir, örneğin Windows'ta Vim ile çalışıyorsanız faydalıdır.


Yazdıktan sonra 1. <esc>hilk sütunda değil, ikinci sütundasınız. Ben yerini alacak holan 0senin çözüm çok iyi olması gerektiğini düşünüyorum bundan sonra.
Karl Yngve Lervåg

@ KarlYngveLervåg Whoops, bu bir yazım hatasıydı. Teşekkürler, düzelttim.
Doorknob

Sorun değil. Ancak, açıklamayı hala güncellemediniz. Ayrıca: Birçok klavyede, ^gibi kombinasyonların yazılmasına izin vermek için ikinci bir karakter bekler ^a -> â. Hala en iyi çözüm olduğuna katılıyorum, ancak bence bu da belirtilmelidir.
Karl Yngve Lervåg

3

Seçilen cevabın en iyisi olduğunu düşünüyorum, ancak çeşitliliğe rağmen, harici bir program kullanarak bir alternatif sunacağım:

:%!cat -n

Bu (ve ile temsil edilen tüm tampon süzer %dış program ile), cat, burada -nuygun bir hat numarası ile girişin her satırı ekler.

Bu, elbette, cattüm Unix benzeri sistemler için geçerli olan yüklemenizi gerektirir .

:help :range!Harici programlar üzerinden filtreleme hakkında daha fazla bilgi için göz atın .


1
Askerin Windows'ta gVim kullandığını anlıyorum, bu yüzden bu çözüm muhtemelen orada çalışmayacak. Ancak, yine de başkalarının bundan öğrenmesi için bazı fırsatlar sağladığını düşünüyorum.
tommcdo

Bunu PATH'nize yüklediyseniz msysgitve eklediyseniz (IIRC, bir yükleme seçeneğidir), bu çözüm Windows'ta da çalışmalıdır.
Martin Tournoij

4
cat -nPOSIX değildir, ancak nldaha iyi bir seçenek olabilir.
muru

2

Biraz hileli bir çözüm aşağıdaki olabilir ( Ctrl+ ve> arasında yazılan her şey + tuşuna bastıktan sonra eklenmelidir v):

:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd

Yapıçözüm

:%normal {commands}

aralık tarafından belirtilen her satırda normal mod komutunu çalıştırır, bu durumda her satır

:redir @"

ex komutları tarafından yapılan her çıktıyı adlandırılmamış ara belleğe yönlendirir.

:.=

geçerli satır numarasını veren bir ex komutudur (maalesef önceki satırsonu ile birlikte)

:redir END

adsız arabelleğe yönlendirmeyi durdurur

I<C-R>".<Tab><Esc>

adsız arabellek içeriğini a ile ekler. ve her satırın önüne bir sekme ekler ve ekleme modundan çıkar.

kdd

bir satır yukarı gider ve:. = komutunun sonucu olan yeni satırı kaldırır.

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.