2012-01-18 13 views
5

Pracuję z plikiem YAML, który ma liczbę całkowitą jako ID, która pojawia się co 4-6 linii. Czekam na dodanie rekordu w środku tego pliku (dla czytelności), który zachowuje nienaruszoną sekwencyjną numerację.Vim macro: Inkrementacja liczb w kolejnych wierszach

Format pliku poniżej. Jakieś pomysły?

- 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 

Odpowiedz

5

Wierzę, że można osiągnąć to, co chcesz z ustawieniem licznika (tu: zmienna g:I) do 1:

let g:I=1 

a następnie wykonać podstawienie na każdej linii, który pasuje ^- id: \d\+$:

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

Podstacja używa elementu \= (patrz :help sub-replace-expression), aby zastąpić \d\+ rzeczywistą wartością g:I. Po podstawieniu licznik jest inkrementowany (let g:I=g:I+1).

Przy pomocy g/^- id: \d\+$/ użytkownik upewnia się, że podstawienie jest wykonywane tylko w liniach pasujących do ^- id: \d\+.

Edit Jeśli chcesz mieć mapę dla niego, można umieścić następujący fragment kodu do swojej .vimrc:

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

który pozwala RESYNC identyfikatory wpisując resync w trybie normalnym.

Zwróć uwagę na możliwość usunięcia | z \ i użycie <CR>, w którym należy nacisnąć enter.

+0

To jest kolejna ważna metoda, która przenumeruje każdy pojedynczy identyfikator dokumentu od 1 do początku. Skopiuj ten kod do schowka i użyj ': @ +', aby spróbować (jeśli używasz GUI). – Benoit

+0

Co robi ': @ +'? Widzę, że wypisuje linie 'id: x', ale nie mam pojęcia, dlaczego tak jest. –

+2

Nyfenegger: ': @' odtwarza polecenia Ex zapisane w rejestrze. Rejestr '+' jest zwykle podłączony do zewnętrznego schowka. Zobacz ': help: @'. Jest to cholernie przydatne, jeśli chcesz wypróbować fragmenty z vimrc: 'yy' then': @ "'. – Benoit

3

w celu, aby zwiększyć wszystkich kolejnych identyfikatorów z pozycji kursora + 1:

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

(nr2char(1) jest jak kluczowanie Ctrl-A w).

Można również zrobić:

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

Jeżeli wpiszesz ^A wpisując CTRL-V następnie CTRL-A. Zauważ, że wolę pierwszą wersję: możesz ją kopiować i wklejać, w kodzie nie ma literalnego znaku kontrolnego.

Szczegóły:

  • .+1,$ jest zakres od następnej linii aż do końca pliku. :help range. Polecenie
  • :g działa na wszystkich liniach zgodnych ze wzorcem. Przeciwieństwem jest :v. :help :g
  • /^- id: \d\+$/ mecze - id: na początku linii, a następnie przez 1 lub więcej cyfr, a następnie końcu linii (:help pattern)
  • :normal! odgrywa normalnych poleceń: 0, aby przejść do początku linii, CTRL-A, aby zwiększyć obok numer.

Jeśli chcesz mapowanie:

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

umieścić, że w vimrc, a teraz cieszyć się naciskając klawisz F1 w trybie normalnym, a następnie oglądać wszystkie identyfikatory poniżej linii kursora przyrostu wartości.

+0

Doskonale, chociaż wolę zmiany globalne osobiście. Dziękuję, Benoit, za pomoc we wszystkich odpowiedziach na to pytanie. – Lumen

1

Chciałbym użyć następującego krótkiego i prostego polecenia zamiany.

:,$s/^- id: \zs\d\+/\=submatch(0)+1/ 
Powiązane problemy