#c #std
Вопрос:
Я реализую оболочку, у которой есть история команд. Когда пользователь нажимает стрелку вверх или вниз, текст в текущей строке заменяется предыдущей или следующей командой.
Алгоритм, который я планирую реализовать, довольно прост. Если текущая команда содержит k символов, я вывожу k символов ‘b’, чтобы удалить k символов в текущей строке, а затем выведу выбранную команду в строку.
Тем не менее, я пытаюсь начать с чего-то простого, например, посмотреть, работает ли вывод символов «b » даже при удалении символов из текущей stdout
строки:
#include <iostream>
#include <queue>
#include <deque>
#include <string>
using namespace std;
int main(int argc, char *argv[]){
cout << "asdf";
cout << "bb" << endl;
return 0;
}
Вывод приведенного выше фрагмента кода является:
asdf
Когда я ожидаю:
as
Важно: Я хочу удалить символы после того, как они будут выведены stdout
.
Комментарии:
1. На большинстве терминалов backspace не стирает символы, он просто перемещает курсор на один пробел назад. Возможно, вам захочется вывести некоторые пробелы после
b
.2. Например
"bb b"
(для каждого символа, который вы хотите стереть), Другой вариант-использовать экранирование ANSI и вернуть курсор вверх и очистить до конца строки.
Ответ №1:
Вам нужны коды эвакуации ANSI. Попробуй:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]){
cout << "asdf";
cout<<"bbbb33[J";
return 0;
}
33
расшифровывается ESC
как и [J
является параметром кода. ESC[J
очищает экран от курсора до конца экрана. Для получения дополнительной информации: https://en.wikipedia.org/wiki/ANSI_escape_code#Fe_Escape_sequences
Как упоминалось в @n. 1.8e9-где моя доля, b
просто перемещает курсор на один пробел назад и ничего не переписывает для большинства реализаций.
Ответ №2:
Я рекомендую использовать библиотеки ncurses и readline.
Пример:
sudo apt-get install libncurses5-dev libncursesw5-dev libreadline-dev
git clone https://github.com/ulfalizer/readline-and-ncurses
cd readline-and-ncurses
make
rlncurses
Мое окружение:
lsb_release -d ; uname -r ; g --version | head -1
Description: Ubuntu 20.04.3 LTS
4.4.0-19041-Microsoft
g (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0