Цветной терминальный вывод от Фортрана - PullRequest
13 голосов
/ 19 июня 2011

Моя программа выводит состояние вычислений на терминал и включает в себя довольно много информации. Я хотел бы, если это возможно, цветовой код частей текста.

Я видел, как это можно сделать в Bash и C ++, ссылаясь на темы на этом сайте. Однако я не смог использовать ничего из этого для достижения того же результата в Фортране (современном). Например, я попробовал этот пример кода, который, по моему мнению, должен работать:

PROGRAM test
    PRINT*, 'A great color is \033[95m pink \033[0m.'
END PROGRAM test

Я бы ожидал, что на выходе получится «Отличный цвет - розовый», где розовый цвет - розовый. Вместо этого я получаю: «Отличный цвет - \ 033 [95м розовый \ 033 [0м». » Я не понимаю, чего мне не хватает.

Если я заменю строку печати в коде на: CALL EXECUTE_COMMAND_LINE ("echo" Великолепный цвет - \ 033 [95m розовый \ 033 [0m. '"), Тогда я получу вывод по желанию. Однако я не хотел бы продолжать вызывать эхо из моего кода. Есть ли способ получить цветной вывод?

Спасибо!

Ответы [ 4 ]

18 голосов
/ 19 июня 2011

Представление escape-символа как \ 033, похоже, не работает для вас.У меня нет удобной проверки на Фортране, но вы можете попробовать явно использовать символ вместо экранирования в стиле c, вызвав функцию преобразования char, то есть сделать реальный символ, вызвав char(27), и встроить его в свойвыходная строка в правильных местах.

5 голосов
/ 18 сентября 2014

Если вы компилируете с ifort, вам нужно скомпилировать, используя "-assume bscc", только тогда вы можете использовать

PRINT*, 'A great color is \033[95m pink \033[0m.'

коды:

[90m=dark grey           [30m=black
[91m=peach               [31m=red
[92m=light green         [32m=green
[93m=light yellow        [33m=yellow
[94m=light blue          [34m=blue
[95m=pink                [35m=purple
[96m=light aqua          [36m=aqua
[97m=pearl white
5 голосов
/ 25 ноября 2013

Это довольно старый вопрос, но я решил добавить свой ответ на случай, если кто-нибудь придет позже (как и я), чтобы найти ответ на этот вопрос.

У меня была такая же проблема, как и у вас, когда я пытался заставить работать escape-последовательности. Я закончил тем, что пошел на справочную страницу для gfortran . поиск 'escape' привел меня к опции компилятора '-fbackslash'. Со страницы руководства:

Измените интерпретацию обратной косой черты в строковых литералах с одиночный символ обратной косой черты для escape-символов "C-style". следующие комбинации раскрываются "\ a", "\ b", "\ f", "\ n", "\ r", «\ t», «\ v», «\» и «\ 0» для оповещения символов ASCII, возврата на одну позицию, подача формы, перевод строки, возврат каретки, горизонтальная вкладка, вертикальная вкладка, обратная косая черта и NUL соответственно. Кроме того, "\ x" nn, "\ u" nnnn и «\ U» nnnnnnnn (где каждый n - шестнадцатеричная цифра) переводятся в символы Юникода, соответствующие указанным кодовым точкам. Все другие комбинации символов, которым предшествует \, не расширяются.

Итак, чтобы заставить escape-последовательности работать в Фортране, все, что нам нужно сделать, это скомпилировать эту опцию. Единственное, что отличается, это то, что мы должны использовать шестнадцатеричные числа вместе с x вместо восьмеричных чисел. В данном конкретном случае вместо \033 мы используем \x1B. Например, PRINT *, "\x1B[31mThis text is red.\x1B[0m напечатает текст красным цветом.

Я думаю, что этот метод определенно предпочтительнее, чем объединение нескольких индивидуально определенных символов каждый раз, когда мы хотим использовать цвет.

2 голосов
/ 17 декабря 2011

Я только что наткнулся на модуль / библиотеку foul , который, кажется, делает именно то, что вы хотите. Я еще не использовал его, но скоро попробую, так как форматирование вывода терминала из моих программ на Фортране было бы очень полезно.

...