Schimbarea conținutului în numărul de numere [numărătoare] specificate pentru fiecare rând

Trebuie să schimb conținutul într-un număr de [count] pentru fiecare linie din buffer-ul meu.

1 {Lorem} ipsum dolor {amet} blah blah {change this text} more blah blah
2 Hello. The {sun} rises in {the} east. blah {blah}. {also change this text}. final blah

În line 1 , trebuie să înlocuiți conținutul din setul de 3rd pentru forest random . Pentru line 2 , trebuie să modific textul din setul de al patrulea pentru alchimie alchimică .

I know of a naive method for doing this, i.e. for each line, first move the cursor to the desired braces and perform a ci}

Din motive de eficiență (deoarece eu sunt de editare/proof-lectură un fișier text mare cu astfel de markup), aș dori să fac aceste substituții pe linie fără mutarea cursor de la coloana 1 pentru fiecare substituire pe linie.

Cum pot realiza acest lucru? Are ajutor modul ex ?

1
adăugat editat
Vizualizări: 4

2 răspunsuri

răspunsul de la @RubenWesterberg este o secvență corectă a comenzilor din modul Normal pentru a face ceea ce doriți. Dar am citit cererea dvs. să nu mișcați cursorul puțin mai literal. De asemenea, dacă trebuie să faceți astfel de schimbări frecvent, probabil că doriți ceva mai puțin manual.

Puteți utiliza substituția standard într-o cartografiere ca aceasta:

:nnoremap  { ':s/\({.\{-}\)\{' . v:count1 . '}\zs[^}]*/'

This is used in Normal mode by entering N\{ where N is the numerical 1-based "index" of the bracket pair within which you want to replace text. (I'm assuming you are using default key \). This will take you to the command-line with a pre-populated :substitute command. The cursor will be placed so you merely enter the replacement text followed by Enter and the work is done.

Rețineți că valoarea N este socotită din poziția curentă a cursorului. Aceasta va funcționa dacă cursorul nu este în prima coloană, dar dacă apar paranteze înaintea cursorului, acestea nu vor fi luate în calcul.

Și N poate fi omis, caz în care va fi folosit un index prestabilit 1.


Update: For fun, if we want to take the no-cursor-movement requirement to the extreme this version will add Normal mode command 0 after the substitution so you always end up back in the first column:

:nnoremap  { ':s/\({.\{-}\)\{' . v:count1 . '}\zs[^}]*// \| norm! 0'

Update 2: Didn't have time to do this earlier so here's a breakdown of the pattern in the substitution. If we have N=3 then substitution renders as the following (with the cursor at the very end):

s/\({.\{-}\)\{3}\zs[^}]*/
  • {.\{-} - Match a left bracket, {, followed by zero or more characters until a later segment of the pattern is matched or the pattern end is reached. .\{-} is like .* except that the latter matches as many characters as possible while the former matches as few as possible.
  • \(...\)\{3} - Match the previous pattern exactly three times.
  • \zs - Indicates that the substitution will replace characters starting at this position rather than replacing the whole pattern match. In this case, it is the position of the first character inside the target bracket pair.
  • [^}]* - Match zero or more characters that are not } or, in other words, match everything inside the target bracket pair.
2
adăugat
Răspuns amuzant. Mulțumesc
adăugat autor Joel, sursa

Executați următoarele în modul normal pe prima linie:

2f{ci{REPLACEMENT_TEXT0

Acest lucru va găsi țesătura țintă, modificați conținutul la REPLACEMENT_TEXT și apoi returnați cursorul înapoi la începutul liniei.

Pentru al doilea rând:

4f{ci{REPLACEMENT_TEXT0

Rețineți că numărul exact de brațe de căutat depinde de cazul în care primul caracter de pe linie este o brevet.

1
adăugat