Proč se zbavovat nadbytečných bílých znaků?

Od Petr Zemek, 2011-09-09

Minule jsem zmínil, že při commitování do systémů pro správu revizí bychom se měli vyvarovat nadbytečných bílých znaků na koncích řádků. Kolega mě požádal, zda bych to mohl více rozvést, a já tak v následujícím příspěvku učiním :).

O co se jedná?

Při programování se běžně stává, že vám na konci řádku zůstanou nadbytečné mezery (či tabelátory). Připravíte mezeru, za kterou chcete doplnit komentář, ale pak se rozhodnete, že jej dáte o řádek výše. Na onu mezeru ale zapomenete, protože je běžně neviditelná. Podobné situace se opakují, až dojdete do situace, kdy máte v souboru třeba padesát nadbytečných bílých znaků. Ten následně commitnete do systému pro správu revizí.

A co je na tom jako špatně?

V tomto přístupu vidím dva problémy:

  • Nadbytečné bílé znaky způsobují problémy při merge. Pokud dva lidi upraví stejný kousek kódu, kdy jeden pouze změní množství bílých znaků, tak některé systémy se s tím nevypořádají a ohlásí vám konflikt. Bez zbytečných bílých znaků se toto riziko snižuje.
  • Do systému se ukládají zbytečnosti. Ve většině případů (výjimky zmíním dále) nemají bílé znaky na koncích řádků žádný význam a zůstaly tam pouze z nepořádnosti programátora. Některé aplikace, které zobrazují rozdíly mezi revizemi (diffy), se s bílými znaky sice umí vypořádat, ale proč je tam vůbec commitovat? V opačném případě, pokud to daná aplikace neumí, akorát zatěžují programátora zbytečnostmi.

A jak to tedy vyřeším?

Záleží na tom, co používáte za editor. Zkuste si do googlu zadat "$editor remove trailing whitespace" a uvidíte, zda vám to něco najde. Automatické odstraňování přebytečných bílých znaků lze určitě snadno nastavit v editorech Kate, Vim a GNU Emacs. Já například ve Vimu mám v konfiguraci následující tzv. autocommand, který se spouští při zadané akci.

au BufWritePre * :call setline(1,map(getline(1,"$"),'substitute(v:val,"\\s\\+$","","")'))

Při uložení souboru mi to z něj odstraní přebytečné bílé znaky. Zde lze ovšem narazit na jeden problém, a to je, pokud ony bílé znaky v souboru opravdu mají smysl. Jako humorný příklad mohu zmínit např. jazyk jazyk whitespace. Z dalších příkladů jsou to potom konfigurační soubory, které mohou obsahovat nastavení podobná tomuto:

commentPrefix = \

(Za lomítkem by měla být mezera, ale Drupal ji odstraňuje, takže ji tam nehledejte.) Znamená to, že se má před každý komentář vložit mezera. Ono lomítko tam ani nemusí být, záleží na aplikaci. Pokud na tento konfigurační soubor spustíte automatické odstranění bílých znaků, tak můžete narazit na problém. Takže buď si vytvořte složitější příkaz na odstranění přebytečných bílých znaků (např. odstraňování bílých znaků jen z určitého typu souboru), nebo použijte jeden z následujících postupů.

Druhým řešením je si v editoru nastavit, aby se vám přebytečné bílé znaky zvýrazňovaly. Výhodu to má tu, že máte vše více pod kontrolou. Nevýhodou je, že se musíte bílých znaků zbavovat ručně, což může být někdy otrava. Volba je na vás.

Třetím možným řešením je manuální použití externích nástrojů, např. sed. Pokud to váš systém pro správu revizí zvládne, lze si nastavit automatické odstranění přebytečných bílých znaků před každým commitem (návod pro Git).

Závěrečný doušek slov

Tento problém patří spíše do přihrádky "otravuje to život". Pokud se jej rozhodnete řešit a stále neumíte programovat, lepším programátorem se nestanete. Pokud jej ale řešit budete, vězte, že mnoha lidem (včetně mě) tím zmírníte bolesti hlavy ;). A samozřejmě nesmím zapomenout dodat, že všeho občas škodí, viz onen problém s Drupalem :).

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
4 + 0 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.