Far Manager 3.0. Решение проблемы с выделением в текстовом редакторе.

Сегодняшний наш пост будет немного отвлеченным из серии "lifehack" или что делать если. Предыстория очень простая, в своей работе я очень часто использую файловый менеджер Far Manager. Можно долго спорить над тем что удобнее, консоль или GUI, Far Manager или Total Commander, развивать различные дискуссии и впадать в holywar'ы по этому поводу. Вывод здесь простой - каждому свое. Я могу перечислить не менее 100 пунктов по которым Far Manager гораздо удобнее в работе чем тот же Total Commander, однако, сторонники GUI могут сделать то же самое в пользу Total'а и будут по своему правы. Но пост не об этом. Так или иначе мне достался новый ноут, за которым я собственно сейчас и пишу этот пост. Но при установке Far на него - перестало работать выделение в текстовом редакторе. При попытке зажать Shift и выделить текст с помощью стрелок курсора фактически выделялась только одна строка, при этом текст не выделялся, а просто эта строка следовала за курсором, как показано на картинке. Ровно аналогичная ситуация была описана в этом посте на форуме Far (уже потом я привел в нем решение данной проблемы).

Пользователь droll описывал эту проблему следующим образом: "Странно работает выделение, поиском похожих проблем не нашел. Странность заключается в том, что зажав Shift и зажав стрелку (например вправо), выделяется ~30 символов, после чего выделение снимается и начинается с нового места (~30 символа). Потом выделяется еще ~30 и опять выделении снимается, и так далее. Одно такое выделении занимает примерно одну секунду.
Также, в связи с этим, невозможно зажав Shift и стрелку выделить строку, потом нажать влево. Выделение начинается заново с места курсора.".

В итоге я решил разобраться с ней более детально, тем более что были выходные и пару часов свободного времени у меня было. Первое что я сделал - это по совету Maximus5 поставил KeyEvents, чтобы отследить события приходящие в консольное окно. Получилось примерно следующее:


Здесь наглядно видно, что при нажатом Shift и кнопке "Вниз" на основной клавиатуре консольное окно получает странный KEY_EVENT_RECORD c  Vk="VK_????" [255/0x00FF], которое по всей видимости посылает сам ноутбук, т.к. никаких приложений, которые могут посылать подобное событие нет. Соответственно Far Manager реагирует на это событие именно таким образом, как и описано выше. Т.е. вместо выделения текста просто перемещает строку с выделением за курсором. Ну что ж ... надо копать ...

Ставим svn под Win32, MSVC (у меня был Visual Studio 2013) и качаем исходники Far Manager:

svn co http://svn.code.sf.net/p/farmanager/code/trunk/unicode_far unicode_far

Там все очень логично и четко структурированно, поэтому разобраться что вся обработка ввода с консоли происходит в keyboard.cpp не составило никакого труда (отдельная благодарность разработчикам Far Manager за чистый и понятный исходный код). Ну а далее, проблема, как оказалось, крылась вот в этом месте:


Добавив в строку:

if (!rec->Event.KeyEvent.bKeyDown && (CtrlState&(ENHANCED_KEY|NUMLOCK_ON)))
return Modif|(KEY_VK_0xFF_BEGIN+ScanCode);


Всего одно условие, так, чтобы получилось:

if (!(CtrlState & SHIFT_PRESSED)) { // [+] Decker
if (!rec->Event.KeyEvent.bKeyDown && (CtrlState&(ENHANCED_KEY|NUMLOCK_ON)))
return Modif|(KEY_VK_0xFF_BEGIN+ScanCode); }

Мы отучили Far реагировать на это неизвестно откуда берущееся "псевдонажатие". Собрав проект мы получили работоспособную версию Far Manager для этого случая. Готовые бинарники, т.е. собранную версию для x86 и x64 можно взять здесь: unicode_far_decker.7z

Чему нас учит этот пост? Скорее всего тому, что при возникновении даже самой неявной проблемы, практически всегда, если потратить некое количество времени, можно разобраться в ее истоках. А зная чем она вызвана наметить пути решения и устранить ее ... как-то так наверное ;)
Share This :



sentiment_satisfied Emoticon