Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
unxed opened this issue Nov 10, 2016 · 29 comments
Open

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

unxed opened this issue Nov 10, 2016 · 29 comments

Comments

@unxed
Copy link
Contributor

unxed commented Nov 10, 2016

No description provided.

@elfmz
Copy link
Owner

elfmz commented Nov 10, 2016

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.

@unxed
Copy link
Contributor Author

unxed commented Nov 10, 2016

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 unxed changed the title editor, feature request: add an option to apply word-wrap to all or selected text (based on line length defined in configuration) editor, feature request: port EditWrap plugin Nov 10, 2016
@unxed
Copy link
Contributor Author

unxed commented Nov 10, 2016

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.

@invy
Copy link
Contributor

invy commented Nov 10, 2016

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

it's called flexibility.

@elfmz
Copy link
Owner

elfmz commented Nov 16, 2016

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?

@unxed
Copy link
Contributor Author

unxed commented Nov 16, 2016

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
Copy link
Contributor Author

unxed commented Nov 28, 2016

Closing, as autowrap is ported.

@unxed unxed closed this as completed Nov 28, 2016
@unxed unxed reopened this Nov 11, 2019
@unxed
Copy link
Contributor Author

unxed commented Nov 11, 2019

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
Copy link
Contributor Author

unxed commented Nov 11, 2019

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

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

@unxed
Copy link
Contributor Author

unxed commented Nov 11, 2019

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

Ну то есть это осуществимо через 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 unxed changed the title editor, feature request: port EditWrap plugin editor, feature request: word wrap Nov 11, 2019
@unxed unxed changed the title editor, feature request: word wrap editor, feature request: virtual word wrap (as in windows notepad) Nov 11, 2019
@unxed
Copy link
Contributor Author

unxed commented Nov 11, 2019

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

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

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

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

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

@unxed
Copy link
Contributor Author

unxed commented Nov 11, 2019

О, я научился виртуальные переносы строк 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
Copy link
Contributor Author

unxed commented Nov 11, 2019

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

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

autowrap.patch.txt

@unxed
Copy link
Contributor Author

unxed commented Nov 16, 2019

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

@elfmz
Copy link
Owner

elfmz commented Nov 16, 2019

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

@unxed
Copy link
Contributor Author

unxed commented Nov 16, 2019

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

@unxed
Copy link
Contributor Author

unxed commented Oct 14, 2020

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
Copy link
Contributor Author

unxed commented Oct 14, 2020

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

@unxed
Copy link
Contributor Author

unxed commented Oct 19, 2020

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
Copy link
Contributor Author

unxed commented Oct 19, 2020

@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 через раз?

@elfmz
Copy link
Owner

elfmz commented Oct 19, 2020

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

@elfmz
Copy link
Owner

elfmz commented Oct 19, 2020

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

@unxed
Copy link
Contributor Author

unxed commented Oct 19, 2020

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

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

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

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

@elfmz
Copy link
Owner

elfmz commented Oct 19, 2020

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

@elfmz
Copy link
Owner

elfmz commented Oct 19, 2020

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

@unxed
Copy link
Contributor Author

unxed commented Dec 2, 2020

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:
#1197 (comment)
https://github.com/unxed/far2l-EditWrap

@vasmedv
Copy link

vasmedv commented Feb 26, 2021

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

@vasmedv
Copy link

vasmedv commented Mar 3, 2021

Solution in: #948

@unxed
Copy link
Contributor Author

unxed commented Nov 24, 2022

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. Теперь, наконец, есть достаточно удобный редактор с переносом строк. Большинство хоткеев как в фаре, переучиваться не надо.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants