Что ж... Начну с откашливаний - я не писака (в хорошем смысле этого слова, писать "на поток" это надо уметь), хоть и немного писатель. И даже не очень уверен в том что я хочу вам сегодня поведать.
Но моей Прокрастинации нет границ, так что пристёгивайте ремни, это будет ухабистая поездка!
Вступление
Началось всё с комментария моего хорошего знакомого @Oxyd, который меня заинтересовал.
Я уже успел безответно подискутировать с ним на тему русского в программировании и просто не мог пропустить такой шанс. Да и интересно стало)
Поэтому появился первый сферический прототип в вакууме:
Из $1 выбрать
Демон) запустить $скрипт/демон.об;;
Аминь) запустить $скрипт/демон.об очистка;;
Готово
Если [ $2 ]; тогда
вывести "| $ном_проц | $путь_окр |"
илсе
# Местная подсветка синтаксиса совершенно не понимает что творится :D
Это было забавно и интересно, но как-то... синтетически, что ли.
Поэтому я остался недоволен и, вспомнив что в моём любимом баше есть alias-ы (синонимы для команд), решил переписать целый скрипт на русский bash.
Русифицированный bash
Мой выбор пал на другой шуточный проект, window slicer. Он был вдохновлён не менее шуточным проектом с reddit, предназначенным для другого оконного менеджера.
Вкратце, этот скрипт разделяет окно надвое на основе координат курсора и заданного направления. Если привязать его к любому демону "мышиных" жестов, то можно сыграть в забавный аналог известной игры Fruct Ninja, только с окнами вместо фруктов)
Несколько тестов в оболочке спустя я был готов к переписыванию, только уже на zsh - аналог bash. Почему, спрашивается, ведь в названии статьи указан баш?
Ответ прост - bash не понимает переменных на кириллице. Увы.
Но разница между ними не заметна для нашей темы, поэтому будем считать что мы просто работаем с оболочкой.
Всё равно слово "баш" время от времени используют для её обозначения.
И вот что получилось:
#! /bin/zsh
# Магия, не подглядывай!
ТЕРМИНАЛ=$TERM
alias если="if" тогда="then" илсе="fi" из="case" выбрать="in" готово="done" вывод="echo" оценить="eval" пока="until" делаем="do" спим="sleep" иначе="else" иначе_если="elif"
# Сама программа
# Объявляем переменные
X=0
Y=0
x_окна=0
y_окна=0
ширину_окна=2
высоту_окна=2
приложение=$ТЕРМИНАЛ
# Количество окон до старта. Костыль ?\_(?)_/?
кол_окон=$(i3-msg -t get_tree | jq -r '.. | .nodes?[]? | select(.window_type == "normal") | .name' | wc -l)
# Получаем координаты курсора
оценить $(xdotool getmouselocation --shell)
# Получаем параметры окна от i3wm
оценить $( i3-msg -t get_tree | jq -r '..|try select(.focused == true)| "x_окна=\(.rect.x)\ny_окна=\(.rect.y)\nширину_окна=\(.rect.width)\nвысоту_окна=\(.rect.height)\nприложение=\(.window_properties.instance)"' )
ждём(){
пока [ $кол_окон -lt $нов_кол_окон ];
делаем
нов_кол_окон=$(i3-msg -t get_tree | jq -r '.. | .nodes?[]? | select(.window_type == "normal") | .name' | wc -l)
спим 0.1
готово
}
рубим(){
разница=$(( $1 / 2 - ($2 - $3) )) # количество пикселей от от центра окна до места "рубки"
i3-msg split "$5" && $приложение & disown && ждём
# Подтягиваем новое окно до нужного размера
если [ $разница -gt 0 ]; тогда
i3-msg resize grow "$4" "$разница"
иначе
разница=$(( разница * - 1 ))
i3-msg resize shrink "$4" "$разница"
илсе
}
если [ "$1" = "гор" ]; тогда рубим $высоту_окна $Y $y_окна height v
иначе_если [ "$1" = "вер" ]; тогда рубим $ширину_окна $X $x_окна width h
илсе
Для удобства и домашнего насилия изучения есть ссылка на gist. Там же лежит оригинал этого скрипта.
Анализ
Честно говоря, я отделался лёгким испугом. Оказывается русских переменных и 13 алиасов с головой достаточно для полной трансформации кода. Я был готов расписать весь скрипт чуть ли не побуквенно, но, после очередного прочтения и добавления пары комментариев, это оказалось просто не нужно.
Небольшой хитростью было оставить все обращения к "внешним" программам нетронутыми, однако это можно назвать вынужденной мерой — реализация полного перевода явно выходит за рамки проекта just for fun. Так же пришлось притянуть за уши слово "оценить", потому как в русском нет красивого слова со значением "одарить/придать/задать/дать значение/цену" — аналога evaluate.
Тем не менее результат уже на лицо и любой не знающий английского IT-шник (есть такие, интересно?) мгновенно поймёт функцию скрипта и даже его структуру, с поправкой на неведомый механизм добычи переменных (комментарии помогут).
Искать ошибки проще, делиться тоже, казалось бы, всё прекрасно, но не тут то было!
Писать этот код было ужасно неудобно. Вот совсем. Отчасти в этом виноват мой editor-of-choise, vim, который не дружит с русской раскладкой для хоткеев. Но даже если убрать его из уравнения, в русской раскладке просто нету нужных символов!
Все необычные скобки, доллар, амперсанд и ещё некоторое количество забытого приходилось писать на английской раскладке. А уж ошибок из-за привычек привязанных к раскладкам просто не счесть. (как примеры — написание точек, запятых и кавычек)
Можно ли считать это большой проблемой? По-хорошему да. У нас нету нужных клавиатур, нету нужных символов под рукой, нету нужных привычек...
Но этот вопрос я оставлю для статьи с которой всё это началось, О русском языке в программировании.
Моё мнение
Это действительно удобно для понимания кода. Можно советовать новичкам, а то и вовсе написать транслятор, который будет выводить привычный код в "читабельном" виде. Наверняка пригодится на совещаниях о логике работы.
Писать это неудобно. Может разработкой языка заточенного под русскую раскладку и решатся некоторые проблемы, но таких маловато. (и я не пробовал)
Так же возможно поможет IDE, но это надо проверять.Лично я этим пользоваться не буду. Я свободно владею английским и потому в моей голове происходит ровно то же проговаривание, при чём без перевода. А вот людям не знающим английского свободно советую хотя бы попробовать.
И в общем-то на этом всё. Не так страшен чёрт как его рисуют.
Концовка получилась скомканной, у меня в планах были ещё абзаца 4 растекания мыслею по древу, но как-нибудь в другой раз. Оставлю только сухую выжимку: на чужое заглядевшись про своё не забудь. Хоть русский язык в IT затерялся, он ни разу не запрещён и даже полезен, поэтому попробуйте сами, прежде чем ввязываться в спор.
aamonster
Почему вы выбрали именно русский, а не синдарин, например?