Faner eller rum for indrykning? Statistik på 3,8 mio Perl-filer, der er oprettet i 24 år

Et af de evige spørgsmål i programmering — som tegn til at bruge i programmet kode for indrykning — faner eller rum.

Nogle gange er der ikke noget valg. For eksempel, i Makefile sørg for at bruge faner. I de sprog programmering go der er en officiel nytte gofmt - kode, der formater, og dette hjælpeprogram bruger faner for indrykning. B esoterisk programmeringssprog Whitespace faner og rum kan ikke erstatte hver andre. Men mange programmeringssprog kan ikke pålægge et valg, og tillader programmøren at beslutte, hvilke tegn, der skal bruges.

Der er ganske populære opfattelse af, hvilke tegn, der skal bruges til indrykning. Den udtalelse er følgende: det betyder ikke noget, om du vil bruge vigtigst af alt konsistens. Hvis du bruger faner, du altid nødt til at bruge dem. Hvis brug mellemrum, brug kun mellemrum, og aldrig bruge faner.

Der er endnu tegneserier tegneserier tegneserier om dette emne:

(to personer helt uenige med hinanden, om at bruge faner eller rum, men er helt enig i, at det er nødvendigt at bruge kun én):

Hvordan er ting i den virkelige verden? Hvad er rent faktisk brugt?

Det er nemt nok at finde ud af. Nødt til at tage kildekoder af programmer, til at beregne hvilke tegn er brugt, og se på den resultater.

Denne artikel er resultatet af en lidt forskning om brug af faner og rum i verden af programmeringssproget Perl. Der er et stort arkiv, som gemmer Perl biblioteker CPAN. Jeg har hentet alle versioner af alle biblioteker, der er nu på CPAN (der var omkring 135 tusind) og besluttet, hvilke tegn der bruges til indrykning.

Før du læser videre, vil jeg foreslå dig et minut til at tænke og forsøge at antage, at populær for indrykning:

  • Taba
  • huller
  • eller en blanding af faner og rum

?

At skrive kode

Så udfordringen er klar. Du er nødt til at tage alle biblioteker fra CPAN og find ud af hvad bruges til led.

Først skal du nødt til at hente hele CPAN. Dette gøres med en kommando:

time /usr/bin/rsync -av --delete cpan-rsync.perl.org::CPAN /project/CPAN/

3 timer og hentede CPAN. Det tager omkring 27 GB.

CPAN er en samling af filer, der er organiseret i en bestemt struktur. Her er et uddrag:

CPAN/authors/id
├── A
│   ├── AA
│   │   ├── AADLER
│   │   │   ├── CHECKSUMS
│   │   │   ├── Games-LogicPuzzle-0.10.readme
│   │   │   ├── Games-LogicPuzzle-0.10.tar.gz
│   │   │   ├── Games-LogicPuzzle-0.12.readme
│   │   │   ├── Games-LogicPuzzle-0.12.tar.gz

I dette eksempel, AADLER er login-af forfatteren, og Games-LogicPuzzle-0.10.tar.gz og Games-LogicPuzzle-0.12.tar.gz er udgivelser.

Nu på CPAN der er mere end 7 tusindvis af forfattere, der har downloadet den biblioteker på CPAN. For ikke at gemme alle 7 tusindvis af mapper i samme mappe, tilføjet et par mere niveauer (version control system git gemmer sine data på en lignende måde).

På CPAN, kan du hente bibliotek, der er Pakket med forskellige arkiveringssystemer.

Jeg startede med, hvad tælles antallet af forskellige file extension i den mappe, CPAN/authors/id/. Her er scriptet, og resultatet af hans arbejde . Top forlængelse af arkiverne:

  • .tar.gz 135571
  • .tgz 903
  • .zip-652
  • .gz 612
  • .bz2 243

.tar.gz vinder med en margin på, at jeg besluttede, at det ville være nok til at tælle hvilke tegn der anvendes til led kun de biblioteker, der er Pakket i .tar.gz

Så jeg skrev et par scripts. I første omgang, jeg ikke var klar i hvad jeg ønsker at få data om faner og rum, så jeg besluttede at gøre et system bestående af flere komponenter. For det første, pre-proces alle 135 tusinde filer med udgivelser og sætte oplysninger om faner og rum i en database. Forventer, at det vil være lang. Og derefter at bruge data fra den database for hurtigt at få data i forskellige formater.

I sidste ende script fill_db . Dette script fyldt i data basen lidt mere end fem timer. Men disse fem klokken er, når alt er blevet fejlrettet. Ikke første gang scriptet arbejdet. Det største problem var med Unicode. Først var der det problem med udgivelsen μ-0.01.tar.gz forfatter APEIRON, så var der problemer med fil t/words_with_ß.dat fra udgivelsen Lingua-DE-ASCII-0.06 forfatter BIGJ. Men i sidste ende alle problemer var løst, og det script, der med succes har gjort det gennem alle .tar.gz udgivelser.

Scriptet er for alle .tar.gz filer i CPAN. Udpakker .tar.gz den midlertidige mappe. Finder i denne midlertidige mappe for alle de filer, hvis udvidelser .pm, .pl, .t eller .pod, læser alle led og tjekker, om indrykning mellemrum og / eller tabulatortegn. I de udgivelser, der er andre filer, men jeg besluttede at være begrænset til filer, der klart relaterer sig til Perl.

Resultatet af dette script er 2 tabeller i databasen. Her er et eksempel af data:

mysql> select * from releases limit 1;
+------------+--------+---------------------------------------------------------------+------------+
| release_id | author | file_name                                                     | timestamp  |
+------------+--------+---------------------------------------------------------------+------------+
|          1 | RUFF   | /cpan/authors/id/R/RU/RUFF/DJabberd-Authen-Dovecot-0.1.tar.gz | 1359325895 |
+------------+--------+---------------------------------------------------------------+------------+
1 row in set (0.00 sec)

mysql> select * from files where release_id = 1;
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
| file_id | release_id | file_name                                              | size | has_space_beginning | has_tab_beginning |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
|       1 |          1 | DJabberd-Authen-Dovecot/lib/DJabberd/Authen/Dovecot.pm | 2047 |                   1 |                 1 |
|       2 |          1 | DJabberd-Authen-Dovecot/t/compiles.t                   |   64 |                   0 |                 0 |
+---------+------------+--------------------------------------------------------+------+---------------------+-------------------+
2 rows in set (0.02 sec)

mysql> mysql> selec(*) from releases;
+----------+
| count(*) |
+----------+
|   135343 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from files;
+----------+
| count(*) |
+----------+
|  3828079 |
+----------+
1 row in set (5.71 sec)

Kun områder, kun faner, faner og rum, og...

Alt i databasen om hver fil i udgivelsen er der 2 flag:

  • har du brug mellemrum til at led
  • har du brug fanerne i indrykning

I henholdsvis to-flag, kan blive 4 kombinationer:

  • 11 — anvendte rum og faner
  • 10 — brug kun mellemrum
  • 01 — kun anvendes faner
  • 00 — der ikke anvendes mellemrum eller tabulatorer

De tre første muligheder er en helt forventet situation, at jeg ønskede at finde ud af, og for at finde ud af, hvad der er populært. Men den mulighed 00 — "du behøver ikke bruge hverken faner eller spaces" — det er, hvad jeg tænker men det viste sig, at dette sker. "Hvordan?" — du vil bede. Her er et eksempel.

mysql> select releases.release_id, files.file_name, files.size, has_space_beginning, has_tab_beginning from releases join files on releases.release_id = files.release_id and author = 'KOHA';
+------------+---------------------------------------------------+------+---------------------+-------------------+
| release_id | file_name                                         | size | has_space_beginning | has_tab_beginning |
+------------+---------------------------------------------------+------+---------------------+-------------------+
|     118147 | Bundle-KohaSupport-0.31/lib/Bundle/KohaSupport.pm | 2169 |                   0 |                 0 |
|     118147 | Bundle-KohaSupport-0.31/t/Bundle-KohaSupport.t    |  487 |                   0 |                 0 |
|     118147 | Bundle-KohaSupport-0.31/t/pod.t                   |  130 |                   0 |                 0 |
+------------+---------------------------------------------------+------+---------------------+-------------------+
3 rows in set (0.05 sec)

Forfatteren KOHA har en frigivelse Bundle-KohaSupport-0.31. I denne udgave er der 3 filer, som har extensions på listen .pm, .pl, .t eller .pod. Om alle disse filer i databasen skrevet i deres led, men intet mellemrum, ingen faner. Hvordan kan det være?

Det viser sig, at alle elementære. Hvis du ser på disse filer, skal de blot der er ingen indrykning. For eksempel indholdet af filen t/Bundle-KohaSupport.t:

# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Bundle-KohaSupport.t'

#########################

# change 'tests => 1' to 'tests => last_test_to_print';

use Test::More tests => 1;
BEGIN { use_ok('Bundle::KohaSupport') };

#########################

# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.

Så i tillæg til de tre uventede situationer:

  • brug kun mellemrum
  • der anvendes kun faner
  • er brugt, og rum, og faner

også er den situation:

  • brug ikke mellemrum og ikke bruge faner

Data forfattere

Efter jeg har behandlet data i databasen, besluttede jeg mig til at se fra hver forfatter, han bruger for polstring.

Jeg forventer, at de mest populære vil være brug kun mellemrum, det andet sted efter popularitet vil være kun ved brug af faner, og det tredje i popularitet, er den samtidige brug af faner og rum.

Men det viste sig, at jeg var helt forkert.

Jeg skrev manuskriptet . Dette script tjekket hvilke karakterer, der er anvendt af forfatterne til alle filer .pm, .pl, .t, .pod, der er i alle deres udgivelser, som er nu på CPAN.

Her er hvad der skete:

$ cat app/data/users.log | perl -nalE 'say if /^##/'
## 00 (nothing) - 50 (0.7%)
## 01 (only tabs) - 51 (0.7%)
## 10 (only spaces) - 1543 (21.9%)
## 11 (both) - 5410 (76.7%)

Data er absolut ikke sådan, som jeg havde forventet!

  • Mere end 75% af forfatterne bruger en blanding af mellemrum og tabulatorer til indrykning.
  • Kun rum i andet sted, lidt mere end 20%,
  • og de forfattere, der bruger kun faner mindre end procent.
  • Antallet af forfattere, der ikke bruger polstring er næsten det samme som antallet af forfattere, der bruger kun faner.

Komplet liste over alle forfattere i fordelingen af Pro hold, der er i filen på GitHub .

Men jupyter notebook  ved at der blev bygget cirkeldiagrammet.

Men disse data er genereret i alle udgivelser, som nu er på CPAN. Disse udgivelser blev skabt i løbet af de sidste 24 år. Kan være med tid forholdet på en eller anden måde at ændre?

Tid

Hver fil udgivelse på CPAN, modifikation tid er det tidspunkt, hvor denne udgivelse blev uploadet til CPAN. Disse data er lagt i databasen. Nu er den gamle CPAN udgivelse er Ioctl-0.5 — den blev uploadet til CPAN 1995-08-20:

mysql> select author, file_name, from_unixtime(timestamp) from releases where timestamp = (select min(timestamp) from releases);
+--------+----------------------------------------------+--------------------------+
| author | file_name                                    | from_unixtime(timestamp) |
+--------+----------------------------------------------+--------------------------+
| KJALB  | /cpan/authors/id/K/KJ/KJALB/Ioctl-0.5.tar.gz | 1995-08-20 07:26:09      |
+--------+----------------------------------------------+--------------------------+
1 row in set (0.08 sec)

Og denne dag var fyldt fra 8 udgivelser:

mysql> select * from releases where from_unixtime(timestamp) < '1995-08-21' order by timestamp;
+------------+--------+--------------------------------------------------------------+-----------+
| release_id | author | file_name                                                    | timestamp |
+------------+--------+--------------------------------------------------------------+-----------+
|     112505 | KJALB  | /cpan/authors/id/K/KJ/KJALB/Ioctl-0.5.tar.gz                 | 808903569 |
|      23026 | TYEMQ  | /cpan/authors/id/T/TY/TYEMQ/FileKGlob.tar.gz                 | 808903636 |
|     134031 | WPS    | /cpan/authors/id/W/WP/WPS/Curses-a8.tar.gz                   | 808903647 |
|     112546 | KJALB  | /cpan/authors/id/K/KJ/KJALB/Term-Info-1.0.tar.gz             | 808903748 |
|      70278 | MICB   | /cpan/authors/id/M/MI/MICB/TclTk-b1.tar.gz                   | 808910379 |
|      70274 | MICB   | /cpan/authors/id/M/MI/MICB/Tcl-b1.tar.gz                     | 808910514 |
|      19408 | GBOSS  | /cpan/authors/id/G/GB/GBOSS/perl_archie.1.5.tar.gz           | 808930091 |
|      81551 | JKAST  | /cpan/authors/id/J/JK/JKAST/StatisticsDescriptive-1.1.tar.gz | 808950837 |
+------------+--------+--------------------------------------------------------------+-----------+
8 rows in set (0.06 sec)

Jeg besluttede at se, hvordan fordelingen af brugen af forskellige tegn for indrykning på det tidspunkt. For det jeg skrev manuskriptet .

Her er et uddrag af data, filer, der er oprettet scriptet:

$ cat app/data/releases_date.csv | head
date,00,01,10,11
1995-08-20,0,1,0,7
1995-08-21,0,0,0,0
1995-08-22,0,0,0,0
1995-08-23,0,0,0,0
1995-08-24,0,0,0,1
1995-08-25,0,0,0,0
1995-08-26,0,0,0,0
1995-08-27,0,0,0,0
1995-08-28,0,0,0,0

Dvs for hver dato, begyndende med 1995-08-20 indeholder oplysninger om, hvor meget der er udgivelser fra det faktum, hvilke tegn blev brugt til indrykning.

  • 00 — i den fordybning, ingen mellemrum, no tabs
  • 01 — i indrykning bruges kun faner
  • 10 — led brug kun mellemrum
  • 11 — i Atsuta anvendes faner og rum

Så jeg skrev jupyter notebook  der trak grafen. På det diagram jeg har vist det absolutte antal af udgivelser af type indrykning, og den procentdel af det samlede antal udgivelser på denne dag:

Grafen viser, at næsten 9 tusind dage. Det er tydeligt, at der er en tendens, men grafen er støjende, og det er slemt, kan du se alt. Fordi i stedet for de dage, jeg var grupperet udgivelser i måneder.:

Men der er en overraskende tendens. Antallet af udgivelser, som kun bruger faner eller ingen led stort set uændret, men andelen af udgivelser, som brug kun mellemrum i konstant vækst, og denne vækst skyldes, at andelen af udgivelser, som bruger en blanding af faner og rum.

Hvorfor er "kun spaces". Hypotese nummer 1

Jeg kiggede på data, og jeg havde en hypotese om, hvorfor en reduktion i antallet af udgivelser som bruger og problemer faner. Min tanke om Perl-bibliotek Modul::Install . Hvis, når du skriver din bibliotek brug Modul::Installere, CPAN udgivelse i prisen-filer fra dette bibliotek. Og i disse filer, som bruger en blanding af mellemrum og tabulatortegn. Her er et eksempel fil fra et Modul::Install-udgivelse Devel-PeekPoke-0.04:

mysql> select * from files where release_id = 284 and file_name like '%inc/Module/Install%';
+---------+------------+----------------------------------------------------+-------+---------------------+-------------------+
| file_id | release_id | file_name                                          | size  | has_space_beginning | has_tab_beginning |
+---------+------------+----------------------------------------------------+-------+---------------------+-------------------+
|   10328 |        284 | Devel-PeekPoke-0.04/inc/Module/Install.pm          | 12381 |                   1 |                 1 |
|   10329 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Metadata.pm | 18111 |                   1 |                 1 |
|   10330 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Fetch.pm    |  2455 |                   1 |                 1 |
|   10331 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Makefile.pm | 12063 |                   1 |                 1 |
|   10332 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Base.pm     |  1127 |                   0 |                 1 |
|   10333 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/WriteAll.pm |  1278 |                   0 |                 1 |
|   10334 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Win32.pm    |  1795 |                   1 |                 1 |
|   10335 |        284 | Devel-PeekPoke-0.04/inc/Module/Install/Can.pm      |  3183 |                   1 |                 1 |
+---------+------------+----------------------------------------------------+-------+---------------------+-------------------+
8 rows in set (0.03 sec)

Min hypotese er, at udviklere brug mellemrum til indrykning, men på grund af det faktum, at i udgivelsen på Modul::Install, der er registreret i statistikken, og rum, og faner. Modul::Install stål mindre til brug (som der var alle mulige Dist::Zilla, Dist::Milla, Minilla), og derfor Modul::Install stoppet, giver forvrængning.

Denne hypotese har behov for at blive tjekket. Først besluttede jeg mig for at se, om Modul::Install bliver brugt mindre og mindre. Jeg har bygget en tidsplan. Hvert punkt er antallet af udgivelser for den måned, i hvilken anvendte Modul::Install. Du kan se, at den del af hypotesen er korrekt — faktisk Modul::Install stål brug mindre.

Men om brugen af Modulet::Install påvirker udnyttelsen af mellemrum eller tabulatorer og rum til led. For at finde ud af, jeg trak to grafik. Er det antallet af forskellige typer af polstring udgivelser måneder. Det første diagram kun udgivelser, der bruger Modul::Install, på den anden søkortet udgivelser, som ikke er i brug.

Her kan du se, at ja, hvis du bruger et bibliotek Modul::Install, oftest biblioteket er anvendt det er en blanding af faner og rum.

Og her er et diagram, som viser kun de udgivelser, som ikke bruger Modul::Install. Hvis du sammenligner denne tidsplan med den tidsplan, der gælder for alle udgivelser, så der er en forskel, men intet ændrer sig.

Det viser sig, at hypotesen er forkert. Hvis udgivelsen bruger Modul::Install, så udgivelsen ofte falder ind i gruppen "faner og rum", men hvis du ikke tager højde for alle udgivelser, som bruger Modulet::Install, du stadig har en tendens andelen af udgivelser, som kun bruger faner, som indrykning øger på bekostning af andelen af udgivelser, som er brugt en blanding af faner og rum.

Hvorfor er "kun spaces". Hypotese nummer 2

Hvorfor er alle de samme, et stigende antal af udgivelser, som kun bruger faner? Der kan være nogle overskydende en aktiv forfatter, der producerer mange udgivelser, og den forfatter, der har effekt på alle de statistikker?

Jeg har prøvet at tjekke det ud. Trak en graf, som viser den andel af de udgivelser, hvor brug kun mellemrum, men først ved brev af forfatterens navn. Hvis ja nogle forfatteren, der er foretaget over et stort bidrag til den samlede statistikker, at linjen med meget skarpt gik op. På kortet så jeg, at alle linjer er plus eller minus selv. Så bekræfte denne hypotese, jeg ikke var i stand til at få.

Hvorfor er "kun spaces". Hypotese nummer 3

Graferne viser, at over tid bliver mere og mere udgivelser, som er kun rum for indrykning. Og denne andel er stigende på bekostning af de udgivelser, som er en blanding af rum-og faner.

Min første antagelse var, at dette sker på grund af det faktum, at i frigiver før aktivt i prisen kode biblioteker Modul::Install, hvor der anvendes en blanding af rum og faner, dette bibliotek brug mindre, og derfor er andelen af udgivelser, som bruger en blanding af faner og huller reduceret. Var, at en del af sandhed i dette, men selv hvis vi fjerner fra gennemgå alle udgivelser, som bruger Modulet::Install, er den overordnede tendens ændrer ikke ved — stadig, den andel af de udgivelser, hvor kun de huller, der vokser på bekostning af andelen af udgivelser, som bruger en blanding af mellemrum og tabulatortegn.

Min anden antagelse er, at de har indflydelse på de statistikker, der viser en meget lille sæt af meget aktive forfattere. Jeg kunne ikke finde bekræftelse af denne hypotese.

Min tredje hypotese er, at forfatterne synes mere bekvemt teksteditorer og IDE, der er nemmere at bruge fedt eneste rum, ikke en blanding af mellemrum og tabulatortegn. Men, desværre, idéer hvordan til at teste denne hypotese, jeg har. Data, der ligger på CPAN der er ingen oplysninger om, hvad redaktøren blev brugt til at skabe denne udgivelse. Jeg kiggede på udgivelsen datoer for populære redaktører/IDE:

  • Emacs — 1985
  • vim — 1991
  • IntelliJ IDEA — januaray 2001
  • Eclipse — November 2001
  • Sublime Text — januar 2008
  • Atom — februar 2014
  • VS Code — April 2015

Data for 2019

På den tidligere graf, der viser, at over tid bliver mere og mere udgivelser, som er rum og ikke blande faner med mellemrum. Så jeg besluttede at se på fordelingen af, hvilke typer af marginer bruges af forfattere kun på grund af deres udgivelser i 2019.

Data fra resultatet af at køre scriptet :

$ cat app/data/users_2019.log | perl -nalE 'say if /^##/'
## 00 (nothing) - 12 (1.4%)
## 01 (only tabs) - 9 (1.0%)
## 10 (only spaces) - 355 (41.2%)
## 11 (both) - 486 (56.4%)

Hvis vi sammenligner data for 2019 og give data for alle år, ser vi, at den procentdel af forfatterne, der kun bruger faner, der ikke ændrer sig, men andelen af forfattere, der bruger kun rum er steget voldsomt.

Kilden til dette lagkagediagram:

Faktorer, der påvirker validiteten af de data,

For dannelsen af tal og grafer, blev alle anvendt .tar.gz udgivelser der var på CPAN på tidspunktet for dette skrives, i tillæg til udgivelser programmeringssproget Perl.

CPAN giver dig mulighed for at slette de udgivelser i de data, der vises i denne artikel remote udgivelser ikke deltage. Det er uklart, hvor meget vil ændre sig, hvis data overvej tegn af polstring, som allerede er fjernet udgivelser. Det er muligt, at de data, der vil ændre meget. Der er et arkiv backpan  , som gemmer alle de udgivelser, hvem har nogensinde været på CPAN. Så i teorien er der en mulighed for at konvertere alle tallene er baseret på udgivelser, som ikke er på CPAN.

Det andet punkt, som påvirker nøjagtigheden af data er noget, der blev taget hensyn til symboler indrykning kun udgivelser, der var Pakket ind .tar.gz arkivet. Andre typer arkiverne blev ikke brugt. Langt størstedelen af de udgivelser, der er .tar.gz så det gjorde en sådan antagelse. Hvis det tæller data for alle arkiver data vil helt sikkert ændre sig. Antage, at ændringen vil være mere end et par procent.

Kildekoden

Hele sæt af scripts, der blev anvendt til at indsamle data, data i sig selv og jupyter bærbare er alle tilgængelige i arkivet på GitHub.

Koden, der er skrevet, — det er bare meget langt fra perfekt. Alt, hvad der var skrevet skrevet med idéer så hurtigt som muligt for at få resultatet, for ikke at skabe perfekt kode.

Oversigt

På det tidspunkt dette skrives, den samling af Perl CPAN biblioteker, der var omkring 135 tusind udgivelser. Den første udgave blev lavet for 24 år siden (1995-08-20). I disse udgaver er næsten 4 millioner filer udvidelser .pm, .pl, .t eller .pod.

Hvis vi betragter data for al den tid, det viser sig, at 76.7%% af forfatterne i tilknytning bruge en blanding af rum og faner, 21.9%, der anvendes i indrykning, kun rum, og 0,7% — kun faner.

Men hvis vi betragter kun data for 2019, bliver det mere og mere forfattere, der bruger kun rum for indrykning, men stadig de fleste bruger en blanding af faner og rum (56.4% — bruger faner og rum,rum 41.2% — kun huller, 1.0% — kun faner).

Og hvis du ser på grafen for den procentvise ændring i brug af forskellige typer af led, kan du se, at den andel af brug kun mellemrum er stigende, og denne andel er stigende på bekostning af andelen af dem, der bruger en blanding af faner og rum til indrykning.

Det vides ikke, hvorfor denne andel er stigende. Det er muligt, at dette skyldes det faktum, at forfattere bruge en mere praktisk tekst editorer, der gør det nemmere og sikrere at installere som tegn til brug for indrykning.

Andre artikler