Minulla on tällainen tekstitiedosto (käyttää gVimiä Windowsissa)
foo bar baz quux corge grault garply waldo fred plugh [...150 more lines...] xyzzy thud
Haluan lisätä numeron jokaiselle tiedoston riville. Ei käytä :set number
, vaan lisätään numero kutakin riviä edeltävänä tekstinä seuraavasti, joten numero on osa tiedostoa.
1. foo bar baz quux 2. corge grault garply 3. waldo fred plugh [...~150 more lines...] 155. xyzzy thud
Kommentit
Vastaa
Puhtaalla Vimillä:
:%s/^/\=line(".").". "
Selitys:
:%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
Katso :help \=
ja :help line()
.
Lausekkeen käyttäminen korvaavassa osassa on erittäin tehokasta ja FWIW on melko hyvä kohta syöttää vimscript.
Kommentit
- Kuinka voin lisätä tämän erittäin hyödyllisen komennon vimrc-näppäinkarttaan?
- Päästäksesi korvaamaan vim-ohjeaihe:
:help sub-replace-expression
Vastaa
Yksi mukava asia Vim-makroissa on, että ne voivat toistaa (he voivat vedota itseään ):
- Tyhjennä rekisteri q:
qqq
- Lisää numero ensimmäiselle riville:
ggI1.
(älä unohda välilyöntiä!) - Siirry takaisin rivin alkuun ja aloita makron tallentaminen:
0qq
- Kopioi numero:
- Siirrä riviä alaspäin ja liitä numero:
+P
- Palaa rivin alkuun ja lisää numero:
0<c-a>
- Siirry takaisin rivin alkuun (joten makro ei katkea, kun se saa kaksinkertaisen luvun!):
0
- Kutsu makro kerran, jotta se olisi rekursiivinen. Tässä vaiheessa rekisterissä q ei ole vielä mitään, joten mitään ei tapahdu:
@q
. - Tallenna makro:
q
- Kutsu makroa vielä kerran ja katso kipinöiden lentämistä !:
@@
Makro jatka sitten itsensä kutsumista, kunnes se saavuttaa tiedoston lopun.
Voit käyttää rekursiivista makrotemppua moniin muihin vastaaviin ongelmiin, joten se on hyvä olla tietoinen.
Jos et halua jostain syystä käyttää rekursiivista makroa, voit jättää pois vaiheet 1 ja 8 ja suorittaa count makron suorittamiseksi useita kertoja, esim. 100@q
suorittaa makron q
100 kertaa.
Kommentit
- Tehokkaita juttuja, kumartan mestaruuttasi. Makrot ovat minulle kuin mustaa taikuutta …
- @ropata, makro on vain (yleensä) normaalitilan komentojen sarja.
- @romainl Luulen sen ’ on parempi ajatella sitä näppäinpainallusten sarjana .
- @Rich, se voi olla sekvenssi monista asioista, mukaan lukien ex-komennot.
- @romainl Kyllä, se ’ on, miksi mielestäni ’ on parasta ajatella sitä näppäinpainalluksina. Se toistaa tarkalleen mitä kirjoitat näppäimistölle (mukaan lukien, kuten sanot, ex-komennot), ikään kuin olisit kirjoittanut kaiken manuaalisesti.
Vastaa
Haluan käyttää vim global -komentoa tällaisten tehtävien suorittamiseen. Tämä koskee iteraation lisäämistä rivin alkuun tai tekstin symbolin muokkaamista. Se näyttää monimutkaisemmalta kuin muut ratkaisut, mutta on melko joustava malli käytettäväksi, kun sinulla on se kätevä, ja sitä on helppo muokata ilman paljon ajatusta.
Valitse ensin alue (mikä viivat haluat soveltaa tätä). Käytän yleensä merkkejä (esim.ma
ensimmäisellä rivillä ja mb
toisella rivillä, mutta voit käyttää myös rivinumeroita tai visuaalista valintaa) ja kirjoita sitten muutos seuraava komento (tällä hetkellä mukautettu käyttötapaustasi varten)
:let i=1|"a,"bg/^/s/^/\=i.". "/|let i=i+1
Dekonstruktio
:let i=1
Tämä asettaa muuttujan i
aloitusarvolla. Yleensä luettelot alkavat 1: llä, joten asetan i arvoksi 1.
|
Palkki aloittaa uuden komennon
"a,"b
Tämä asettaa seuraavan komennon alueen. Menen merkistä a
merkkiin b
, joka asetetaan luettelon ensimmäiselle ja viimeiselle riville.
g/^/
Tämä on yleinen komento. Se etsii tiedostosta (tai alueelta) tietyn säännöllisen lausekkeen ja suorittaa loput komentorivistä jokaisella vastaavalla rivillä. Vastaan jokaiseen riviin etsimällä sanan ”rivin alku”. Jos sinulla on tekstiä, kuten
Item some txt other text Item second item whatever Item third
ja haluat laittaa nämä tunnisteet vain Item
ja ohita muut rivit, tee sen sijaan g/Item/
tai g/^Item/
(olettaen kirjaimellinen Kohde-teksti )
s/^/\=i.". "/
Tämä suorittaa säännöllisen lausekkeen rivin alun korvaamiseksi arvolla i
, joka on liitetty a .
. Yleensä voit tehdä tämän mihin tahansa (korvaa tarra Item
esimerkiksi numerolla).
|let i=i+1
Vaikka palkki käynnistää uuden komennon, se asettaa toisen komennon suoritettavaksi globaalissa komennossa sen sijaan, että globaali on valmis. Tuloksena kasvatamme i
ennen kuin g käsittelee seuraavan rivin. Tässä on toinen joustavuus. i: n muunnos voi olla mikä tahansa (incre kutsu funktiota, joka luo Fibonacci-sekvenssin seuraavan elementin, mikä tahansa).
Vastaa
Lisää numeroita kaikki rivit
On mahdollista käyttää :%!nl -ba
tai :%!cat -n
-komennot, jotka lisäävät rivinumerot kaikkiin riveihin.
Windowsissa ”Cygwin / MSYS / SUA on asennettu.
Lisää numeroita valituille riveille
Jos haluat lisätä numeroita vain valituille riveille, valitse ne visuaalinen tila ( v ja kohdistimet), sitten kun olet valmis, suorita komento: :%!nl
(ohita tyhjät rivit) tai :%!cat -n
(tyhjät rivit mukana).
Muotoilu
Jos haluat poistaa ylimääräisiä välilyöntejä, valitse ne visuaalisessa lohkossa ( Ctrl + v ) ja poista ne ( x ).
Lisää merkkejä (.
, :
, ), valitse numerot numeron jälkeen visuaalisessa lohkossa ( Ctrl + v ) ja liitä sitten merkki ( A , kirjoita merkki ja viimeistele lopuksi Esc ).
Kommentit
- Tämä ei anna samaa muotoilua kuin annettu kysymyksessä. Pidän kuitenkin ratkaisun yksinkertaisuudesta.
- @KarlYngveLerv å g Kiitos, sisällytti sen vastaukseen.
vastaus
Muutos romainlin vastaukseen :
:%s/^\(\d\+\. \)\?/\=line(".").". "
Tämä ei vain lisää rivinumeroita, se myös korvaa poistuvat rivinumerot siinä, missä ne jo ovat. Jos, jos olet lisännyt rivin puoliväliin, se numeroi kaiken uudelleen odotetulla tavalla.
Tämä toimii korvaamalla mikä tahansa numero, jota seuraa a. Ja rivin alussa oleva välilyönti uudella numerolla. . Tämä rikkoo tietysti, jos sinulla on rivi, joka alkaa jo tällä kuviolla, joten käytä sitä ajatellen.
Lisätty osa:
-
^
– rivin alku -
\(
– Aloita uusi alaryhmä -
\d\+
– Yhdistä numero vähintään kerran -
\.
– Yhdistä piste (
.
) ja välilyönti.
-
\)
– Lopeta alaryhmä -
\?
– Tee ryhmästä valinnainen, jotta se toimii kuten aiemmin, jos tällä rivillä ei vielä ole numeroa.
Bonusvihje :
Voit poistaa rivinumerot käyttämällä samaa mallia, kun vastausosa on tyhjä:
:%s/^\(\d\+\. \)\?//
Vastaa
I1. <esc>^qqyWjP^<C-a>q
Tämä numeroi kaksi ensimmäistä riviä, ja voit painaa @q
numeroita seuraavia rivejä (tai kirjoita ex. 18@q
, jos haluat numeroida yhteensä 20 riviä).
Selitys:
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
Tämän etuna on, että se ei vaadi ulkoisia komentoja, mikä on hyödyllistä, jos esimerkiksi työskentelemällä Vimin kanssa Windowsissa.
Kommentit
- Kun olet kirjoittanut
1. <esc>h
, olet toinen sarake, ei ensimmäinen sarake. Korvasinh
sanalla0
, minkä jälkeen mielestäni ratkaisusi pitäisi olla erittäin hyvä. - @KarlYngveLerv å g Hups, se oli kirjoitusvirhe. Kiitos, korjasin sen.
- Ei ongelmaa. Et kuitenkaan ole vieläkään päivittänyt selitystä. Lisäksi: Monilla näppäimistöillä
^
odottaa toista merkkiä salliakseen kirjoitusyhdistelmät, kuten^a -> â
. Olen edelleen samaa mieltä sen parhaasta ratkaisusta, mutta mielestäni tämäkin on mainittava.
Vastaa
I mielestäni valittu vastaus on paras, mutta vaihtelevuudesta huolimatta tarjoan vaihtoehdon ulkoisen ohjelman avulla:
:%!cat -n
Tämä suodattaa koko puskuri (jota merkitsee %
) ulkoisen ohjelman kautta, cat
, jossa -n
flag valmistaa jokaisen syöterivin rivinumerolla.
Tämä edellyttää tietysti, että cat
on asennettu, mikä pätee (todennäköisesti) koko Unixiin -tyyppiset järjestelmät.
Katso :help :range!
lisätietoja ulkoisten ohjelmien suodattamisesta.
Kommentit
- Ymmärrän, että kysyttäjä käyttää gVimiä Windowsissa, joten tämä ratkaisu todennäköisesti ei voinut ’ toimia siellä. Luulen kuitenkin, että se tarjoaa silti jonkin verran mahdollisuuksia muille t o opi siitä.
- Jos ’ olet asentanut
msysgit
ja lisännyt sen PATH: iisi (IIRC it ’ s asennusasetus), tämän ratkaisun pitäisi toimia myös Windowsissa. -
cat -n
ei ole POSIX, muttanl
on, joten se voi olla parempi vaihtoehto.
Vastaus
Hieman hakkerinen ratkaisu voi olla seuraava (kaikki, mikä on kirjoitettu väliin < ja> lisätään, kun painetaan Ctrl + v ):
:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd
Dekonstruktio
:%normal {commands}
suorittaa normaalitilan komennon jokaisella alueen määritetyllä rivillä, tässä tapauksessa jokaisella rivillä
:redir @"
ohjaa kaikki ex-komennoilla tehdyt lähdöt nimeämättömään puskuriin.
:.=
on ex-komento, joka antaa nykyisen rivin määrä (valitettavasti edellisen uuden rivin kanssa)
:redir END
lopettaa uudelleenohjauksen nimeämättömään puskuriin
I<C-R>".<Tab><Esc>
lisää nimeämättömän puskurin sisällön a: lla. ja sarkaimen jokaisen rivin eteen ja poistuu lisäystilasta.
kdd
menee yhden rivin ylöspäin ja poistaa uuden rivin, joka on seurausta:. = komento.
awk
on todennäköisesti tämän työn työkalu. Mutta minä ’ m Windowsissa (huokaan).cat
tainl
, jotka voivat tehdä numerorivejä, mutta eivät ’ ei ole yleensä saatavana Windowsissa (kuten OP ilmoittaa kommentistaanawk
). Kaksi tärkeintä ratkaisua ovat puhdas Vim. Viimeiseksi kaikki linjat vs. yksi para on vain alueen valinta. Ei selvästikään iso asia.