Своё меню: разбираемся за десять минут

Кому-то может не нравиться стандартное меню Total Commander. Во-первых, оно английское, а во-вторых - оно не такое уж и функциональное. Проблемы эти, в принципе, решаются установкой пакета русификации от Константина Власова и Вадима Казакова, но ведь может быть и так, что вам не нравится ни одно из существующих меню, и вы хотите создать своё собственное. Этому я вас сейчас и научу.

Достаём чистый лист :)

Начнём писать своё меню "с чистого листа". Можно, конечно, отредактировать и чужое меню, но для того, чтобы его редактировать, сначала надо разобраться как это сделать. А в самом начале надо разобраться (если не знаете), где меню хранятся, и как их устанавливать.
Это совсем просто. Меню хранятся в файлах *.MNU (WCMD_ENG.MNU, WCMD_RUS.MNU), обычно находящихся в папке %commander_path%/LANGUAGE, и установить их можно в языковых настройках Total Commander.


Выбираем файл меню.

С этим разобрались. Теперь попробуем создать меню, содержащее всего один пункт "Выход".
Для этого создаём пустой файл с расширением MNU (пусть это будет MY.MNU) и открываем его любым текстовым редактором. Записываем в файл строчку

MENUITEM "Выход", cm_Exit



Сохраняем, и выбираем MY.MNU как главное меню TC. У нас получилось вот это:



Можете проверить - при нажатии на "Выход" TC закроется.
И тут у вас наверняка возник вопрос: "А откуда у нас взялся пункт "Запуск", мы же в меню его не добавляли!?". А дело в том, что "Запуск" присутствует всегда, его можно только переместить, но не убрать.
Но об этом чуть позже, а сейчас вернёмся к нашим баранам, и разберёмся в том, что мы сейчас написали.

MENUITEM - указание на то, что это пункт меню. Просто обязательное служебное слово.
"Выход" -название пункта меню.
cm_Exit - внутренняя команда Total Commander, выполняющаяся при нажатии пункта меню. Тут остановимся поподробнее.
Где взять список этих команд и их описание? Ну, тут всё просто, и то и другое находится в файле totalcmd.inc, лежащем в папке с самим TC. Однако я бы рекомендовал использовать не оригинальный, а переведённый файл из вышеупомянутой справки - хотя бы из-за его переведённости (и, как следствие, лучшего понимания).


Переведённый файл totalcmd.inc

Можно использовать как символьный идентификатор команды, так и числовой (число, указанное после знака равенства). То есть, в нашем случае строки

MENUITEM "Выход", cm_Exit
MENUITEM "Выход", 24340
MENUITEM "Выход", $5F14

будут равнозначны. В последней строке указан шестнадцатеричный номер команды (после символа $),
Предпочтительнее использовать именно числовые значения (неважно, десятичные или шестнадцатеричные), хотя бы потому, что для работы символьных названий требуется обязательное наличие totalcmd.inc в папке TC. Впрочем, разница в том, что использовать, не так уж и существенна, решайте сами. Я в дальнейших примерах буду использовать символьные идентификаторы, т.к. они более наглядны.

Ой, оно выпадает

Следующий шаг - это создание выпадающего меню. Согласитесь, иметь однострочное, несгрупированное меню неудобно, удобнее раскидать "родственные" команды по подгруппам, и оформить как выпадающие менюшки. Сейчас мы это сделаем.

Итак, выпадающее меню создаётся следующим образом:

POPUP "Файл"
MENUITEM "Выход", cm_Exit
END_POPUP


А выглядит это так:



Общий принцип создания выпадающего меню, думаю, ясен.
POPUP и END_POPUP - служебные слова, открывающие и закрывающие выпадающее меню, между ними располагаются пункты меню, описанные так, как указано выше. После POPUP в кавычках идёт название меню, в нашем случае - "Файл".

Чуть-чуть изменим наше выпадающее меню:

POPUP "&Файл"
MENUITEM "Вы&ход\tAlt+F4", cm_Exit
END_POPUP


Что мы сделали:
Добавление амперсанда (&) в названии команды или меню делает следующую за ним букву "горячей". Т.е. для быстрого доступа к этой команде надо нажать Alt+горячая буква. В нашем случае по Alt+Ф будет активироваться меню "Файл", а при последующем нажатии Alt+Х - срабатывать команда "Выход".
Важно: текущая раскладка имеет значение. В нашем случае комбинации Alt+A и Alt+[ не будут работать, т.к. мы "пометили" кириллические символы.
А ещё мы добавили странное сочетание \tAlt+F4 к названию команды "Выход". Это вспомогательная возможность для добавления подсказки к пункту меню. Обычно сюда вписывают соответствующую этому пункту меню горячую клавишу (выход всегда работает по Alt+F4, поэтому я и вписал эту комбинацию). Формат команды с подсказкой будет такой: "Имя команды\tПодсказка".
Важно: вписывание клавиатурного сочетания в качестве подсказки вовсе не привязывает сочетание к этому пункту меню. Это просто подсказка, в которой можно вписать что угодно:



Теперь можно попробовать создать вложенное меню как на скриншоте:



Код приведённого меню очень прост:

POPUP "&Файл"
POPUP "&Печать"
MENUITEM "Печать файла под &курсором\tAlt+Ctrl+Shift+P", cm_PrintFile
END_POPUP
MENUITEM "Вы&ход\tAlt+F4", cm_Exit
END_POPUP

Мы просто "вкладываем" код ещё одной выпадающей менюшки внутрь выпадающей. После того, как понимаешь всю простоту такого решения, хочется побаловаться, сделав нечто вроде этого:



Побаловались - и хватит :), осталось последнее, что нам нужно знать. Это - три директивы SEPARATOR, STARTMENU и HELP_BREAK.

Делим, стартуем, и ещё раз делим

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

POPUP "&Файл"
POPUP "&Печать"
MENUITEM "Печать файла под &курсором\tAlt+Ctrl+Shift+P", cm_PrintFile
END_POPUP
MENUITEM SEPARATOR
MENUITEM "Вы&ход\tAlt+F4", cm_Exit
END_POPUP



Видите, между подменю "Печать" и пунктом "Выход" появился разделитель? Это оно и есть.

Следующая директива STARTMENU обозначает то самое меню "Запуск". Вставить его можно куда угодно (и, как мы уже убедились, если его не вставить, оно всё равно пролезет :)), можно оставить в основном меню, как это сделано по умолчанию, а можно поставить как подменю. Демонстрирую код и то, как это выглядит.

1. Ставим "Запуск" перед "Файл":

STARTMENU
POPUP "&Файл"
POPUP "&Печать"
MENUITEM "Печать файла под &курсором\tAlt+Ctrl+Shift+P", cm_PrintFile
END_POPUP
MENUITEM SEPARATOR
MENUITEM "Вы&ход\tAlt+F4", cm_Exit
END_POPUP



2. Ставим "Запуск" как подменю в "Файл":

POPUP "&Файл"
STARTMENU
POPUP "&Печать"
MENUITEM "Печать файла под &курсором\tAlt+Ctrl+Shift+P", cm_PrintFile
END_POPUP
MENUITEM SEPARATOR
MENUITEM "Вы&ход\tAlt+F4", cm_Exit
END_POPUP



STARTMENU можно вставить только один раз. Если вписать его несколько раз, то корректно "Запуск" будет отображаться только в последнем случае. Сам "Запуск" настраивается средствами самого TC отдельно.

Третья директива HELP_BREAK также может применяться только один раз. Служит оно для создания разделителя между пунктами основного меню. Все пункты, идущие до HELP_BREAK, будут помещены на левой стороне окна TC, а идущие после - на правой стороне. Следующий код, к примеру, разносит наше меню "Файл" и меню "Конфигурация" (которое я создал для демонстрации примера):

POPUP "&Файл"
POPUP "&Печать"
MENUITEM "Печать файла под &курсором\tAlt+Ctrl+Shift+P", cm_PrintFile
END_POPUP
MENUITEM SEPARATOR
MENUITEM "Вы&ход\tAlt+F4", cm_Exit
END_POPUP
STARTMENU

HELP_BREAK

POPUP "&Конфигурация"
MENUITEM "&Настройка вида", cm_Config
MENUITEM "Настройки &экрана", cm_DisplayConfig
END_POPUP



Замечу, что на меню "Запуск" этот разделитель ни малейшего влияния не оказывает. Как бы мы ни расположили директиву START_MENU - до или после HELP_BREAK, оно всё равно оказывается на левой стороне.

Использование пользовательских команд в меню

С версии 7.0 Коммандер поддерживает такую полезную вещь, как пользовательские команды. С их помощью в меню можно добавлять запуск внешних приложений. Для примера я подробно распишу, как создать команду, запускающую бесконечный пинг на localhost.
Для начала достаточно вызвать инструмент работы с командами (внутренняя команда вызова cm_CommandBrowser), и выбрать в нём в пункт usercmd.ini:



Нажимаем кнопку "Новая", вводим имя (я ввёл em_ping) и настраиваем команду абсолютно аналогично тому, как это делается при настройке кнопок для панели инструментов:



Сохраняем все изменения. Если есть желание и необходимость, в настройках можно повесить любое сочетание горячих клавиш на только что созданную команду (я использовал Alt+P):



Ну а в наше меню вписываем следующее:

POPUP "&Запуск внешних приложений"
MENUITEM "Ping localhost\tAlt+P", em_ping
END_POPUP


Результат можно видеть на скриншоте, убедиться в работоспособности такой конструкции вы можете самостоятельно.



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

Вот, пожалуй, и всё. Берём любимый текстовый редактор, изучаем totalcmd.inc (там можно найти много интересного) и творим. Если творить собственное чудо менюстроения лень - берём уже имеющееся меню и всласть правим. Если вы допустили какую-то ошибку, TC при загрузке меню сообщит об этом. В сообщении будет описан тип ошибки, и в какой строке она допущена, так что бояться нечего.



Полезно также прочесть раздел справки, посвящённой редактированию главного меню TC.
Удачи вам в ваших экспериментах!

Павел Дубровский
15.02.06