far2l icon indicating copy to clipboard operation
far2l copied to clipboard

editor, feature request: virtual word wrap (as in windows notepad)

Open unxed opened this issue 8 years ago • 28 comments

unxed avatar Nov 10 '16 15:11 unxed

I believe this could be done as plugins or macros, but not should be default feature of editor. Also this can be done with fold utility.

elfmz avatar Nov 10 '16 16:11 elfmz

can not find here http://api.farmanager.com/ru/macro/macrocmd/prop_func/ any api function for running commands from macros

maybe this plugin can be ported easily? https://github.com/Maximus5/FarPlugins/tree/master/EditWrap

unxed avatar Nov 10 '16 17:11 unxed

btw, now using xclip -selection clipboard -o | fold -s -w160 | xclip -selection c done in shell script running on a hotkey press - god save linux allowing to build bicycles from crutches and a duct tape

please note that far editor refuses to paste output of fold command without "-s" argument. not sure if it can be considered a bug or not.

unxed avatar Nov 10 '16 18:11 unxed

god save linux allowing to build bicycles from crutches and a duct tape

it's called flexibility.

invy avatar Nov 10 '16 19:11 invy

there is AutoWrap plugin in FAR's sources: https://sourceforge.net/p/farmanager/code/HEAD/tree/branches/far2/plugins/autowrap/ Looks very easy to port. Is it OK?

elfmz avatar Nov 16 '16 21:11 elfmz

Seems it can not be enabled per-file (only per-extention?), but having it is much better then having none!

http://forum.farmanager.com/viewtopic.php?f=4&t=4001&sid=f439b62f7c96218016cda78ad0c5969e

unxed avatar Nov 16 '16 21:11 unxed

Closing, as autowrap is ported.

unxed avatar Nov 28 '16 18:11 unxed

Still an issue.

Autowrap is about wrapping a line by adding newline characters, but EditWrap does a different thing (the thing all modern editors actually do) - it wraps dynamically (or we can call it "virtually"), not inserting newline characters into a file, just altering how it is shown to user. Like "word wrap" option in windows notepad.

Here is the code (seems to be Far2-compatible): https://github.com/Maximus5/FarPlugins/tree/master/EditWrap

And discussion thread: https://forum.farmanager.com/viewtopic.php?f=5&t=6587

unxed avatar Nov 11 '19 01:11 unxed

Ну в общем собрать-то и запустить его у меня получилось, только вот функционал там всё же не совсем тот, что требуется

https://github.com/unxed/far2l-EditWrap

unxed avatar Nov 11 '19 15:11 unxed

Порыл апстримный форум и офигел: да, нормального переноса по словам, по ходу, до сих пор нет. Есть отдельные костыли как вот эта штука выше, но вот так, чтоб открыл файл с длинными строками, отредактировал в режиме переноса строк, сохранил - и длинные строки не порезались, такого нет. Жесть.

Ну то есть это осуществимо через EditWrap, конечно, только надо:

  1. Открыть файл
  2. Сделать EditWrap->Toggle wrap
  3. Собственно, поработать с файлом
  4. Сделать EditWrap->Toggle wrap
  5. Сохранить (если забыл сделать toggle wrap второй раз, строки сохранятся порезанными)

Правда, новые переносы строк, добавляемые через Auto wrap, будут всё ещё настоящими переносами строк, а не виртуальными. И существование такой штуки как буфер обмена никак не учитывается.

В общем, такой себе экспириенс :)

Теоретически можно попробовать собрать то, что нужно, из того, что есть:

  1. Склеить Autowrap и Edit wrap в один плагин (чтоб Autowrap умел добавлять "виртуальные" переводы строки Editwrap'а, а не настоящие).
  2. Добавить опцию "автоматически включать wrap mode при открытии файлов (всех или только с указанными расширениями)".
  3. При включенном wrap mode делать unwrap перед сохранением (отключаемая опция: в настройках глобально или через Shift+F2 для конкретной операции).
  4. При включенном wrap mode делать wrap после вставки из буфера обмена (тоже отключаемая опция).
  5. При включенном wrap mode делать unwrap перед копированием в буфер обмена (тоже отключаемая опция).

Вот тогда получится как в windows notepad или любой textarea в интернетах. И даже с дополнительными плюшками.

unxed avatar Nov 11 '19 16:11 unxed

Ой, там всё смешнее ещё.

Переносы auto wrap'а таки убираются при unwrap, но только если они внутри блока, до этого подвергнувшегося wrap'у (и то почему-то не всегда). А если это новый абзац - не убираются.

И ещё autowrap не работает, если дописывается текст в середине строки, а не в конце.

И ещё autowarp не должен добавлять новую строку, если текущая строка - "виртуальная", т.е. без настоящего перевода строки в конце. А должен вместо этого просто перекидывать слово и курсор на следующую строку (исключение - последняя строка файла). А дальше смотреть, не вылезла ли следующая строка за лимит, ну и так до конца абзаца (т.е. первого не виртуального переноса строки). И при удалении символа из виртуальной строки, кстати, тоже - смотреть, не поместится ли туда теперь первое слово следующей строки, и перекидывать, если поместится, ну и так по до конца абзаца тоже.

Ну, раз в принципе "виртуальные" переносы строк в редакторе сделать можно (editwrap же делает), это всё должно быть вполне себе реализуемо.

unxed avatar Nov 11 '19 18:11 unxed

О, я научился виртуальные переносы строк Editwrap'а вставлять Autowrap'ом :)

Нужно после 210 строки в Autowrap.cpp дописать такое:

EditorGetString egs;
egs.StringNumber=ei.CurLine;
Info.EditorControl(ECTL_GETSTRING,&egs);

EditorSetString esset = {sizeof(esset)};

esset.StringNumber = ei.CurLine ;
esset.StringText = egs.StringText;
esset.StringEOL = _T("");
esset.StringLength = egs.StringLength;
Info.EditorControl(ECTL_SETSTRING, &esset);

И тогда добавленные Autowrap'ом переносы строки будут unwrap'иться корректно EditWrap'ом :)

И, кажется, я понял, как это колдунство с виртуальными переносами строк в EditWrap работает: если StringEOL пустой, значит, перенос строки виртуальный. И при unwrap такие строки будут склеены.

Способ кривой, конечно - по идее, внутри оно должно храниться именно целиковыми строками, а не кусочками с пометкой "здесь порезано", чтобы всякое разное обращение из плагинов по номеру строки-символа корректно работало. Ну и Column/Position справа сверху теряют смысл. При этом правильный способ создаст адок с трансляцией экранных позиций в реальные и обратно.

unxed avatar Nov 11 '19 19:11 unxed

Ок, я научил AutoWrap работать, даже если ввод идёт в середине строки. И даже не ломаться при попытке сделать undo/redo.

Теперь нужен rewrap остатка абзаца (вместо механического добавления новой виртуальной строки), если строка - не последняя в абзаце. И такой же rewarp в случае удаления символов.

autowrap.patch.txt

unxed avatar Nov 11 '19 21:11 unxed

@elfmz а подскажи хорошую IDE с отладчиком для экспериментов с far2l/плагинами под linux mint, а то, возможно, всё в самом фаре делать - не самый удобный способ, да и без точек останова и возможности подглядывать в переменные как-то всё слишком мучительно сложно получается :))

unxed avatar Nov 16 '19 21:11 unxed

да я вощемто все в фаре и делаю, а точки останова.. настоящие мужчины ими не пользуются :)

elfmz avatar Nov 16 '19 21:11 elfmz

понятно...) значит, по старинке, через принты в консоль))) благо я теперь знаю, как отладочный вывод смотреть))

unxed avatar Nov 16 '19 22:11 unxed

Finally found first TUI app with good word wrap support, Turbo.

It even may be easier to add clipboard and full keyboard support through the far2l terminal extensions to this tool than to write good word wrap for the far2l's editor. Btw, Turbo is made on a top of Scintilla (component used by well-known notepad++). I suspected that it would be probably easier to take word wrap from some kind of GUI component than to write it for TUI app from scratch :)

(also this thing is made using Turbo Vision, wow, it works on Linux and with full Unicode support!)

sudo apt install libncursesw5-dev libfmt-dev libgpm-dev libmagic-dev
git clone --recursive https://github.com/magiblot/turbo.git
cd turbo
(cd tvision && cmake . && make)
cmake . && make
./turbo

unxed avatar Oct 14 '20 00:10 unxed

There is also another TUI editor capable of doing proper word wrap, called tilde. Even having limited (localhost-only, xclip-like) clipboard support.

unxed avatar Oct 14 '20 10:10 unxed

Finally found first TUI app with good word wrap support, Turbo.

Now experiminting on adding clipboard support to it using far2l terminal extensions (those extensions are ingenious thing!). Extended keyboard input already working :)

unxed avatar Oct 19 '20 12:10 unxed

@elfmz а можно подсказочку, пожалуйста :) Как устроена система _start_marker/_exit_marker в обработке APC? Что-то не могу разобраться, зачем она нужна, как работает и почему вот такой тестовый код

#include <stdio.h> 

int main()
{
	fprintf(stdout, "\x1b_far2l1\x07 enabling far2l extensions\n");
	fprintf(stdout, "\x1b_far2l0\x07 disabling far2l extensions\n");
}

приводит вот к такой ошибке

OnApplicationProtocolCommand - bad marker: '73oVuo1YLeMO:0' while _start_marker='Pl8W7P595C9Dxby9' _exit_marker='8X4UGH22BJJ:'

из-за чего запускается в терминале far2l через раз?

unxed avatar Oct 19 '20 15:10 unxed

эффект прикольный, но вообще включать экстеншены надо в raw режиме, отключив эхо, и дожидаясь (или нет) ответа, ща скину примерный код

elfmz avatar Oct 19 '20 17:10 elfmz

ну вот както так, по сути копипаста из far2l допиленная чтоб компилялось на С а не С++: far2l_tty.c.zip

elfmz avatar Oct 19 '20 18:10 elfmz

ну вот както так, по сути копипаста из far2l допиленная чтоб компилялось на С а не С++: far2l_tty.c.zip

Спасибо! Работает, починился запуск через раз и ругань на маркеры.

А что это за маркеры такие всё же и почему инициализация экстеншнов влияет на них? RAW и без эха я пробовал, не влияло. Ожидание ответа помогало в изолированном примере, но не помогало внутри большой сложной аппы, причину не нашел.

PS: Очень интересно приделывать экстеншны к чему-то, far2l'ом не являющимся. С putty так же захватывающе было.

unxed avatar Oct 19 '20 18:10 unxed

Ну, там когда команда шеллу отправляется - формируется скрипт содержащий отправку старт-маркера потом команда потос стоп-маркера. Раньше эти маркеры были просто рандомной строкой которая парсингом вычленялась, а сейчас - просто особый подвид \x1b_far2l..\x07 команд. А когда включает far2k экстеншены если не выключить эхо то ответ far2l'я _far2lok через эхо попадает на входной поток и каким то мне пока не очень понятным образом интерферирует с параллельно отправляемым маркером.

elfmz avatar Oct 19 '20 19:10 elfmz

А маркеры эти нужны чтобы поскипать лишний вывод и понять когда собственно закончилось исполнение юзерской команды. Ведь шелл - он сам по себе живет.

elfmz avatar Oct 19 '20 19:10 elfmz

Resume of the current state.

We do not have full featured word wrap ("as in html textareas") in internal editor yet, but there are external editors with such function: turbo and tilde.

Alternative options: https://github.com/elfmz/far2l/discussions/1197#discussioncomment-1979911 https://github.com/unxed/far2l-EditWrap

unxed avatar Dec 02 '20 21:12 unxed

Здравствуйте. Подскажите, пожалуйcта, есть ли возможность отключить autowrap во внутреннем редакторе? Если изменить размер шрифта far2l до 12 и растянуть окно пошире, то при вводе текста в середине строки происходит пренос введенного на новую строку. Поковырялся немного в настройках, не нашел где можно это отключить. Far2l 2.2 build 2020-06-02 linux x86_64.

vasmedv avatar Feb 26 '21 02:02 vasmedv

Solution in: https://github.com/elfmz/far2l/issues/948

vasmedv avatar Mar 03 '21 08:03 vasmedv

Now clipboard works in turbo not only through x11, but also in a clean console, through far2l terminal extensions or through osc 52. Finally there is a fairly convenient editor with line wrapping. Most hotkeys are like in far2l, so you don’t need to relearn.

Теперь буфер обмена работает в turbo не только через x11, но и в чистой консоли, через расширения терминала far2l или через osc 52. Теперь, наконец, есть достаточно удобный редактор с переносом строк. Большинство хоткеев как в фаре, переучиваться не надо.

unxed avatar Nov 24 '22 19:11 unxed