2012-01-18 20 views
5

Her 4-6 satıra kadar bir tamsayıya sahip bir YAML dosyası ile çalışıyorum. Bu dosyanın ortasında (okunabilirlik için) sıralı numaralandırmayı sağlam tutan bir kayıt eklemek istiyorum.Vim makrosu: Ardışık olmayan satırlardaki sayıları artırma

Dosya formatı aşağıda. Herhangi bir fikir? İmleç çizgi + 1 sonraki tüm kimlikleri artırmak amacıyla

- id: 1 
    type: string 
    option: diff_string 
    other: alt_string // note: 'other' option does not appear for all records 

- id: 2 
    type: string 
    option: diff_string 

//new record would go here as id: 3, increasing id: # of all following records by 1 

- id: 3 
    type: string 
    option: diff_string 
    other: alt_string 

cevap

5

Sana (değişken g:I burada): bir sayaç ayar ile istediğini elde edebilirsiniz inanıyoruz

let g:I=1 

Sonra eşleşen her satırda bir değişiklik yürütmek ^- id: \d\+$:

%g/^- id: \d\+$/ s/\d\+/\=g:I/|let g:I=g:I+1 

Altyapı, \d\+ yerine g:I gerçek değeri ile \= şeyi kullanır (bkz. :help sub-replace-expression). Alt tabakadan sonra sayaç artırılır (let g:I=g:I+1).

g/^- id: \d\+$/ ile alt katmanın yalnızca ^- id: \d\+ ile eşleşen satırlarda gerçekleştirildiğinden emin olun.

Düzenleme bunun için bir harita sahip olmak istiyorsanız, size aşağıdaki parçacığını yerleştirebilirsiniz.vimrc:

nnoremap resync :let g:I=1<CR>:%g/^- id: \d\+$/ s/\d\+/\=g:I/\|let g:I=g:I+1<CR> 

normal modda yılında resync yazarak resync senin kimlikleri sağlar.

Not \ ile | ait kaçış ve enter tuşuna ediyorum <CR> kullanımı.

+0

Bu geçerli başka bir yöntemdir ve belgede her bir tanıtımı baştan sona sonuna kadar 1 ile yeniden numaralandırır. Bu kodu panoya kopyalayın ve denemek için ': @ +' kullanın (GUI kullanıyorsanız). – Benoit

+0

': @ +' ne yapar? Görüyorum ki, 'id: x' satırlarını yazdırıyor ama neden bunun hakkında hiçbir fikrim yok. –

+2

Nyfenegger: ': @' Kayıtta kayıtlı Ex komutlarını çalar. '+' Kaydı normalde harici panosuna bağlanır. Bakınız:: yardım: @. Eğer vimrc: 'yy' sonra': @ ''den alıntıları denemek istiyorsanız bu yararlıdır. – Benoit

3

:

:.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1) 

(nr2char(1) CTRL-A tuşlamak gibidir).

Ayrıca yapabilirsiniz: Eğer ^A CTRL-A, ardından CTRL-V yazarak girmek

:.+1,$g/^- id: \d\+$/normal! 0^A 

. İlk sürümü tercih ettiğimi unutmayın: kopyalayıp yapıştırabilirsiniz, kodda herhangi bir değişmez kontrol karakteri yoktur.

Detay:

  • .+1,$ dosyanın sonuna kadar bir sonraki satırından aralığıdır. :help range. Bir forma uygun tüm hatlarda
  • komutu çalışır. Tersi :v. 1 veya daha fazla rakam edildi ve daha sonra hattın sonuna bir çizgi başlangıcında :help :g
  • /^- id: \d\+$/ stoktaki - id:, (:help pattern)
  • :normal! normal komutların oynar: 0 satır başına gitmek için, CTRL bir sonraki artırmak numara.
    nnoremap <F1> :.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)<enter> 
    

    normal modda F1 tuşuna basarak zevk ve imleç satır artmasını altındaki tüm kimlikleri izlemek şimdi vimrc koy ve: Bir eşleme istiyorsanız

. 1:

+0

Mükemmel, genel değişikliği kişisel olarak tercih etsem de. Bu sorudaki tüm cevaplarda yardımınız için teşekkürler Benoit. – Lumen

1

Aşağıdaki kısa ve basit değiştirme komutlarını kullanırdım.

:,$s/^- id: \zs\d\+/\=submatch(0)+1/ 
İlgili konular