diff --git a/.bashrc.d/50_datum.sh b/.bashrc.d/50_datum.sh new file mode 100644 index 0000000..853b6b1 --- /dev/null +++ b/.bashrc.d/50_datum.sh @@ -0,0 +1,153 @@ +#!/bin/bash +# +# datum_tabulka.sh +# Vykresli ramecek s aktualnim datem/casem v cestine. +# +# Kompatibilita: bash 3.2+ (RHEL 5), coreutils/GNU sed jak jsou +# soucasti RHEL 5 a Debian Squeeze a novejsich. Nepouziva se zadny +# bashismus specificky pro bash 4+ (asociativni pole, ${var,,}, ...). +# +# POUZITI: +# 1) Spusteni jako samostatny skript: +# bash datum_tabulka.sh +# +# 2) "Nasourcovani" do interaktivniho shellu (napr. z ~/.bashrc), +# cimz se ziska prikaz "datum": +# echo 'source /cesta/k/datum_tabulka.sh' >> ~/.bashrc +# Po novem prihlaseni (nebo "source ~/.bashrc") pak staci +# napsat v terminalu: +# datum +# +# Pri sourcovani se nic samo nespusti - jen se definuje funkce +# "datum". Pri primem spusteni ("bash datum_tabulka.sh") se funkce +# rovnou i zavola. + +# Pomocne funkce jsou prefixovany "_datum_", aby pri sourcovani do +# interaktivniho shellu nekolidovaly se jmeny jinych funkci/prikazu. + +# Delka retezce v "znacich" (ne bajtech), nezavisla na locale: +# odstranime UTF-8 pokracovaci bajty (0x80-0xBF) a spocitame bajty, +# ktere zbyly - to odpovida poctu znaku bez ohledu na nastaveni LANG. +_datum_mb_len() { + printf '%s' "$1" | LC_ALL=C sed 's/[\x80-\xBF]//g' | LC_ALL=C wc -c | tr -d ' ' +} + +# Zopakuje znak $1 celkem $2 krat +_datum_repeat_char() { + local ch="$1" + local count="$2" + local out="" + local i=0 + while [ "$i" -lt "$count" ]; do + out="${out}${ch}" + i=$((i + 1)) + done + printf '%s' "$out" +} + +# Hlavni funkce - vypise tabulku s aktualnim datem/casem +datum() { + # --- Ceske nazvy mesicu (2. pad) a dnu v tydnu ------------------- + # index 0 je jen vycpavka, aby indexy odpovidaly cislu mesice/dne + local mesice + mesice=(x ledna února března dubna května června července srpna září října listopadu prosince) + local dny + dny=(x Pondělí Úterý Středa Čtvrtek Pátek Sobota Neděle) + + # --- Nacteni zivych dat jednim volanim date, aby byla konzistentni + # %Y rok, %m mesic, %d den, %H hodina, %M minuta, %Z zkratka pasma, + # %u den v tydnu (1=po..7=ne), %V ISO tyden, %j den v roce, %s epoch + local rok mesic den hod min pasmo dow tyden denroku epoch + set -- $(date +"%Y %m %d %H %M %Z %u %V %j %s") + rok=$1 + mesic=$2 + den=$3 + hod=$4 + min=$5 + pasmo=$6 + dow=$7 + tyden=$8 + denroku=$9 + epoch=${10} + + # --- Prevod cisel bez uvodnich nul (aby se neinterpretovaly jako 8) + local den_n mesic_n dow_n tyden_n denroku_n + den_n=$((10#$den)) + mesic_n=$((10#$mesic)) + dow_n=$((10#$dow)) + tyden_n=$((10#$tyden)) + denroku_n=$((10#$denroku)) + + # --- Kvartal -------------------------------------------------------- + local kvartal + kvartal=$(( (mesic_n - 1) / 3 + 1 )) + + # --- Obsahove radky tabulky ------------------------------------------ + local radek1 radek2 radek3 radek4 radek5 radek6 radek7 + radek1="${den_n}. ${mesice[$mesic_n]} ${rok}" + radek2="${dny[$dow_n]}, ${tyden_n}. týden" + radek3="${hod}:${min} ${pasmo}" + radek4="" + radek5="Q${kvartal}, ${denroku_n}. den v roce" + radek6="" + radek7="Unix čas: ${epoch}" + + # --- Vypocet sirky tabulky (podle nejdelsiho radku + fixni pridani) - + # Sirka je vypoctena z nejdelsiho radku a pak natrvalo rozsirena o 5 + # znaku. Protoze extra_sirka je konstanta, je vysledna sirka tabulky + # fixni napric spustenimi (meni se jen kvuli delce textu samotneho). + local extra_sirka=5 + local max=0 + local radek l + for radek in "$radek1" "$radek2" "$radek3" "$radek4" "$radek5" "$radek6" "$radek7"; do + l=$(_datum_mb_len "$radek") + if [ "$l" -gt "$max" ]; then + max=$l + fi + done + max=$((max + extra_sirka)) + + # --- Vykreslovaci funkce (lokalni pres subshell, aby nezustaly) ------ + _datum_print_border() { + local left="$1" + local right="$2" + printf '%s' "$left" + _datum_repeat_char "─" $((max + 2)) + printf '%s\n' "$right" + } + + _datum_print_line() { + local text="$1" + local len + len=$(_datum_mb_len "$text") + local pad=$((max - len)) + printf '│ %s' "$text" + _datum_repeat_char " " "$pad" + printf ' │\n' + } + + # --- Vykresleni tabulky --------------------------------------------------- + _datum_print_border "┌" "┐" + _datum_print_line "$radek1" + _datum_print_border "├" "┤" + _datum_print_line "$radek2" + _datum_print_line "$radek3" + _datum_print_line "$radek4" + _datum_print_line "$radek5" + _datum_print_line "$radek6" + _datum_print_border "├" "┤" + _datum_print_line "$radek7" + _datum_print_border "└" "┘" + + # uklid pomocnych funkci definovanych uvnitr datum(), aby se + # neplichtily do jmenneho prostoru interaktivniho shellu + unset -f _datum_print_border _datum_print_line +} + +# --- Spusteni jen pri primem volani skriptu, ne pri sourcovani ----------- +# Pokud je soubor sourcovan (napr. z ~/.bashrc), pouze se definuje +# funkce "datum" a nic se nevypisuje. Pokud je soubor spusten primo +# (bash datum_tabulka.sh), funkce se rovnou zavola. +if [ "${BASH_SOURCE[0]}" = "${0}" ]; then + datum +fi diff --git a/README.md b/README.md index 11cf465..eec7275 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,56 @@ Moje oblíbené dotfiles -Moje trošku vymazlené dotfiles pro bash. +Moje trošku vymazlené dotfiles pro bash. Kompatibilta by měla být RHEL 5/Debian Squeeze, pokud zde/ve skriptu není uvedeno jinak. * mcd - mkdir a vejdi * mman (mandpage) - Zobrazí manpage na svislé konzoli na mé mašině * cman - Smaže svislou konzoli a zapne termclock.sh na mé mašině * Proměnná PRODENV která mění barvu hostname v promptu aby odlišil smysl stroje (vyjma mé mašiny) + +## Rozšíření v .bashrc.d + +Všechny scripty v tomhle adresáři mají podmínky kde se dá nastavit zda je sourcovat nebo ne. Soubory navzdory příponě .sh nejsou míněny pro to být spustitelné. Ideální stav je nechat čitelné pro daného uživatele. + +### 10_colored_man.sh + +Default: Zapnuto + +Asi nemá cenu moc rozepisovat. Pokud se sourcuje, manuálové stránky jsou barevnější, dá se v nich lépe vyznat. Mířeno na tmavé terminály. + +### 20_emulate_pstree.sh + +Default: Zapnuto + +Záchranná berlička, pokud není nainstalován pstree, pokusí se o emulaci pstree v bashi. + +### 30_man_konsole.sh + +Default: Vypnuto + +Background story: Můj setup je se 2mi monitory, levý na práci, pravý - pivot (na svislo) a na něm se po startu KDE Plasma otevře speciálně nastavená Konsole. +Tyto bash funkce ovládají zmíněnou konzoli. + * mman udělá ctrl+c na dané konzoli a vypíše manuálovou stránku + * cman zruší manuálovou stránku, vyčistí konzoli a spustí na ni termclock.sh + +### 40_notes.sh + +Default: Zapnuto + +Jednoduché funkce které umožňují si uložit jednoduché jednořádkové poznámky. Pozdnámky se ukládají do ~/.notes a nějaké tipy pro bash jsem v souboru nechal + + * notes - vypíše poznámky + * note_add [poznamka] - přidá poznámku + * note_rm [číslo poznámky] - odstraní poznámku + +### 50_datum.sh + +Default: Zapnuto + +Jednoduchá funkce která vykreslí kalendářový list do terminálu se vším užitečným z repertoáru příkazu date + + * datum - vykreslí tabulku + +### 99_skeleton.sh.disabled + +Nejedná se o script, ale o šablonu se vším potřebným pro to mít unifikované scripty v tomhle podadresáři. Díky jiné příponě se nikdy sourcovat nebude. Prostě cp ~/.bashrc.d/99_skeleton.sh.disabled ~/.bashrc.d/98_muj_projekt.sh a jedem...