Я делаю простую анимацию 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)))))
но это плохое решение. Перед использованием необходимо очистить экран, что неприемлемо для чего-либо, кроме простой анимации.