Теперь Far умеет работать в пределах видимого окна консоли, даже при экранном буфере большего размера! (Раньше понятия "окно" и "буфер" не разделялись)
drkns 22.05.2010 20:00:00 +0200 - build 1564 wrote:
1. Инкапсуляция всех используемых консольных функций.
Как следствие - стало возможным очередное "то, о чём так долго говорили большевики": Far умеет работать в пределах окна (а не буфера) консоли.
Поставив высоту буфера побольше, можно медитировать на длинные выводы консольных программ. Кнопки CtrlAlt<PgUp|PgDn> расширят кругозор в соотвествующем направлении.
АХТУНГ! - в этом режиме гарантированно будет напрочь сносить крышу плагинам, самостоятельно рисующим что-либо
в консоли напрямую, или наивно предполагающим, что размер фара можно получать через CONSOLE_SCREEN_BUFFER_INFO::dwSize.
Что это даёт: Окно фара рисуется не на весь буфер консоли, а подгоняется под размер отображаемого окна.
Таким образом, если установить большое значение вертикального размера буфера, то можно будет с лёгкостью просматривать весь вывод консольных программ, запущеных из фара.
Кроме того: Изменяя размер окна консоли (например мышью) мы изменяем размер фара. Почти как в ConMan / ConEmu.
При изменении размеров окна фар подстраивается не мгновенно, а после нажатия какой-либо клавиши, или после попадания курсора мыши в пределы окна.
Сделано так чтобы избавиться от попадания артефактов в буфер при ресайсе мышью. До 1574.3 с артефактами фар боролся проще, обнулением буфера.
А вообще DrKnS намеревался ещё сделать обновление по таймауту (когда-нибудь)...
При нормализации/максимизации окна (Alt-F9) фар больше не пытается подгонять размер буфера.
Неочевидное, но закономерное следствие: появление скроллбаров, даже если вы не увеличивали буфер намеренно:
В случае когда размер буфера равен размеру окна, и вы увеличиваете окно с помощью Alt-F9 (или максимизируете мышью), то буфер увеличивается соответственно.
Если затем вы окно уменьшите обратно, то буфер останется прежним. Результат:появятся скроллбары. Подробнее: см. Дискуссионные моменты.
Как включить: Этот режим по умолчанию выключен, и включается с помощью ключа командной строки /w.
А если вы хотите использовать его постоянно — нужно активировать соответствующий параметр с помощью far:config (System.WindowMode = true).
Опробовать новую функциональностью можно увеличив буфер экрана.
Это можно сделать в свойствах консоли, либо с помощью команды mode:
Если задать ширину окна большей, чем позволяет размер экрана, то правая граница фара оказывается скрыта скроллбаром.
DrKnS wrote:при этом скроллбар накладывается поверх консоли, а не сбоку, и накрывает её собой
DrKnS wrote:винда возвращает максимальное количество строк и столбцов,которые влезли бы в текущее разрешение экрана.
поправку на возможный скроллер она не делает
сделать такую поправку из фара сам я не могу, т.к. неизвестно, сколько скроллер занимает знакомест
DeltaXY - это структура COORD.
Компоненты X и Y добавляются к результату, который возвращает функция GetLargestConsoleWindowSize(). В коде это выглядит примерно так:
АХТУНГ! - в этом режиме гарантированно будет напрочь сносить крышу плагинам, самостоятельно рисующим что-либо
в консоли напрямую, или наивно предполагающим, что размер фара можно получать через CONSOLE_SCREEN_BUFFER_INFO::dwSize
, отдельные плагины отрисовываются
Например не в пределах фара, а по центру буфера.
Пользоваться ими при этом конечно можно, но учтите что они могут затереть в буфере потенциально нужный вам текст
. Решение: Юникодные плагины могут быть исправлены их авторами, используя новое API(см. предыдущий пост).
При изменении размера окна (например мышью или Alt-F9) возможно попадание в буфер артефактов. Решение:
Если вам дорого содержимое буфера, то не стоит браться мышью за уголок окна и устраивать хороводы Update:
До 1574.3 с артефактами фар боролся проcто: очисткой консоли. Начиная с билда 1574 буфер не очищается, но при ресайзе окна мышью перерисовка фара происходит не сразу, подробности в предыдущем посте (ахтунг).
В некоторых областях (например в редакторе) многие Ctrl-Alt-комбинации уже задействованы под собственные функции фара, поэтому прокрутка не сработает. Решение: Назначить макросы, используя соответствующие функции.
Очень кстати пришлись бы модификаторы с Win-
При открытом меню прокрутка невозможна (точнее фар самопроизвольно возвращает окно в конец буфера)
Чёрный список плагинов, не работающих с большим буфером
Хочется чтобы новая функциональность была доступна из макросов.
А именно, нужны следующие макрофункции:
Уже реализовано: window.scroll()Функция для прокрутки буфера, позволяющая реализовать, например, такие комбинации: Ctrl-Alt-Up|Down|Left|Right|PgUp|PgDn|Home|End.
Функция для изменение размеров буфера/окна/обоих сразу
Функция для получения размера буфера/окна
Функция для переключения режима работы в пределах окна/буфера
Приглашение сmd вверху, и опускается вниз только по мере заполнения буфера.
Легче отмотать к нужному месту, да и вообще - удобно сразу оценить размер вывода программы.
А наберёшь cls - и буфер снова пустой, приглашение вверху.
А пока что буфер заполняется начиная от фара, т.е. снизу. Однако любая внешняя программа сама очистившая буфер всё равно выведет текст сверху, и когда после завершения программы фар перемотает буфер вниз, то может показаться будто буфер пустой.
Дискуссионные моменты
Posted: Sat 22 May, 2010 22:15
by John Doe
Буфер консоли vs "подпанельный" буфер (Ctrl-O):
Концепция буфера над панелями плохо сочетается с просмотром экрана под панелями.
Получается что текст вывода находится в 2-х разных местах, что несколько нелогично.
Например, хочу посмотреть длинный вывод dir: Вначале подымаюсь над фаром на пять экранов. Потом листаю вниз. А хвост вывода оказывается спрятан под панелями, и ещё в добавок приходится нажимать Ctrl-O, что сбивает.
Казалось бы, если выводить всё над панелями, то Ctrl-O можно было бы заменить прокруткой на экран вверх.
Но нет, без Ctrl-O нельзя, это ещё и работа без панелей.
Плюс, ещё возможен случай когда панели не на весь экран, и там соответственно тоже ожидается вывод.
Как-бы это всё увязать хорошенько...
Для сравнения см. Midnight Commander. Не скажу что там всё хорошо, но их решение "идеологически" более правильное: скроллбар появляется только после нажатия Ctrl-O
Выделение по Alt-Ins не позволяет выделить текст в буфере. Может быть в буфере применить другой подход?
Alt-Ins — чисто фаровская фича, поэтому с буфером проблема, для фара этих регионов просто нет.
Поэтому Alt-Ins для буфера фактически надо реализовывать заново.
Mantis #1395
А нельзя ли воспользоваться системным копированием с экрана, с помощью мыши?
Ведь есть режим в котором мышь сразу выделяет текст на экране.
Возможно ли из фара этот режим более-менее прозрачно переключать, чтобы не лезть самому в меню окна консоли?
Ведь надо, чтобы мышь и в буфере выделяла, и в фаре работала по-прежнему...
Если при просмотре буфера нажать какую-либо клавишу - буфер скорее всего автоматически отмотается к окну фара.
К перемотке приводят большинство действий в фаре, но не перемещение курсора на панели.
Принудительная перемотка — это целиком вынужденная мера, применяемая фаром в случае, когда консоль перемоталась бы и сама, но немного "не туда": консоль крутится при изменениях, затрагивающих курсор ввода (но не виртуальный "панельный курсор").
Есть мнение, что лучше поменьше лезть пользователю под руки, а то допустим прокрутил, читаю аутпут вслух и с выражением, случайно нажал кнопку и всё, приехали.
Но существует и другое мнение: поведение должно быть единообразным, и раз в большинстве случаев перемотка всё равно происходит, то пусть она происходит всегда — после нажатия любой клавиши гарантированно "всплывёт" фар, что не лишено удобства.
В некоторых случаях, в частности после двойного Alt-F9 (максимизация/нормализация) появляются не всегда желанные полосы прокрутки:
Происходит это от того, что при максимизации окна буфер увеличивается соответственно, но при последующем его уменьшении буфер обратно не уменьшается, и это логично: ведь в противном случае потенциально нужная нам информация может быть "обрезана".
Проблема обсуждалась на Мантис: #1390.
По сути, нежелательной можно считать только горизонтальную полосу прокрутки.
"Умное" решение возможно: перед усечением можно выяснить размер самой длинной строки буфера.
А пока умное решение не воплощено, можно воспользоваться простым, воспользовавшись утилитами из следующего сообщения. Пример.
Утилиты для изменения размеров буфера/окна
Posted: Sat 22 May, 2010 23:42
by John Doe
Использование стандартной команды mode con к сожалению очищает буфер.
Но управлять размером окна и буфера можно с помощью разных сторонних утилит:
size [ -h | -H | -? | -d | -D ] [ysize [xsize]]
[] designates optional arguments
| designates either/or arguments
if xsize is not specified, default is 80
if ysize is not specified, default is 512
-h | -H | -? display this message
-d | -D turn on debugging messages and
use current size as the default.
...
/S
Set window and buffer parameters into 'ConSet_...' variables.
EX: ConSet /S
EX: ConSet ConSet_Color=0F
Sets the following variables with the indicated value:
ConSet_Title The title of the console window.
ConSet_Color *The text colors. See 'COLOR/?' for format.
ConSet_W_Lines *The number of console window lines.
ConSet_W_Cols *The number of console window columns.
ConSet_B_Lines *The number of console buffer lines.
ConSet_B_Cols *The number of console buffer colunms.
ConSet_Cursor_sz *The size in percentage (0-100) of the
cursor.
ConSet_Cursor_XY *Position of the cursor. Top-left is '0 0'.
ConSet_MaxWin_XY The maximum window size permitable.
If ConSet is used to modify any of the variables that are
marked with an asterisk, ConSet will adjust the console window
to match the value specified. The example above changes the
background color to black and the foreground color to white. The
largest permitable buffer dimensions are 32,767 by 32,767.
ConSetBuffer.exe Sets the dimensions of the console buffer in columns and lines.
ConSetBuffer [/X|C|W=columns] [/Y|L|H=lines]
/X Specify the number of columns for the buffer width.
/C and /W are the same as /X.
/Y Specify the number of lines for the buffer height.
/L and /H are the same as /Y.
If either dimension is smaller than the applicable window dimension, the window
will be adjusted.
If neither argument is present, the current settings will be printed. The
dimensions will be taken from the standard error device (STDERR) so that the
correct values will be read when used with the FOR command. Nothing is written
to STDERR so to ensure that the correct values are obtained, do not redirect
STDERR. To save the dimensions in a batch program, use the following:
FOR /F "tokens=2,4 delims== " %%A in ('ConSetBuffer') Do (
Set Columns=%%A
Set Lines=%%B
)
ConSetWindow.exe - Sets the position of the left, top, right, and bottom edges of the window in
the screen buffer.
ConSetWindow [/L=left] [/T=top] [/R=right] [/B=bottom] [/X] [/Y]
/L Specify the position of the left window edge.
/T Specify the position of the top window edge.
/R Specify the position of the right window edge.
/B Specify the position of the bottom window edge.
/X Sets left to 0 and right to the maximum permissible by the system.
/Y Sets top to 0 and bottom to the maximum permissible by the system.
If no arguments are present, the current settings will be printed. The
positions are taken from the standard error device (STDERR) so that the
correct values will be read when used with the FOR command. Nothing is written
to STDERR so to ensure that the correct values are obtained, do not redirect
STDERR. To save the positions in a batch program, use the following:
FOR /F "tokens=2,4,6,8 delims== " %%A in ('ConSetWindow') Do (
Set Left=%%A
Set Top=%%B
Set Right=%%C
Set Bottom=%%D
)
Console Size by Jason Hood <jadoxa@yahoo.com.au>.
Version 1.01 (27 December, 2005). Public Domain.
http://misc.adoxa.cjb.net/
Display or change the sizes of the console buffer, window and font.
Usage: cs.exe [-a|b|w|f] [<cols>][x<rows>] [-c[<cols>]] [-r[<rows>]]
[-p[<n>]] [-q]
cols width of the buffer/window/font
rows height of the buffer/window/font
-a apply to buffer and window
-b apply to buffer
-w apply to window
-m maximum window size (see below)
-f apply to font; automatically select font (see below)
-p position the window (see below)
-q prevent output of messages (error messages are still displayed)
* By default, columns will apply to both the buffer and window,
but rows will only apply to the window.
* Buffer size will always be made to fit the window (eg: if the
current window size is 80, "-b40" will have no affect).
* If no values are given, the current values will be displayed;
Errorlevel is set to the last specified.
* Prefixed 'm' will select the maximum window columns/rows;
suffixed 'm' will display it ("-cmc" is regarded as prefix).
* TrueType fonts must first be selected in "Properties" before being
available via -f; add ',' to select it instead of the raster
(eg: "-f 8x12" for raster; "-f 8x12," for TrueType, once available).
* <n> is 0 for the middle of the screen (default);
1 for the top-left corner;
2 for the top-right corner;
3 for the bottom-left corner;
4 for the bottom-right corner.
C помощью этих утилит, например, можно избавиться от нежелательной горизонтальной полосы прокрутки (подробности в предыдущем сообщении).
Max Rusov wrote:Может вместо тог чтобы вести черный список - подождать пока фичу доведут до ума? А то в него придется очень много плагинов добавить...
Фича довольно проста: развели понятия буфер/окно.
Плагины сами-собой уже не починятся.
Re: Far работает с большим буфером консоли!
Posted: Mon 24 May, 2010 00:03
by Max Rusov
Ну, как уже говорили, минимум - неплохо бы добавить API для плагинов. Мои плагины, например, практически все в той или иной степени используют размер буфера консоли. Можешь внести в список:
Список выполняет свою задачу - пользователь увидит что проблема известна и не будет вам напрасно надоедать.
Ну и обратить внимание авторов тоже полезно.