Автор: NvvLazyTiger
Дата сообщения: 26.08.2015 00:56
"Прошу к столу, вскипело!" (c) М. Жванецкий. ;)
[more]
Код:
macro_file nAdvCr;
// 2015, Author nvv (Nosov Vladislav AKA NvvLazyTiger), Vladivostok, Russia
// 2015.08.25, nvv, creation, тработка действия "ввод" по правилам BVV63 ;)
/* nvv: Итак, нажали "Ввод"... ;)
1. Если курсор стоит не в конце строки, то:
а) "разрезать" строку в этом месте на две; у нижней такой же отступ;
б) вставить ниже текущей строки пустую (т.е. сделать переход в конец строки + cr + proper indent).
2. Если установлен режим "замена" (overwrite), то:
а) см. п.1.а);
б) см. п.1.б);
в) просто перейти на нужное место строкой ниже (поведение "по умолчанию").
3. Если не установлен режим "Persistent Blocks", то:
а) поступать в соответствии;
б) сохранять выделение в блок;
в) иное (варианты есть;), - что?
4. Как быть, если ПОСЛЕ нажали клавишу управления, например <Page Up>, то
а) оставить пустую строку;
б) оставить "квази" пустую строку (т.е. с табами и пробелами);
в) иное, - что?
5. Иные пожелания касаемо, какие? ;)
--- BVV63
Режимы "Замена" и "Persistent Blocks" я не использую (а про второй вааще
впервые слышу), можно и упростить, не закладываясь на них. В любом случае,
полагаю, что в любых режимах (включая п. 4) правильнее оставлять
"квазипустую" строку - вариант "a" в п. 1.
П. 5 - никаких (пока), может в процессе эксплуатации что-то появится. */
macro nAdvCr { // отработка действия "ввод" по правилам BVV63 ;)
str Str0;
str Str1 = get_line; // текущая строка...
int InsMod = insert_mode; // и что с того, что "всегда вставка"? ;)
int PosCur = c_col; // курсор здесь
int PosEol = svl( Str1 ); // а это - длинна текущей строки
int PosFwd;
int intRef = refresh;
insert_mode = True; // независимо от состояния Ins/Ovr
push_undo ; // вдруг НЕ понравится... ;)))
refresh = false; // а нефиг мельтешить! ;)
goto_col( 1 );
first_word; // встать на первый НЕ "white space" символ строки
PosFwd = c_col; // место этого символа
Str0 = copy( Str1, 1, PosFwd - 1 ); // это местный indent... ;)
goto_col( PosCur ); // а здесь нас вызвали... ;)))
cr;
if ( PosCur > PosEol ) { // -- мы за концом строки
put_line( Str0 ); // оформляем квази пустую строку
} else if ( PosCur <= PosFwd ) { // -- мы ДО первого символа или на нём
put_line( Str1 ); // строка съехала вниз...
} else { // -- курсор ВНУТРИ строки
put_line( Str0 + copy( Str1, PosCur, max_line_length ) ); // оформляем "отрезанное" ;)
}
goto_col( PosFwd ); // встанем куда след.
pop_undo ;
insert_mode = InsMod; // ну и вернём "всё как было" ;)
refresh = intRef;
redraw; // "картина-с маслом-с"...;)))
} // nAdvCr