Я использую библиотеку readline
(версия 6.3, режим по умолчанию [non-vi], Ubuntu 14.04) из собственной программы, работающей в окне терминала (на ПК). Проблема возникает, когда предыдущий вывод не завершается символом новой строки при вызове readline()
.
#include <stdio.h>
#include <readline/readline.h>
void main(void)
{
// Previous output from some other part of application
// which *may* have output stuff *not* terminated with a '\n'
printf("Hello ");
fflush(stdout);
char *in = readline("OK> ");
}
Итак, строка выглядит так:
Hello OK> <caret here>
Если вы наберете небольшое количество символов (до 5?), А затем, скажем, Ctrl+U
(могут быть другие), чтобы удалить ввод, пока все выглядит хорошо --- readline()
перемещает курсор обратно сразу после его собственного приглашения, т.е. удаление 5 символов. Однако попробуйте ввести, скажем:
123456 <Ctrl+U>
Теперь он удаляет обратно в Hello
, оставляя в строке только Hell
, за которым следует каретка, т.е. удаляет 6 + 6 == 12. Итак, вы видите:
Hello OK> 123456 <Ctrl+U>
Hell<caret here>
Мне нужно одно из двух возможных решений:
Я понял, что это зависит от того, сколько символов набрано в строке, где что-то не так. Любое исправление / обходной путь?
В качестве альтернативы, есть ли вызов библиотеки
readline
, который я мог бы сделать, который сказал бы мне, в какой позиции / столбце находится курсор, прежде чем я вызовуreadline()
? Тогда, по крайней мере, я смог бы распознать тот факт, что я нахожусь в конце существующей строки, и вывести\n
, чтобы сначала позиционировать себя в начале новой строки.
Я думаю, что могу догадаться, что до 5 набранных символов он делает до 5 пробелов, но вместо этого он выбирает сделать что-то еще, что испортит, если оно не началось в начале строки?
Я вижу GNU Readline: как очистить строку ввода? . Это такая же ситуация? Решения кажутся довольно сложными. Разве нельзя спросить, в каком столбце вы находитесь при запуске readline()
, или сказать ему, чтобы он не пытался так умно удалять и придерживаться удаления только того количества символов, которое было фактически введено в него?
sudo apt-get install libreadline-dev
, который также сделал 6 и теперь говоритlibreadline-dev is already the newest version
. Извините, но как мне получить / обновить до 7, пожалуйста? - person JonBrave   schedule 17.12.2016readline
не может знать, с какого места в строке он начинается. Я верю, что это работает для вас, потому что вы используете терминал Mac, который ведет себя иначе, чем мой. В любом случае я публикую ниже код, который делает то, что я хочу, в любомreadline
. - person JonBrave   schedule 24.12.2016