I. КАК ИСПОЛЬЗОВАТЬ ДАННЫЙ ДОКУМЕНТ Эта справка писалась параллельно с написанием самого клиента, при этом изменения в коде клиента не всегда отражались в справке. Так что если кто-то обнаружил, что справка уже не совсем соответвует поведению клиента (а так же при обнаружении прочих ошибок, в том числе орфографических), просьба писать на dima@rt.ru. Сам клиент можно взять здесь: http://www.rt.ru/~dima/mmc.dir/ II. ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ. Клиент распространяется на тех же условиях, что и интерпретатор Perl. Это значит что Вы можете выбрать либо GPL, либо Artistic License при модификации и/или распространении клиента. Авторами и владельцами прав на данный продукт и документацию к нему являются: Михаил Мацнев (программа) Дмитрий Ржавин (доументация, тестирование) III. ЧТО ЭТО ТАКОЕ Это - клиент для игры в MUD. Если Вы не знаете, что такое MUD, то, скорее всего, эта программа Вам не нужна. Клиент является посредником между пользователем и игровым сервером. Он получает данные из двух потоков: от сервера и от пользователя. При получении строки от сервера, клиент проверяет, не является ли эта строка приглашением сервера (prom ga или аналогичная команда сильно поможет клиенту находить приглашения), и если является, для ее обработки вызывается специальный триггер. Если эта строка - не приглашение, клиент просматривает список активных триггеров, пытаясь применить их к строке. Если триггер применим к этой строке, выполняется код триггера, строка печатается на экран и обработка этой строки прекращается (если в примененном триггере не предписано другое поведение, см. п. VI). Хочу обратить Ваше внимание, что для приглашения вызывается только специальный триггер, и никакой другой. Реакция клиента на пользовательский ввод будет описана в п. V. IV. КРАТКОЕ ОПИСАНИЕ КЛИЕНТА 1. Обзор возможностей. Основные возможности: - алиасы - определение горячих клавиш - приоритетные триггеры с широкими возможностями их настройки и группировки - автоматическое определение приглашения сервера и возможность создать специальный триггер для его обработки - возможность создавать триггер на некоторые события, генерируемые клиентом, например триггер на сообщение клиента о наступающем игровом часе - встроенный speedwalk - возможность просмотра лога (клавишами PageUp и PageDown) - встроенный таймер - поддержка протокола mccp (Mud Client Compression Protocol) - возможность запускать асинхронные потоки вывода - наличие строки состояния - расширенные возможности редактирования командной строки, включая поиск строк и отдельных слов по истории команд и возможность настраиваемого дополнения слов из списков. - возможность написания файла настроек на языке perl, что позволяет писать триггеры любой сложности. 2. Требования к системе. - OS UNIX или Win*. Программа тестирована на FreeBSd 4.x, Solaris 8 и на Windows 2000/XP/98. - Наличие библиотеки perl версии 5.00503 или выше. (Для Win* эта библиотека включена в пакет с клиентом). 3. Установка. - Распакуйте поставляемый архив. - Перейдите в каталог с файлами программы и посмотрите на его содержимое. Если там нет ни одного исполняемого файла, либо выполнение программы mmc завершается сообщением об ошибке, наберите: ./configure make depend make В результате будет создан выполнимый файл, либо Вам объяснят, почему это невозможно. Выполнимый файл должен называться mmc<номер версии>, mmc<номер версии>.exe или как-то еще в зависимости от операционной системы и желаний автора. В дальнейшем я буду называть его mmc. - Скопируйте mmc и, возможно, библиотеку perl, в какой-нибудь из системных каталогов (или наберите make install). Добавьте теперь каталог, куда был установлен mmc, в $PATH. Если Вы используете tcsh, это делается командой: set path = (/where/mmc/lives $path) Добавьте ее в конец вашего .tcshrc. Если Вы по какой-либо причине используете другой shell, обратитесь к документации по нему. Под Windows клиент состоит из единственного исполняемого фаила, скопируйте его в любое удобное место и запускайте. - Запустите программу. Если все хорошо, она должна напечатать что-то типа: -:- Loading {/root/.mmc4rc}... -:- MMC v4.1.9999 by Mike E. Matsnev mmc> 4. Параметры командной строки и переменные окружения -c - показывать состояние дополнения в строке состояния. -f - сохранять историю команд в отдельный файл. -h, -? - справка по ключам -i - добавить path в список каталогов, в которых клиент будет искать модули, можно указывать несколько раз. -k - показывать в строке состояния коды нажимаемых клавиш. Удобно для настройки горячих клавиш. -n - не показывать состояние соединения в строке состояния. -p - показывать префикс в строке состояния. (см. команду /prefix) -r - не перезаписывать файл настроек при выходе из клиента. -s - местоположение строки состояния. Возможные значения: 0 - строка состояния выключена 1 - строка состояния над приглашением 2 - строка состояния под приглашением (установка по умолчанию). - файл с пользовательскими настройками. $MMC - место хранения файлов клиента по умолчанию. $HOME - домашний каталог пользователя. Используется вместо $MMC, если $MMC не определена. Под Windows, если файл настроек не найден, он создается в той директории, где находится исполняемый файл mmc.exe. 5. Встроенный редактор. Для редактирования командной строки определены следующие команды: -@, -пробел - установить маркер -A - в начало строки -B = стрелка влево -E - в конец строки -F = стрелка вправо -K - Удалить в буфер все от текущей позиции курсора до конца строки -N = стрелка вниз -O - скопировать в буфер все от текущей позиции курсора до маркера -P = стрелка вверх -U - удалить все из командной строки -V - вставляет в строку указанный далее символ, даже если этот символ непечатный -W - удалить в буфер все от текущего положения курсора до маркера -X - поменять местами курсор и маркер -Y = Ins, вставить из буфера -/ - поиск слов по истории -_ - вставить последнее слово предыдущей команды -backspace - удалить предыдущее слово в буфер -d - удалить слово в буфер - - удалить слово в буфер -k - удалить в буфер все от текущего положения курсора до начала строки -n - поиск строки вниз по истории -p, -up - поиск строки вверх по истории , -left - слово влево , -right - слово вправо , -down - записать текущую строку в историю команд не выполняя ее стрелки, Del, Home, End (последние 2 - не у всех ;) - контекстно-зависимое добавление по словам. Для его использования нужно сначала создать список слов (например, командой tabadd, см. п. V), и потом, если вы наберете начало одного из этих слов и нажмете , клиент сам дополнит это слово. Пример использования - создать список группы (например, триггером) и использовать дополнение для более быстрого набора имен одногруппников для спасения или лечения: action {^Your group of ([0-9]+) members consists of:} {/set members ($1+3);/set curr 0;/enable GBUILD} {2000f:CORE} action {^\s*(\w*)} {/set last $1;/set curr ($curr+1);/if {$curr > $members} {/disable GBUILD} {/if {$curr > 3} {/tabadd $last}}} {1500f-:GBUILD} Замечание: Для уменьшения спама от таких триггеров я предлагаю выключить подтверждение. Как это сделать рассказано в п. X. Более подробно о настройке дополнения будет рассказано в п. IX. - листать буфер окна на страницу вверх - листать буфер окна на страницу вниз - - листать буфер окна на строку вверх - - листать буфер окна на строку вниз -q - выключить режим просмотра буфера /-m - завершить ввод команд, текст отправляемый на сервер будет предваряться префиксом (см. команду /prefix) -/--m - завершить ввод команд, текст отправляемый на сервер не будет использовать префикс Действия последних двух клавиш можно менять местами с помощью команды /noprefix V. КОМАНДЫ ПОЛЬЗОВАТЕЛЯ. Я буду использовать следующие соглашения: <текст> - на этом месте должно стоять что-то, подпадающее под описание внутри угловых скобок. [текст] - параметр, указанный внутри квадратных скобок, можно опускать. txt1|txt2 - должно быть либо txt1, либо txt2. pattern - параметр понимается как shell pattern. pattern может содержать символы '*' и '?', если не указаны дополнительные ограничения. regexp - параметр понимается как perl regexp (см. п. VI). ==> <текст> - в примерах: клиент послал серверу <текст> Клиент интерпретирует пользовательский ввод следующим образом: 1) поиск "горячих кнопок". Предписанные действия выполняются как только пользователь нажал соответствующую комбинацию клавиш. (Пример - клавиша , которая заставляет клиент проинтерпретировать введенный пользователем текст). Обработка всего остального пользовательского ввода осуществляется только после нажатия . 2) разбор пользовательского ввода. На этом этапе происходит разбиение введенной пользователем строки на слова и команды. Вы можете указывать несколько команд в одной строке, разделяя их символом ';'. Результат будет точно такой же, как если бы эти команды набирались пользователем последовательно одна за другой. Единственное ограничение - определенные в этой строке команды и алиасы не будут применяться в этой строке, даже если определение и использование этой команды или алиаса разделены символом ';': /alias xxx ZZZ;xxx -:- {xxx} aliases {ZZZ}. ==> xxx Слова (команды, алиасы и их аргументы) разделяются символами <пробел>. Если вам необходимо передать символ ';' или <пробел> в команду, перед ним надо поставить символ '\'. Сам символ '\' можно передать в команду, указав его дважды. Пример: /showme \\\;. Еще один способ передать строку, содержащую символы ';', '\' - это указав всю строку в фигурных скобках, вот так: /showme {\;}. Все, что указано в фигурных скобках, будет передано команде. Пример использования: /alias test {/showme $var} -:- {test} aliases {/showme $var}. /var var FOO -:- {var} is now set to {FOO}. test -:- FOO /var var BAR -:- {var} is now set to {BAR}. test -:- BAR 3) поиск алиасов. Алиасы ищутся только с первого символа введенной пользователем команды. Поскольку большинство игровых серверов игнорируют пробелы в начале команды, такая схема поиска алиасов позволяет легко послать игровому серверу команду, совпадающую с названием алиаса. Например: alias quit say I'm so stupid today. quit - пошлет серверу команду say I'm so stupid doday. quit - пошлет серверу команду quit Если алиас найден, описанная в алиасе замена производится, и полученная строка обрабатывается, как будто она только что введена пользователем (то есть с п. 2). Пример: /alias ZZZ /alias xxx foo\\\;bar\;xxx (можно было бы написать и /alias ZZZ {/alias xxx foo\;bar;xxx}) -:- {ZZZ} aliases {/alias xxx foo\;bar;xxx}. сейчас алиас ZZZ только определен, но не выполнен: /alias -:- Defined aliases: -:- {ZZZ}={/alias xxx foo\;bar;xxx} теперь мы его выполним: ZZZ -:- {xxx} aliases {foo;bar}. ==> xxx при его выполнении был определен новый алиас, но он не был применен, так как он определен в той же строке, что и использован. Сейчас список алиасов выглядит так: /alias -:- Defined aliases: -:- {xxx}={foo;bar} -:- {ZZZ}={/alias xxx foo\;bar;xxx} И теперь алиас xxx будет применяться: ZZZ -:- {xxx} aliases {foo;bar}. ==> foo ==> bar Поскольку алиасы ишутся до пользовательских команд, можно делать даже такие алиасы: /alias /q /quit 4) поиск команд в пользовательском вводе. Все команды клиенту (и только они) должны начинаться со специальной определяемой последовательности символов. По умолчанию, это '/' (без кавычек). Если первым символом введенной пользователем команды оказывается '/' (точнее, строка, назначенная пользователем, см. команду /char), такая команда понимается как команда клиенту. Команды клиенту можно сокращать до любого префикса, однозначно определяющего команду. Встроенные в клиент команды: quit - выход из клиента. connect [] - установить соединение с addr:port с локального адреса local address. Если не указан, берется один из адресов машины. Если соединение уже было установлено, оно предварительно закрывается без предупреждения. dc - завершить соединение. alias - показать активные алиасы alias - показать алиасы, подпадающие под pattern. alias - Создает новый алиас. Алиасы используются следующим образом: начало команды, введенной пользователем, проверяется на совпадения с существующими алиасами. Команда считается совпавшей с алиасом, если эта команда начинается на часть алиаса, и после нее идет пробельный символ. Тогда остаток команды интерпретируется как список аргументов алиаса, и вместо _всей_ команды подставляется строка . Подставить в аргументы можно, указав явно, \$1 для первого аргумента, \$2 для второго и т. д. \$0 заменяется на все введенные аргументы. Пример: alias bs bash\;stand alias bst bash \$1\;stand unalias - удаляет алиасы, соответствующие pattern. variable variable variable set - создание и просмотр пользовательских переменных. К созданным переменным можно обращаться, указав $name. Замечание: надо указывать без символа '$'!!! Если Вы напишете $name, то вместо $name будет подставлено значение переменной name! А соответственно, значение будет присвоено переменной, имя которой совпадает со значением переменной name. Вот как это выглядит: /var foo bar -:- {foo} is now set to {bar}. /set $foo hi! -:- {bar} is now set to {hi!}. /var -:- Defined variables: -:- {foo}={bar} -:- {bar}={hi!} set отличается от variable тем, что у set существует только одна форма (set ), и, если является арифметическим выражением, заключенным в круглые скобки, то присваивается результат вычисления этого выражения. Кроме того, при установе значения с помощью set на экран не печатается подтверждение действия. Пример: mmc> /set a 1+2 mmc> /set b (1+2) mmc> /var -:- Defined variables: -:- {a}={1+2} -:- {b}={3} unvariable - удаляет переменные. Знак "$" указывать не надо! (см команду var). showme <список текстовых строк и переменных> - печатает все это пользователю на экран как сообщение клиента (то есть с префиксом -:- ). echo <список текстовых строк и переменных> - тоже печатает пользователю на экран, только без префикса клиента, но зато позволяет печатать цветные сообщения. Цвета указываются так: &<буква>. Например: /echo &JTHIS IS A TEST ONLY!!! wecho <номер окна> <список текстовых строк и переменных> - тоже самое, но в любое окно send - посылает сообщение игровому серверу, минуя обработку алиасов. Переменные по-прежнему подставляются. Рекомендуется для использования в триггерах для предотвращения возможной подстановки алиасов в командах. ps - печатает список выполняемых асинхронных задач. kill [] - прекращает выполнение асинхронной задачи с идентификатором task_id. Если не указан, прекращает выполнение последней асинхронной задачи. char - печатает символ, используемый для команд клиенту. char <строка> - определяет, какой префикс будет использоваться для команд клиенту. Пример: /char {hey, you! } bind - команда bind позволяет пользователю определять "горячие кнопки", то есть позволяет назначить функции на нажатие клавиш пользователем. Без параметров она покажет определенные пользователем кнопки, bind -a покажет все назначенные функции, включая функции редактора, назначенные самим клиентом. Первым параметром указывается обозначение кнопки (с приставкой C- для обозначения и M- для . Например: /bind C-C /quit будет вызывать /quit при нажатии -C). Если указан только один параметр, кнопка, клиент распечатает определенную на нее реакцию. Пример: /bind C-C /quit - -c = --c = /quit /bind C-c /quit - то же самое, регистр не важен /bind M-c /connect mud.arctic.org 2700 - по -c /bind M-C /dc - дисконнект по --C. /bind f1 {recite recall} - читаем recall по F1 unbind <кнопка> - удалить горячую кнопку. bell - бип cr - послать игровому серверу пустую строку nop - ничего не делает action - создает триггер (см п. VI) substitute [] - простой триггер, который заменяет во всех пришедших от сервера строках на при выводе на экран. Подробнее см. п. VI. gag [] - простой триггер, который при получении строки, соответствующей , ничего не делает и не печатает полученную строку. Обычно включается для малоинформативных и мешающих сообщений, чтобы они не захламляли экран. Пример: gag {^Morgion tells you} xsub [] - объединяет возможности action и substitute. unaction <группа> - удалить группу триггеров enable <группа> - разрешить группу триггеров disable <группа> - запретить группу триггеров log [-c] [<имя файла>|off [номер окна]] - включает/выключает лог. Если лог уже был включен, старый файл с логом предварительно закрывается. При указании ключа -c, в лог будут записывать и ansi последовательности для смены цвета. Если указан номер окна, то содержимое буфера окна будет записано в лог, это полезно, если вы не ведете лог постоянно, а в игре произошло что-то интересное, что хочется сохранить. tabadd <слово> tabdelete <слово> - добавить/удалить слово в список дополнений (см. п. IV.5). tablist - посмотреть список дополнений perl - написать прямой вызов на перле. tickset - сказать клиенту, что только что наступил новый игровой час. ticksize