Согласно CLTL2, все функции, связанные с модификаторами клавиш, похоже, удалены из стандарта. У SBCL, похоже, ничего из этого нет.
Каково печатное представление символов с модификаторами и как указать их в символьной нотации, если такая нотация есть в Common Lisp?
Другими словами, есть ли в Common Lisp нотация для чтения символов и последовательностей символов с модификаторами, аналогичными тем, что они делают в Emacs: ?\C-q (Ctrl-q) или ?\M-\S-o (Alt-Shift-o).
Целесообразно ли реализовать что-то в виде тех функций, которые удалены из стандарта, если хотелось бы реализовать свои, или есть что-то более широко используемое? В качестве побочного вопроса: известно, почему эти функции удалены из стандарта?
Вероятно, вы говорите о функциях бита управления персонажем , описанных здесь .
В описании проблемы в HyperSpec говорится только:
Более ранние версии Common LISP включали FONT и BITS в качестве атрибутов символьных объектов. Эти и другие поддерживаемые атрибуты считаются атрибутами, определяемыми реализацией, и, если они поддерживаются реализацией, влияют на действие выбранных функций.
В любом случае Стандарт не запрещает реализациям делать что-то вроде этого:
Также допускаются дополнительные атрибуты символов, определяемые реализацией, так что, например, два символа с одним и тем же кодом могут отличаться каким-либо другим, определяемым реализацией, способом.
Не существует стандартного печатного представления символов с модификаторами, поскольку реализации Common Lisp не обязаны поддерживать эти «символы».
Вероятно, лучше вообще не думать о них как о символах, а как о нажатиях клавиш. Обычно нажатие клавиши с модификаторами предназначено для того, чтобы сигнализировать о чем-то, а не для создания символа. Обычный способ справиться с этим — перевести терминал или консоль в необработанный режим, чтобы программа не ждала, пока пользователь нажмет Enter, прежде чем сможет получить ввод. Для этого требуется взаимодействие со средой, что вы можете сделать из C, манипулируя структурой termios в Linux. Вот руководство о том, как заставить это работать.
Вы можете взаимодействовать с кодом C, чтобы сделать это из Lisp. SBCL имеет несколько расширений Posix, которые позволяют вам манипулировать структурами termios
, чтобы вам не приходилось проходить через C. Или вы можете использовать библиотеку, которая сделает это за вас, например, вы можете использовать tribuy-raw-io или нажатие клавиши терминала.
Я надеялся, что SBCL поддерживает sb-posix:tcgetattr
в Windows с помощью некоторых хакерских действий, но я только что проверил исходный код, и это не так. Что касается представления символов с модификаторами: terminal-keypress
использует структуру CL для представления нажатий клавиш с логическими полями для модификаторов Ctrl и Alt.
Я не знаю насчет cygwin, но я примерно на 99% уверен, что msys2 не поддерживает tcgetattr. Я уже использовал консольный API Win32, низкий уровень для чтения и управления стандартным вводом/выводом не является самой большой проблемой. Моя большая проблема заключается в том, должен ли я преобразовать символы в целые числа и замаскировать себя для элементов управления, или лучше использовать список или defstruct. В любом случае, похоже, мне придется самостоятельно управлять персонажем, что требует некоторых накладных расходов, но тогда я думаю, что все равно буду использовать какую-нибудь собственную очередь событий. Тогда я пропускаю командный цикл SBCL. Честно говоря, мне до сих пор немного неясно, как все устроено.
Да, я именно это имел в виду, извините за неправильную ссылку. К сожалению, стандартного представления не существует. Я знаком с сырыми/приготовленными режимами и различными способами ввода данных. К сожалению, termios непереносится на некоторые ОС, как и ни одна из этих библиотек. Я могу приготовить самостоятельно или пройти через pdcurses на низком уровне, но проблема в том, как представлять в приложении символы с модификаторами. Это почти требует использования моего собственного типа символов и преобразования между типами символов реализации. Падает немного громоздко. Спасибо за вклад! :) Вы подтвердили мои опасения.