Total Commander Knowledge Base

Есть вопрос?

Поищите ответ в самой большой русскоязычной базе знаний по Total Commander!

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

© Copyright
Эта статья защищена авторским правом, и на её правку наложены ограничения.

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

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

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

Редактирование MY.MNU

Начнём писать своё меню "с чистого листа". Можно, конечно, отредактировать и чужое меню, но для того, чтобы его редактировать, сначала надо разобраться как это сделать. А в самом начале надо разобраться (если не знаете), где меню хранятся, и как их устанавливать.
Это совсем просто. Меню хранятся в файлах *.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

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

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, а идущие после - на правой стороне. Следующий код, к примеру, разносит наше меню "Файл" и меню "Конфигурация" (которое я создал для демонстрации примера):

Использование сепаратора HELP_BREAK

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.06.07

Смотри также