Поддержка перемещения курсора управляющей последовательности ANSI

Я делаю простую анимацию ASCII, и мне нужна возможность поместить курсор в произвольную точку на экране консоли.

Во время поиска я нашел этот блог, который показывает, что этого можно добиться, выполнив:

(print (str (char 27) "[2J")) ; clear screen
(print (str (char 27) "[;H")) ; move cursor to the top left corner of the screen

, который использует escape-последовательности ANSI.

Первая строка работает так, как ожидалось, но, к сожалению, мне не удалось найти консоль, которая позволяет второй строке перемещать курсор.

После того, как выяснил, как работают escape-последовательности ANSI, я написал эту функцию, чтобы упростить это использование:

(defn move-cursor-to [x y]
  (print (str (char 27) "[" y ";" x "H")))

Но когда я запускаю (move-cursor-to 10 10), все "консоли", которые я пробовал, выводятся неверно:

  • REPL IntelliJ / Cursive полностью игнорирует это; ничего не печатает.

  • Терминал IntelliJ печатает escape-символ как ? и буквально печатает остальное (?[10;10H)

  • Командная строка Window 10 выводит что-то похожее на терминал IntelliJ, за исключением того, что ?, который он печатает, находится внутри поля.

Я делаю что-то неправильно? Есть ли способ заставить это работать в стандартной командной строке Windows 10?

Я написал это, чтобы заполнить пробелы:

(defn move-cursor-to [x y]
  (let [r #(apply str (repeat % %2))]
    (print (str (r y \newline)
                (r x \space)))))

но это плохое решение. Перед использованием необходимо очистить экран, что неприемлемо для чего-либо, кроме простой анимации.


person Carcigenicate    schedule 25.02.2017    source источник


Ответы (2)


Есть способ попроще!

Есть более простой способ сделать это. Взгляните на библиотеку clojure-lanterna.

Эта библиотека позволит вам обращаться к произвольному месту на экране. Он может использовать эмулятор терминала или создать окно на основе качания.

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

Библиотека также поддерживает цветовые коды ANSI и несколько других полезных функций.

person Tim X    schedule 26.02.2017
comment
Я надеялся, что библиотека мне не понадобится, но это похоже на хороший вариант. Спасибо. - person Carcigenicate; 26.02.2017

Cursive реализует только ограниченный набор команд ANSI. В частности, не работает большинство команд перемещения курсора. Не стесняйтесь сообщать об этой проблеме, но ее исправление, вероятно, будет иметь низкий приоритет, поскольку это довольно сложно сделать в панели вывода REPL.

person Colin    schedule 26.02.2017