macro_file nAdvCr; // отработка действия "ввод" по правилам BVV63 ;) // 2015, Author nvv (Nosov Vladislav AKA NvvLazyTiger), Vladivostok, Russia // 2015.09.02, nvv, finished? // 2015.08.25, nvv, creation /* nvv: Итак, нажали "Ввод"... ;) 1. Если курсор стоит не в конце строки, то: а) "разрезать" строку в этом месте на две; у нижней такой же отступ; 2. Если установлен режим "замена" (overwrite), то: а) см. п.1.а); 4. Как быть, если ПОСЛЕ нажали клавишу управления, например <Page Up>, то б) оставить "квази" пустую строку (т.е. с табами и пробелами); --- BVV63 Поведение должно зависеть от расширения файла: а) расширение относится к "DEFAULT" - делаем по описанному ("как нада!"); а) расширение НЕ относится к "DEFAULT" - делаем стандартный Cr.*/ macro nAdvCr { // отработка действия "ввод" по правилам BVV63 ;) str Str0[ max_line_length ] = caps( "." + get_extension( file_name ) ); // для поиска отношения к расширению... ;) str Str1[ max_line_length ] = get_line; // текущая строка... int InsMod = insert_mode; // и что с того, что "всегда вставка"? ;) int PosCur = c_col; // курсор здесь int PosEol = svl( Str1 ); // а это - длинна текущей строки int PosFwd; int intRef = refresh; if ( caps( parse_str( "\x7F" + "EXT=", global_str( Str0 ) ) ) == "DEFAULT" ) { // Оно! 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; // "картина-с маслом-с"...;))) } else { cr; // стандартная реакция } } // nAdvCr |