Не обійшлося без злому вихідного коду. Трохи фонової історії:
Менше взагалі не може працювати з мишею (включаючи події прокрутки).
Емулятори терміналів підтримують так званий альтернативний екран. Це саме те, на що більшість додатків на повноекранному режимі перемикаються протягом їх тривалості (і повертаються до звичайного екрану, коли вони закриваються, спричиняючи «відновлення» попереднього вмісту), і він не має буфера прокрутки. Менше також перемикається на цей альтернативний екран, якщо тільки -X
не вказано, у цьому випадку він не працює.
Багато емуляторів терміналів з'ясували, що коли він перебуває в альтернативному режимі екрану, а програма, що працює всередині, не цікавиться подіями миші, має сенс перетворити прокрутку в події клавіш вгору або вниз. Це злом, і це було б шкідливо або на звичайному екрані (уявіть, що трапиться, наприклад, у вашому запиті оболонки), або коли програма хоче працювати з мишею (звичайно, вони повинні бачити фактичні події миші тоді). Але оскільки за замовчуванням жоден з цих двох не утримується під час запуску less
, цей хак запускається (залежно від емулятора терміналу, який його підтримує, і він включений через \e[?1007h
vs.\e[?1007l
). Ваші події прокрутки перетворюються емулятором терміналу на клавіші вгору та вниз, і менше не можна відрізнити їх від фактичних натискань клавіш. Він не отримує подій прокрутки миші: він бачить натискання клавіш вгору та вниз.
Отже, ви перебуваєте: або ви переходите на альтернативний екран, і хак термінала перетворює події прокрутки в натискання клавіш на менше, і нормальний екран відновиться при виході з роботи; або ви цього не зробите, і тоді не може бути ніякого магічного перетворення подій прокрутки в натискання клавіш і менше не розуміє подій прокрутки.
Отже, що можна було зробити? Ну, або впроваджуйте підтримку миші менше, і нехай вона сама обробляє події прокрутки (і жити з нестандартним клацанням чи поведінкою копіювання та вставки), або впроваджуйте інший дивний хакер: після виходу, після повернення на звичайний екран, less
можна було б в останній раз надрукуйте скріншот вмісту, повторивши все, що було відображено перед тим, як ви вийшли з роботи.
На практиці це в основному зводиться до: вибачте, забудьте.