# Свойства и функции для работы с редактором

## Свойства

Оператор | Тип | Описание
--- | --- | ---
Editor.FileName | String | полное имя редактируемого файла
Editor.Lines | Number | количество строк в редакторе
Editor.CurLine | Number | номер текущей строки
Editor.CurPos | Number | текущая позиция курсора в строке; учитывается размер табуляции
Editor.RealPos | Number | текущая позиция курсора в строке без привязки к размеру табуляции (табуляция считается за 1 символ)
Editor.Value | Value | содержимое текущей строки в редакторе под курсором. Например, показать текущий символ под курсором:
    msgbox(substr(Editor.Value,Editor.CurPos-1,1),Editor.FileName,0)
Editor.SelValue | String | содержимое выделенного блока. Аналогично тому, как Far поместил бы в clipboard (блок текста с наличием `crlf` в конце строк).
Editor.State | Number | различные состояния текущего редактора - набор битовых флагов:
Значение | Описание
--- | ---
0x00000001 | файл совершенно новый либо его успели удалить
0x00000002 | разрешено переключение на программу просмотра по `F6`
0x00000004 | после закрытия редактора удалить файл
0x00000008 | редактируемый файл модифицирован (в статусной строке редактора присутствует символ '*')
0x00000010 | в наличии есть выделенный поточный блок (альтернативный вариант - функция Editor.Sel(0,4))
0x00000020 | в наличии есть выделенный вертикальный блок (альтернативный вариант - функция Editor.Sel(0,4))
0x00000040 | редактируемый файл изменялся в сеансе редактирования
0x00000080 | курсор в режиме замены
0x00000100 | позиция курсора была изменена плагином
0x00000200 | редактор заблокирован (ReadOnly)
0x00000400 | используются постоянные блоки
0x00000800 | модальный редактор
0x08000000 | FAR запущен с ключом /e
Например,
    $If (Editor.State & 0x8) выполнить действия, если файл модифицирован $End

## Функции

Функция | Описание
--- | ---
E=editor.undo(Action) | Работа с Undo/Redo. Здесь N - одно из:
Action | Описание
--- | ---
0 | начало блочной операции
1 | конец блочной операции
2 | выполнить Undo
3 | выполнить Redo
Возвращает 1 для успешно выполненной операции или 0 в случае ошибки.
E=editor.settitle([Title]) | Установка заголовка в статусной строке редактора. Если параметр Title отсутствует или равен пустой строке, то восстанавливается предыдущее значение статусной строки. При показе заголовок будет усечён до размера, не затрагивающего служебную информацию (кодировка, позиция, etc.) Возвращает 1 для успешно выполненной операции или 0 - редактор не в фокусе.
N=editor.pos(Action,Object[,Value]) | Получение/установка позиций в редакторе. Параметр Action задаёт поведение функции:
Action | Описание | Возвращает (N)
--- | --- | ---
0 | получить данные | текущее значение
1 | установить данные | 1/0 - успешно/неуспешно выполнена установка
Функция возвращает -1 в случае прочих ошибок (например, неверные параметры, или функция вызвана не из редактора). Параметр Object - над чем выполняется операция:
Object | Описание
--- | ---
1 | строка
2 | положение курсора в строке
3 | экранная позиция курсора
4 | новая строка вверху экрана
5 | позиция левой границы окна редактора
6 | режим вставки
Пример см. в разделе Примеры.
V=editor.sel(Action[,Opt]) | Функция позволяет производить некоторые операции с блоками в тексте (в редакторе, в строках ввода в диалогах, в командной строке).
Action | Описание действия (в зависимости от значения Opt)
--- | ---
0 | получить параметры текущего блока
0 | вернуть номер строки начала блока
1 | вернуть номер позиции в строке начала блока
2 | вернуть номер строки конца блока
3 | вернуть номер позиции в строке конца блока
4 | вернуть тип выделенного блока: 0 - блок не выделен, 1 - обычный блок, 2 - вертикальный блок (альтернативный вариант - свойство Editor.State)
1 | позиционировать курсор внутри текущего блока
0 | установить курсор в начало отмеченного блока
1 | установить курсор в конец отмеченного блока
При позиционировании курсора состояние блока не изменяется.
2 | установка позиций блока
0 | отметить позицию начала блока
1 | отметить позицию конца блока
Позицией начала/конца блока считается текущая позиция курсора. Блок помечается только после указания конечной позиции (Opt=1), с ранее выделенного блока пометка снимается. Если позиция начала и конца блока совпадают, то эта операция равносильна снятию пометки блока.
3 | установка позиций вертикального блока
0 | отметить позицию начала вертикального блока
1 | отметить позицию конца вертикального блока
Позицией начала/конца блока считается текущая позиция курсора. Блок помечается только после указания конечной позиции (Opt=1), с ранее выделенного блока пометка снимается. Если позиция начала и конца блока совпадают, то эта операция равносильна снятию пометки блока.
4 | снять выделение с блока. Параметр Opt игнорируется. Всегда возвращается 1.
В случае ошибки (в т. ч. функция вызвана не из "редактора") возвращаемое значение равно 0, иначе 1. Для Action=0 возвращается запрошенное значение. Например, повторим некоторые сочетания клавиш из Turbo-сред (макрос на сочетание `Ctrl-K`):
    %k=waitkey(0,1);
    $if(%k==B || %k==b || %k==CtrlB)
      editor.sel(2,0)
    $else
      $if(%k==K || %k==k || %k==CtrlK)
        editor.sel(2,1)
      $else
        $if((%k==C || %k==c || %k==CtrlC) && Selected)
          CtrlC
        $else
          $if((%k==Y || %k==y || %k==CtrlY) && Selected)
            CtrlD
          $else
            eval("F1")
          $end
        $end
      $end
    $end
V=editor.set(Option[,Value]) | Получить/изменить настройки текущей копии редактора.
Option | Тип Value | Описание
--- | --- | ---
0 | Number | Размер табуляции
1 | Number | Преобразование табуляции: 0 - не преобразовывать табуляцию 1 - преобразовывать все символы табуляции в пробелы 2 - преобразовывать новые символы табуляции в пробелы
2 | Number | Постоянные блоки
3 | Number | Клавиша `Delete` удаляет блоки. Если есть помеченный блок, `Delete` будет удалять этот блок, а не символ под курсором.
4 | Number | Автоотступ. Включает режим автоотступа при вводе текста.
5 | Number | Автоопределение таблицы символов
7 | Number | Разрешить перемещение курсора за пределы строки
8 | Number | Поведение клавиши `BackSpace` (TechInfo #13). Задает поведение клавиши `BackSpace` в редакторе, когда выделен вертикальный блок. Если значение отлично от 0, то `BackSpace` удаляет вертикальный блок подобно клавише `Delete`.
9 | Number | Представление кода символа под курсором в статусной строке (TechInfo #32) Может принимать следующие значения: 0 - восьмеричное значение (3 символа с ведущим нулями) 1 - десятеричное значение (3 символа с ведущими пробелами) 2 - шестнадцатеричное значение (2 символа под цифру + символ 'h')
10 | Number | Сохранять позицию файла
11 | Number | Сохранять закладки
12 | String | Символы разделители слов (TechInfo #1) По умолчанию: ~!%^&*()+|{}:"<>?`-=\[];',./
14 | Number | `AllowEmptySpaceAfterEof` (TechInfo #67) Окончание файла в редакторе всегда находится внизу экрана, если строк в файле больше чем строк экрана. При построчном скроллировании вниз (например, с помощью Ctrl-Down), скроллирование прекращается, когда показывается последняя строка. Value может принимать следующие значения: 0 - прекратить скроллинг, если последняя строка внизу экрана 1 - продолжать скроллинг, при этом: a) поместить курсор за пределы файла по прежнему нельзя b) скроллинг с помощью Ctrl-Down сдвинет текст до курсора
15 | Number | Показать полосу прокрутки в редакторе
16 | Number | Редактировать открытые на запись файлы
17 | Number | Выделять найденное - найденные последовательности будут выделены.
20 | Number | Показывать в редакторе пробельные символы.
Значение Value может быть опущено или равно -1, в этом случае функция ничего не изменит, а вернёт текущее значение настройки. Возвращает предыдущее значение опций или -1, если данные указаны некорректно, или функция вызвана не из редактора. Значения опции 16 изменить нельзя. Например, макрос, перемещающий выделенный фрагмент на одну строку вниз (сохраняет выделение вне зависимости от настрок постоянных блоков):
    clip(5) CtrlX %a=editor.set(2,1); Down CtrlV %a=editor.set(2,%a);
N=editor.delline([Line]) | Удаление строки с номером Line. Если Line не указан или меньше 1, то удаляется текущая строка. Возвращает 1 для успешно выполненной операции или 0 - если редактор не в фокусе/редактор залочен/нет строки с запрашиваемым номером.
S=editor.getstr([Line]) | Получить содержимое строки с номером Line. Если Line не указан или меньше 1, то возвращается текущая строка. Возвращает строку с запрашиваемым номером.
N=editor.insstr([S[,Line]]) | Вставить значение S после строки с номером Line. Если S не указан, то вставляется пустая строка. Если Line не указан или меньше 1, то вставляется в текущую строку. Возвращает 1 для успешно выполненной операции или 0 - если редактор не в фокусе/редактор залочен/нет строки с запрашиваемым номером.
N=editor.setstr([S[,Line]]) | Заменить строку с номером Line на значение S. Если S не указан, то строка будет пустой. Если Line не указан или меньше 1, то заменяется текущая строка. Позиция курсора в редакторе не меняется. Возвращает 1 для успешно выполненной операции или 0 - если редактор не в фокусе/редактор залочен/нет строки с запрашиваемым номером.
Удаление пустых строк:
    $If(Selected)
      %StartLine=Editor.Sel(0, 0);
      %EndLine=Editor.Sel(0, 2);
    $Else
      %StartLine=1;
      %EndLine=Editor.Lines;
    $End

    %Count=%EndLine-%StartLine+1;
    %i=%StartLine;
    Editor.Undo(0);
    $Rep(%Count)
      $If(Len(Trim(Editor.GetStr(%i)))==0)
        Editor.DelLine(%i);
      $Else
        %i=%i+1;
      $End
    $End
    Editor.Undo(1);
Стековые закладки
Функция | Описание
E=bm.push() | Добавить закладку с текущими параметрами.
E=bm.pop() | Восстановить параметры из последней закладки и удалить её.
E=bm.add() | Добавить закладку с текущими параметрами и обрезать "хвост" (все закладки с индексом больше текущего).
E=bm.del([Idx]) | Удалить закладку с указанным индексом Idx. Если параметр Idx не указан или равен 0 - удаляется текущая закладка.
E=bm.clear() | Очистить все закладки.
E=bm.next() | Перейти на следующую закладку.
E=bm.prev() | Перейти на предыдущую закладку.
E=bm.back() | Перейти на предыдущую закладку. Если непосредственно перед ней была вызвана bm.add - добавить перед переходом закладку с текущими параметрами.
N=bm.goto([Idx]) | Перейти на закладку с указанным индексом Idx. Если параметр Idx не указан или равен 0 - переход на текущую закладку.
N=bm.get(Idx,Param) | Получить параметры закладки с индексом Idx. Idx=0 - текущая закладка. Параметр Param может быть одним из следующих:
Param | Описание
--- | ---
0 | номер текущей строки
1 | номер текущей колонки
2 | номер первой видимой колонки на экране
3 | номер первой видимой строки на экране
N=bm.stat([Param]) | Получить информацию о закладках. Параметр Param может быть одним из следующих:
Param | Описание
--- | ---
0 | текущее количество закладок
1 | индекс текущей закладки (возвращает 0 если закладок нет)
Пример работы с закладками: Для редактируемого файла `newarc.ModuleManager.cpp` вставляет в начало
    #ifndef __NEWARC_MODULEMANAGER_CPP__
    #define __NEWARC_MODULEMANAGER_CPP__
в конец
    #endif //! __NEWARC_MODULEMANAGER_CPP__
при наличии строки "`#pragma once`" в начале файла, строки вставляются после неё.
    %d = "__" + UCase(Replace(FSplit(Editor.FileName,12),".","_"))+"__";
    bm.add()
    CtrlHome
    $If (LCase(Trim(Editor.Value))=="#pragma once")
      Down
    $End
    print("#ifndef " + %d + "\n\t#define " + %d + "\n")
    CtrlEnd
    Enter
    Home
    print("#endif //! " + %d + "\n")
    bm.next()
    bm.del()

### Замечания

1. Нумерация строк в редакторе начинается с 1.
2. Нумерация колонок (позиций курсора в строке) начинается с 1.
3. Нумерация закладок начинается с 1.

Смотрите также:
Примеры