Ed, man! man ed!

Это новый текстовый редактор, который используется теперь вместо устаревшего OLCшного. Синтаксис позаимствован из стандартного юниксового строчного редактора ed, потому многим, привыкшим к командной строке vim, будет удобно.

Коментарии к этой доке

Выражения в различных скобках означают когда их писать обязательно, а когда нет, и что будет, если их не написать:
<bubu> в этом месте обязательно должен присутствовать bubu. если ничего не написать на этом месте, то будет ошибка.
[bubu] bubu можно не писать, что тогда будет - читать в коментариях к этой конструкции.
(bubu) если не написать ничего, то работать будет так, будто написано bubu.

Например: запись (.,.)p означает, что команда p это то же самое что и .,.p

Специальные обозначания

Следующие обозначения используются при описании синтаксиса команд

рег.выр

Регулярное выражение (regular expression). Используется для поиска по шаблону. Как правильно шаблоны писать в этой доке не описывается.

метка

Обозначается одним символом. Метка. Используется для запоминания адресов строк.

рег

Регистр обозначается одим символом. Содержит блок строк. Используется для копирования блоков.

число

Последовательность цифр от 0 до 9. Представляет собой десятичное число в традиционной записи

Строковый редактор

Редактор может быть в двух состояниях (режимах). В первом вводятся команды, во втором построчно вводится текст. Состояние редактора отображается в промпте. При старте редактор находится в режиме ввода команд.

Режим ввода команд

В командном режиме промпт состоит из символа : (двоеточие). Команды редактора имеют следующий общий синтаксис:

[адрес[,адрес]]имя_команды[параметры]

адрес

адрес можно считать номером строки в редактируемом тексте. Указать адрес можно указать одним из следующих способом:
<число> порядковый номер строки в редактируемом тексте, начиная с 1.
. текущая строка.
+<число> порядковый номер строки, начиная с текущей. (+1 - следующая строка, +2 - после-следующая, и т.д.)
-<число> порядковый номер строки в обратную сторону, начиная с текущей. (-1 - предыдущая строка, -2 - пред-предыдущая, и т.д.)
$ последняя строка
'<метка> строка помеченная символом метка
/<рег.выр>/ следующая строка, найденная регулярным выражениием рег.выр. Поиск начинается со следующей за текущей строки.
?<рег.выр>? предыдущая строка, найденная регулярным выражением рег.выр. Поиск начинается с предыдущей строки, относительно текущей.

В случае, если <рег.выр> пустое, оно считается равным последнему используемому. Если адрес указываемый с помощью символов /, или ? единственный, а используемая команда безымянна (см ниже список комад), второй символ /, или ? указывать не обязательно. То есть, строка содержащая только символ / - правильная команда редактора и означает найти, показать и сделать текущей следующую строку удовлетворяющую последнему указанному регулярному выражению.

Кроме этого, над адресами действуют арифметические операции + (плюс) и - (минус). Это значит, что если адрес это выражение определенное любым из указанных выше правил, то выражение <адрес>+<число> и <адрес>-<число> - тоже правильный адрес строки. То есть, выражение $-1 означает предпоследнюю строку в редактируемом тексте, а /test/+1 - следующую за содержащей слово test строку.

Многие команды могут оперировать с блоком строк. В этом случае такой команде можно передавать два адреса: первый - адрес первой строки блока и второй - адрес последней строки блока.

Для краткости пару адресов 1,$ (весь текст с первой строки по последнюю) можно обозначить символом % (процент).

имя_команды

Команда - один символ. Вот список всех команд и объяснение значений их параметров. В скобках перед именем команды указано значение по умолчанию для адресов, передаваемых команде. Плюсы и двоеточия в примерах обозначают текущий промпт. Писать их не надо. Строки не начинающиеся с символов промпта отражают вывод редактора. Их тоже не надо писать.

(+1) "безымянная" команда .
принимает единственный адрес, печатает строку по этому адресу и делает ее текущей. Так, к примеру, команда /test означает найти, показать и сделать текущей строку, содержащую слово test. Как указано в скобках, если этой команде не передать ядрес явно, используется адрес следующей за текущей строкой. То есть, если просто давить enter, можно построчно листать содержимое.

(.,.)p напечатать блок.
Принимает в параметры два адреса - начало и конец блока, который необходимо напечатать. Последняя напечатанная строка становится текущей. Если адреса не указывать, команда p напечатает текущую строку, что и соответствует блоку, определяемуму парой адресов .,..

(.,.)n листинг.
аналог комнды p, с тем исключением, что команда n предваряет каждую печатаемую строку ее номером, относительно начала редактируемого текста.

(.,.)d[рег] удалить блок определяемый диапазоном адресов.
Содержимое удаленного блока сохраняется в регистре рег. Если рег не указан, используется регистр поумолчанию. Строка следующая за последней удаленной становится текущей. Аналогично p, если не указывать адресов, удаляет текущую строку.

Пример:

: 1d        -- удалить первую строку.

Еще пример см. ниже.

(.)a добавить текст, после указанного адреса.
Эта команда переводит редактор в режим построчного ввода (см. начало этого хелпа). Чтоб завершить ввод добавляемого текста, введите строку состоящую из одной точки. Последняя добавленная строка становится текущей.

Пример: Пускай текст содержит:

1
2
3

Выполним:

: $a                - добавить текст после последней строки.
+ bebe              - добавляем строку bebe
+ mumu              - добавляем строку mumu
+ .                 - конец ввода

Тепер текст выглядит так:

1
2
3
bebe
mumu

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

Пример: Пускай текст содержит:

1
2
3

Выполним:

: $i                - вставить текст перед последней строкой.
+ bebe              - добавляем строку bebe
+ mumu              - добавляем строку mumu
+ .                 - конец ввода

Тепер текст выглядит так:

1
2
bebe
mumu
3

(.,.)c[рег] объединяет в себе две команды "d" и "i".
Команде d передаются те же адреса, что и c, а i - следующая строка за последней удаленной. Удаленный текст запоминается в регистре рег, как и в команде d. Таким образом, команда c заменяет переданный ей блок на введенный пользователем в режиме построчного ввода. Последняя добавленная строка становится текущей.

Пример:

: %c             - заменить весь редактируемый текст на ...
+ meme           - строку meme ...
+ .              - и все.

(.)m<метка> пометить позицию.
Присваивает метке символ указанный команде адрес. Адрес текущей строки не модифицируется.

Пример: Пускай текст содержит:

0
>>bu<<
8
7
<<bu>>
5

Выполним:

: 1                - показать и перейти к первой строке 0
: /bu              - поиском вперед найти, показать и сделать текущей строку содержащую bu >>bu<<
: mq               - присвоить текущей строке метку q
: /                - продолжить поиск bu со следующей строки <<bu>>
: 'q,.d            - удалить строки начиная с >>bu<< и заканчивая <<bu>>

(.)k<метка> синоним команды "m".

(.,+1)j Объединить строки блока.
Заменяет в блоке переводы строки на пробелы. Склеенная строка становится текущей.

Пример: Пускай редактируемый текст содржит:

9
8
7
6
5
4

Выполним:

: /8/,/6/j     - склеить строки начиная со втрой и кончая четвертой

Текст после выполнения команды:

9
8 7 6
5
4

(.,.)!<стр> Выполнить "внешнюю" команду стр.
Внешней команде передется в парамаетры содержимое блока определяемого диапазоном адресов. Результат выполнения вставляется на место указанного блока.

Для фени (редактор, вызываемый методом персонажа edit( )) стр интерпретируется как выражение языка фени. На момент вычисления выражения контекст содержит переменные ch (персонаж, выполняющий команду редактора) и text (строка, содержащая исходный вариант блока). Результат вычисления выражения используется как результат выполнения внешней команды.

Для тексового редактора вызванного из OLC существует только две специфические внешние команды. Как видно из примеров, имена этих команд можно сокращать. Все остальные варианты стр обрабатываются как обычные игровые команды, блок при этом не модифицируется.

justify Форматировать по ширине
Форматирует абзац текста по ширине.

Команде justify можно передать два параметра:
# значение по умолчанию
1 количество пробелов в начале абзаца 8
2 ширина абзаца в символах 70

Пример:

%!j 4 20      - отформатировать весь текст по ширине в 20 
                символов с отступом из 4х пробелов.

show показать блок в цвете.
Пример:
%!s           - показать как будет выглядеть весь текст с учетом цветов.

(.,.)Y[рег] Копировать (yank).
Запомнить в регистре рег содержимое блока, указанного диапазоном адресов. Последняя скопированная строка блока становится текущей.

Пример: Пускай текст содердит:

ляляляля
{       
бубубубу
бебебебе
}       
ляляляля
ляляляля

Выполним:

: /{/,/}/Y   - запоминаем в регистре поумолчанию все строки 
	       между открывающей и закрывающей фигурной 
	       скобкой, включая строки со скобками.

(.)P[рег] Вставить содержимое регистра рег после указанного адреса.
Последняя вставленная строка становится текущей.

Пример:

: $P         - вставить содержимое регистра поумолчанию в
               конец редактируемого текста.

(.,.)s[парам] Найти и заменить подстроку в указанном диапазоном адресов блоке.
Параметр начинается с символа-разделителя и состоит из трех частей, разделенных одним и тем же символом. Так s/aa/bb/ то же самое что и s%aa%bb%.

Первая часть параметра - регулярное выражение (определяет что именно надо заменить).

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

Треья часть содержит флаги, состоящие из последовательности символов:
p печатать каждую замену на экран
g заменять все вхождения регулярного выражения в строку, а не только первое.

Пример:

: %s/да/нет/g        -- заменить во всем тексте "да" на "нет"

Еще пример: Пускай текст содердит:

ляляляля
{       
бубубубу
бебебебе
}       
ляляляля
ляляляля

Выполним:

: /{/+1,/}/-1s/^/    /  -- в каждой строке после {, но до }
                           добавить в начало четыре пробела.

Текст после выполнения команды:

ляляляля
{       
    бубубубу
    бебебебе
}       
ляляляля
ляляляля

u Откат.
Отменяет изменения сделанные предыдущей командой. Число хранимых изменений не ограничено. То есть, в любой момент можно вернуться к начальному варианту редактируемого текста.

q Завершить редактирование.

Режим построчного ввода

В режиме построчного ввода промпт состоит из символа + (плюс). Вводимый текст будет как есть добавлен в редактируемый буфер. Вернуться в комманднай режим из режима построчного ввода (завершить построчный ввод текста) можно введя строку состоящую из ровно одно символа . (точка).