Объяснение будет длинным, а начинать его придется издалека.
В "обычных" программах, написанных для Windows, используется механизм обработки событий, в том числе нажатия различных клавиш. Если пользователь нажал определенную клавишу или сочетание клавиш, возникает соответствующее событие, которое можно обработать.
Как правило, на клавишу ESC привязываются действия, ассоциирующиеся у человека с отменой чего-то. Если в диалоговом окне есть кнопка Отменить, то, весьма вероятно (но не обязательно) что нажатие ESC будет эквивалентно щелчку по Отменить, или по кнопке закрытия окна.
У нас используется много диалоговых окон с GUI-интерфейсом и там ESC обрабатывается таким образом.
Это различные файловые диалоги и другие подобные им окна.
В LISP-программах исторически сложилась иная ситуация. Это древний язык 1952 года рождения, а в AutoCAD изначально был включен один из диалектов LISP, получивший после "привязки к местным условиям, имя AutoLISP. Одновременно с лучшими качествами были унаследованы и недостатки.
Клавиши ESC, к которой привыкли пользователи современных компьютеров - потомков IBM-PC, когда-то вообще не было, как и многих других клавиш. И клавиатур сначала не было! А языки программирования были. Потом клавиатуры появились, но разных конструкций (ветераны помнят эти времена). Программы часто управлялись с помощью ввода управляющих последовательностей символов. Сейчас их называют горячими клавишами.
Одной из управляющих последовательностей была ^C, предназначенная для прерывания действий. На клавиатуре PC это соответстует сочетанию Ctrl+C. В AutoCAD она так и осталась в макроопределениях меню. Вот это и был аналог ESC, а позже с этой последовательностью связали и клавишу ESC (после появления Windows-версий AutoCAD, так как в Windows-программах горячим клавишам Ctrl+C обычно назначается операция копирования в буфер).
Теперь разберем, где же она применяется.
Штатные, "стандартные" команды AutoCAD, как правило, имеют возможность досрочного прерывания или завершения клавишей ESC, хотя и имеются другие варианты штатного завершения. Обычно это действие по умолчанию (нажатие пробела или Enter). Прерывание будет выполнено и при выборе пункта меню до завершения работающей команды. Если это не пункт меню с прозрачной командой. Для этого в макросе меню и записаны символы ^C, эмулирующие нажатие ESC. При прерывании штатной команды AutoCAD ничего страшного не происходит - просто вылетает сообщение *Cancel*.
С программами написанными на LISP все сложнее. Такая программа не является приложением Windows, любое из которых управляется событиями. Обработку нажатий клавиш выполняет сам AutoCAD.
Если в Windows-приложении нажатие ESC может прервать выполнение какого-то участка кода, то AutoLISP изначально был сделан так, что при нажатии ESC прерывалась вся программа и вступала в работу специальная функция *error*. Эта функция и должна была сделать что-то необходимое при нештатной ситуации. Если программист не предусмотрел такой функции, то просто вылетает сообщение *Cancel*.
Но в LISP-программах, обычно вначале, выполняются различные настройки системных переменных. При завершении или прерывании хорошая программа должна восстановить системное окружение. Штатный выход, предусмотренный программистом, обычно предусматривает и восстановление окружения. А вот при нештатном выходе программа не дорабатывает до конца и окружение не восстанавливается.
Вот отсюда и многие беды, по поводу которых постоянно задаются вопросы на форумах. Люди используют некорректно написанные "довески", прерываю их работу, а потом жалуются, что пропало то одно, то другое, то третье. Во многом это вина программистов, не умеющих писать функцию обработки ошибок *error*. В книге САПР на базе AutoCAD - как это делается, в главе 10 мы подробно разбирали этот вопрос.
Обычному пользователю эти технические детали не интересны. Ему работать надо, а обеспечить правильную работу должен программист. Самым правильным решением по борьбе с ошибками является предотвращение ошибок в месте их возникновения. Идеальным решением было бы выламывание клавиши ESC у "автокадчиков. Шутка.
В версиях AutoCAD включая 14 нажатие ESC было "ломом, против которого нет приема". Его никак нельзя было перехватить и обработать, а функция *error*, даже правильно написанная, не может предотвратить всех неприятных последствий, особенно при работе "обезьяны с гранатой". Одним из таких последствий является несбалансированность меток отката. В результате при отмене команды может удалиться совсем не то, что ожидал пользователь, и не всегда он может это заметить. Да и срабатывает *error*
после фатального разрушения программы, когда уже "поздно пить боржоми".
Одним из способов борьбы с последствиями прерываний у нас было воспитание пользователей, привитие культуры работы. Само слово Escape означает бегство, спасение, то есть некий нештатный выход из ситуации. Наподобие выпрыгивания из окна с криком - Спасите! Да, такой способ покидания помещения возможен, например при пожаре. Но в обычной обстановке лучше выходить через дверь, особенно если выход явно обозначен.
Воспитание было добровольно-принудительным. В нашей системе InCAD (одном из предков ruCAD) при нажатии ESC в LISP-программах издавлся не очень приличный звук, что вызывало оживленные комментарии окружающих. И люди быстро отучались делать это. Не только в наших программах (у нас-то обработчик ошибок был более или менее хороший), но и в любых "довесках".
После появления дополнительных функций VisualLISP ситуация изменилась. Стало возможным отлавливать ошибки не после, а во время возникновения. Мы получили и возможность контроля над ESC, и вообще над вводом данных, то есть позволять вводить только правильные данные.
А когда вообще может потребоваться нажимать ESC?
1. При зависании и зацикливании программы. Бывают, к сожалению, такие ситуации. Как правило, они вызваны алгоритмическими ошибками в программе, но иногда это не зависти и от программы. Вот тут нажатие ESC может быть единственным средством спасения, причем даже не нажатие, а прижатие на некоторое время. Блокировка ESC в циклах не нужна и опасна - может потребоваться убиение всего AutoCAD.
2. В момент ввода данных. Вот это тот самый спорный момент, на который нам указывают пользователи. Пользователь всегда должен иметь возможность выхода из программы. В наших программах это сделано, и в любой из них в командной строке штатный выход обозначен или действием по умолчанию или в виде опции, явно отображенной в приглашении.
Тут есть нюанс. Штатный выход всегда предусмотрен в самом начале программы, и при цикличном повторении ввода. Например, может быть такой диалог:
Если указана точка, может последовать приглашение:
Вот здесь уже нет штатного выхода, и вторую точку обязательно надо указать. Точка возврата пройдена, или мы уже начали прыжок и вернуться в полете не можем.
Однако воспитание у людей разное, и неприличное в одном месте, считается допустимы в другом. Вот некоторые и писали - Хочу ESC! Хочу! Я так привык!
И даже - "Было бы в ruCAD прерывание по ESC - цены бы этой программе не было!"
Ну что ж, не было бы счастья, да несчастье помогло. При разработке ruCAD-3D выяснилось, что многократную визуальную вставку блоков в трехмерном пространстве с помощью применяемых нами программных ухищрений выполнять невозможно - требуется прерывание цикла именно с помощью ESC. Так как "многократная визуальность" для нас стратегически важнее, пришлось сделать такую вставку с приглашением вместо:
в виде
Здесь уже нет действия по умолчанию для выхода. Ну, а коли уж поступились принципами, то дали возможность нажимать ESC и в других случаях, в качестве дополнения к штатному выходу. Но только в тех случаях, где досрочный выход допустим логикой работы.
Изменение обработки клавиши ESC вошло в ruCAD RC05 Free.