- PVSM.RU - https://www.pvsm.ru -

Наверно Вы уже читали мою вступительную статью про Mahou [1], в ней я описал как я создал первую функцию и описал в общих чертах что делает программа. С тех пор прошло не мало времени в Mahou много чего изменилось и добавилось, собственно об этом и будет речь в этой статье.
Сильно изменился интерфейс, в лучшую сторону, все стало удобно и видно, вот так выглядел Mahou раньше:

А теперь он выглядит вот так:

Функция "Подсказка текущей раскладки возле текстового курсора(каретки)" получила возможность отображения в Sublime Text 3, используя плагин [2] который я написал специально для этого.
Все началось с того что я искал возможность взятия позиции на которой находится сейчас текстовый курсор, искал способ и нашел на форумах Sublime Text -> view.rowcol(view.sel()[0].begin()) которая возвращала линию и количество букв на котором сейчас текстовый курсор, это было то что нужно. Потом я подумал "А как передать эти данные в Mahou из Sublime Text?", и вспомнил о socket'ах(знал я о них совсем чуть-чуть) и решил писать сервер который будет работать на 127.0.0.1(localhost) и порте 7777, сначала ничего не работало, потом я почитал пару статей про socket'ы и начал понимать как они работают. Потом я начал читать Sublime Text 3 API [3], далее начал создавать плагин:
Сначала инициализировал сервер в который будут выдаваться данные, потом создал EvenListener с слушанием на события:
Потом начал искать способ получить координаты X, Y позиции каретки, из ST3API я узнал что можно получить высоту строки и ширину текста, если их умножить на линии и количество букв то можно получить нужные координаты. Но была одна проблема — символ табуляции считался за 1 символ, так что я решил что нужно подсчитать количество Tab'ов в линии и умножить их на 3 и добавить к количеству букв — и оно работало!
Потом я добавил определение ширины боковой панели, но все не было как просто, потому что при ее скрытии/показе она использует анимацию, и EventListener возвращал ширину которая была до завершения анимации, смотря на другие возможные API я пришел к выводу что другого решения этой проблемы кроме как добавить время ожидания окончания анимации перед отправкой данных на сервер — нет, и добавил 300 мс ожидания — и оно отлично работало!
Потом я создал настройки для плагина, создал клиент который получал данные с сервера в Mahou и все работало.
Раньше при тике таймера допустим для флагов стран в трее — всегда менялась иконка, что в итоге давало большую нагрузку на ЦПУ и иногда даже приводило в вылету GDI+, так что я решил внедрить переменную которая будет хранить название последнего измененного языка, и условие при котором если текущий языка равен предыдущему то не менять иконку чем значительно уменьшил нагрузку на ЦПУ, остальные функции я улучшил похожим образом.
Что это значит? Это значить что раньше при чтении определенной настройки использовался диск, создавая лишнюю нагрузку, я решил создать переменные для каждой настройки чтобы не использовать диск а использовать их(ОЗУ). Теперь же чтение/запись с/на диска происходит только при сохранение/загрузке настроек.
Автор: BladeMight
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/250482
Ссылки в тексте:
[1] статью про Mahou: https://habrahabr.ru/post/321518/
[2] плагин: https://github.com/BladeMight/MahouCaretDisplayServer
[3] Sublime Text 3 API: https://www.sublimetext.com/docs/3/api_reference.html
[4] Репозиторий: https://github.com/BladeMight/Mahou
[5] Сайт: http://blademight.github.io/Mahou/
[6] Wiki: https://github.com/BladeMight/Mahou/wiki
[7] Релизы: https://github.com/BladeMight/Mahou/releases
[8] Источник: https://habrahabr.ru/post/324592/
Нажмите здесь для печати.