вторник, 8 декабря 2015 г.

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

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

2 комментария :

  1. Здравствуйте.
    Пользуюсь Far'om давным-давно. С версии 1.27, если не изменяет память. После выхода 3-й версии как водится перещед на неё, но буквально на несколько дней и снова вернулся на 2.х. Руки давно заточены на определённые комбинации и ожидаемые реакции приложения, а в тройке что-то сильно наворотили...
    И тем не менее, скачал Вашу сборку.
    Буду пробовать.

    ОтветитьУдалить
    Ответы
    1. А что конкретно изменилось в "тройке" в плане хоткеев по-сравнению с 2.0? Т.е. я сам давно использую Far, еще с тех самых пор, когда разработку вел Eugene Roshal, особенной разницы между 3.0 и предыдущими версиями не заметил (имеется ввиду в плане "ухудшения", т.е. исчезновения каких-то необходимых возможностей). А так, на дворе все-таки уже 2016 год ... и использование Unicode-версии из третьей ветки уже не просто "дань моде", а необходимость.

      Удалить