Коды выхода ANSI в GNU Smalltalk

#smalltalk #ansi

#smalltalk #ansi-escape

Вопрос:

Я пытаюсь создать консольную программу, которая использует управляющие коды ANSI в GNU Smalltalk. Кажется, я не могу понять, как печатать объект string, отформатированный с помощью управляющих кодов ANSI. Я пробовал следующее.

 'x1b[31mHi' displayNl
  

При этом выводится вся строка, включая управляющий код, без какого-либо форматирования. Я ожидал, что это выведет «Hi» красным цветом (а затем все остальное в консоли после этого, поскольку я не сбросил цвет.)

Немного погуглив, я смог найти пару проблем в списках рассылки, где люди пытались создавать такие вещи, как новые строки, используя » n». В большинстве ответов использовался метод cr объекта Transcript, но я ничего не нашел о цветах в классе textCollector.

Похоже, создать мой собственный модуль на C для достижения этой функциональности не должно быть так уж сложно, но сначала я хотел бы знать, есть ли способ получше.

Я знаю о привязках ncurses, но я не уверен, что это было бы практично для простого окрашивания определенных фрагментов текста в программе. Итак, существует ли стандартный способ вывода цветного текста на терминал в GNU Smalltalk с использованием управляющих последовательностей ANSI?

Комментарии:

1. Похоже, что комбинация expandMacrosWith и приведение символов к строкам с asString может сработать.

Ответ №1:

В итоге я получил ответ в списке рассылки GNU Smalltalk. Похоже, вы можете использовать оператор интерполяции для достижения этой цели.

Например, ('%1[31mHi' % #($<16r1B>)) displayNl. изменил бы цвет на красный, а ('%1[34mHi' % #($<16r1B>)) displayNl. изменил бы цвет на синий.

По сути, оператор % ищет последовательности, которые выглядят как «% (число)», и заменяет их объектами в массиве справа от оператора. В нашем случае массив содержит один элемент, который является управляющим символом ascii в шестнадцатеричном формате. Таким образом, «%1» в «%1[31mHi’ заменяется управляющим символом, а затем печатается.

(Этот ответ был украден почти дословно у Паоло из списка рассылки GNU Smalltalk.)