keyboard porno

a freak like me
just needs infinity

знадобився рік часу, дві механічних клавіатури, один кастомізований набір клавіш і відео на youtube, щоби зрозуміти, що мені потрібно:
рано чи пізно…

мудрував-мудрував, та не вимудрував: зрозуміло, що перевірка коду завершення попередньої команди має бути першою операцією під час формування промпту… тому значно простіше кодувати кольором перший елемент (номер команди в історії), аніж останній (власне запрошення $).

заміну домашньої теки на ~ також подужав, а от «розумне» скорочення шляху сегментами зробити, звісно, можна, — але з такими «вивертами», що результат не вартий тих зусиль і захаращеного .bashrc.

отже, фінальна версія запрошення:
  • показує номер команди в історії — червоним, якщо попередня команда завершилася з помилкою;
  • виділяє root'а кольором;
  • скорочує шлях до поточної директорії, якщо довший за 30 символів, попередньо заміняючи домашню теку на ~;
  • показує кількість фонових процесів, якщо є.
на цьому й зупинюся. анімований зняток ілюструє, як все виглядає. код на pastebin:

на продовження оповідки про кастомізацію запрошення bash yarema запитав, чи подужаю я змайструвати запрошення, котре автоматично скорочуватиме надміру довгі шляхи до поточної директорії. я взявся спробувати — і за кілька хвилин накидав досить примітивний варіант, котрий, тим не менш, працює.

ось код для .bashrc на pastebin (див. наприкінці допису). додати довелося лише ось цей фрагмент:

$(if [[ ${#PWD} -gt 30 ]]; then echo "${PWD:0:14}..${PWD:(-14)}"; else echo "${PWD}"; fi)

працює справді примітивно: якщо довжина шляху (${#PWD}) більша за 30 символів — беремо 14 символів від початку (${PWD:0:14}) та стільки ж від кінця (${PWD:(-14)}), додавши між ними дві крапки. і жодного виклику sed, — самі лише вбудовані функції bash.

результат на анімованому знятку. мені сподобалося, залишив і собі.

чому примітивно?
по-перше, замість шляху до домашньої теки користувача не підставляється ~, та й замість простого «вирізання» середини варто було б зробити розумну заміну внутрішніх сегментів адреси:

~/Dropbox/../write

але то вже буде задачка на інший раз.

p.s. …і, звісно ж, кольорове кодування $ залежно від коду завершення — поламалося. зараз міркуватиму, як поремонтувати.

трохи поекспериментував з кастомізацією запрошення в командній оболонці (bash prompt): додавав смайлики і навіть котиків, фарбував різні частини в усі кольори веселки тощо…

награвся і повернувся до стандартного, — не зовсім, але майже:
  • додав номер команди в історії;
  • додав кольорове кодування запрошення для root'а;
  • додав кольорове кодування залежно від коду завершення попередньої команди;
  • додав індикатор кількості фонових процесів.
результат на знятку. в .bashrc таке:

export PS1='\[\e[2;37m\]\! \[\e[1;32m\]\u@\H\[\e[0m\] \w $(if [[ $? != 0 ]]; then echo "\[\e[31m\]"; fi)$([ \j -gt 0 ] && echo "\[\e[2;37m\][\j]\[\e[0m\] ")\$\[\e[0m\] '

виглядає трохи складно. але якщо врахувати, що всі фрагменти «\[\e[2;37m\]» — то лише кодування кольорів тексту, залишається основа, яка теж працюватиме:

export PS1='\! \u@\H \w $(if [[ $? != 0 ]]; then echo "(Error)"; fi)$([ \j -gt 0 ] && echo "[\j] ")\$ '

її нескладно розібрати на елементи:
  • \! — номер команди в історії (див. history);
  • \u — ім'я користувача;
  • \H — ім'я машини (повністю);
  • \w — поточна директорія (повністю);
  • $(if [[ $? != 0 ]]; then echo "(Error)"; fi) — перевірка коду завершення ($?) попередньої команди;
  • $([ \j -gt 0 ] && echo "[\j] ") — перевірка (так, в bash можна без if), чи є фонові процеси (\j);
  • \$ — запрошення ($, або ж # для root'а)
налаштував і тішуся.

простий таймер для терміналу

знайшов малесенський, практично однорядковий скрипт на форумах arch linux. переробив на сповіщення замість вікна zenity (не люблю модальних вікон), і додав звук — маю простенький таймер для терміналу:

reminder () {
  delay=$1
  shift
  (sleep $delay ; (speaker-test -t sine -f 500)& pid=$! ; sleep 0.1s ; kill -9 $pid ; notify-send "Reminder" "$*\n($(date +'%Y-%m-%d, %H:%M'))" --expire-time 0) > /dev/null &
}

найпростіше використання — додати до .bashrc (і source .bashrc, щоби можна було одразу скористатися), а тоді в терміналі:

reminder 10m "Почни вже той курс WikiMook, холєра тебе забирай!"

за 10 хвилин вигулькне нагадування (якщо встановлено libnotify) як на знятку. формат затримки — як для sleep (див. текст): 30s (секунди), 10m (хвилини), 1h (дні).

для чого? мені часто випадає «вхопити» 5-10 хвилин з ноутбуком, а тоді зняти макарони з плити, вимкнути кавоварку (там, вона в нас не автоматична), бігти стрічати доню біля під'їзду тощо, — набрати рядочок в терміналі простіше, ніж весь час зиркати на годинник, і все одно пропустити потрібний час.

p.s. і курс wikimook, так…

overtype: симулятор друкарської машинки

навколо виростає покоління, котре друкарську машинку вже хіба що в кіно бачило, — а так, щоби відчути пальцями, якою була робота машиністки, то й говорити нема про що…

…для вас, молодь, добрі люди створили overtype — онлайновий симулятор друкарської машинки:


більш чи менш достовірно відтворено звук, навігацію по сторінці, неможливість друкувати з малими затримками, залипання клавіш, висихання друкарської стрічки, виправлення хибодруків за допомогою корекційної стрічки… може, щось забув.

звісно, є один важливий нюанс, який неможливо передати навіть за допомогою механічної клавіатури з відносно жорсткими перемикачами — інертність молоточків та силу, необхідну для натискання клавіші. машиністки мали отакенні накачані пальці!

практичної користі проект не має (окрім можливості розрукувати сторінку), бо необхідних для тренажера фукнцій не має (користуйтеся klava.org), але спробувати цікаво.