Русификация баша

Чтож… Начну с откашливаний – я не писака ( в хорошем смысле этого слова, писать ” на поток” это надо уметь), хоть и немного писатель. И даже не очень уверен в том, что я хочу вам сегодня поведать.
Но моей Прокрастинации нет границ, так что пристёгивайте ремни, это будет ухабистая поездка!)

Вступление

Началось всё с комментария моего хорошего знакомого @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, который не дружит с русской раскладкой для хоткеев. Но даже если убрать его из уравнения, в русской раскладке просто нету нужных символов!
Все необычные скобки, доллар, амперсант и всё что я не вспомнил приходилось писать на английской расскладке. А уж ошибок из-за привычек привязанных к раскладками ( как примеры написание точек, запятых и кавычек) просто не счесть.

Можно ли считать это большой проблемой? По хорошему да. У нас нету нужных клавиатур, нету нужных символов под рукой, нету нужных привычек…
Но этот вопрос я оставлю для статьи с которой всё это началось, О русском языке в програмировании.

Моё мнение

  1. Это действительно удобно для понимания кода. Можно советовать новичкам, а то и вовсе написать транслятор, который будет выводить привычный код в “читабельном” виде. Наверняка пригодится на обсуждениях логики работы.

  2. Писать это неудобно. Может разработкой языка заточеного под русскую раскладку и решаться некоторые проблемы, но таких маловато. ( и я не пробовал )
    Так же возможно поможет IDE, но это надо проверять.

  3. Лично я этим пользоваться не буду. Я свободно владею английским и потому в моей голове происходит ровно то же проговаривание, при чём без перевода. А вот людям не знающим английского свободно посоветую хотя бы попробовать.

И в общем-то на этом всё. Не так страшен чёрт как его рисуют)

Концовка получилась скомканной, у меня в планах были ещё абзаца 4 растекания мыслею по древу, но оно оказалось просто не нужным. Оставлю только сухую выжимку: на чужое заглядевшись про своё не забудь. И хоть русский язык в IT затерялся, он ни разу не запрещён и даже полезен, поэтому попробуйте сами, прежде чем ввязываться в спор.

Let’s block ads! (Why?)

Read More

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *