Полагайте, что Вы хотите выполнить эту команду в bash
:
echo -n "Command of a specific length will break at the second run attempt."
Вот вывод для 24x80 TTY:
ubuntu@ubuntu:~$ echo -n "Command of a specific length will break at the second
run attempt."
Command of a specific lenght will break at the second run attempt.ubuntu@ubuntu:
~$
Полагайте, что Вы хотите выполнить ту же команду снова.
Как только Вы поражаете ↑:
ubuntu@ubuntu:~$ echo -n "Command of a specific lenght will break at the second
run attempt."
Command of a specific lenght will break at the second run attempt.ubuntu@ubuntu:
run attempt."ommand of a specific lenght will break at the second r
Это происходит с командами определенного размера, которые не печатают новую строку в конце.
Это является чрезвычайно раздражающим. До сих пор я не нашел решения этого, и я думаю все, кто испытывает эту проблему, было бы действительно благодарно кому-то, у кого есть решение для этого.
Это может быть, покончили bash
также. Прием должен использовать пользовательское PROMPT_COMMAND
это запрашивает терминал для положения курсора (согласно этому вопросу).
Это решение может, вероятно, быть расширено на другие оболочки, но я только знаком с bash
. (См. ответ @muru для a zsh
решение). И возможно уже существует опция в bash
сделать это автоматически.
Вставьте это Ваш .bashrc
:
function new.line.if.not.on.left {
local foo
local garbage
local column
echo -n -e "\033[6n" # as the terminal for the position
read -s -d \[ garbage # ignore the first part of the response
read -s -d R foo # store the position in foo
column="$(echo "$foo" | cut -d';' -f2)" # skip over the row number
test "$column" "!=" 1 && { tput smso; echo "%"; tput rmso; }
}
PROMPT_COMMAND="new.line.if.not.on.left; $PROMPT_COMMAND"
Последняя строка предварительно ожидает вызов к new.line.if.not.on.left
к Вашему PROMPT_COMMAND
(поскольку у Вас может уже быть a PROMPT_COMMAND
определенный).
Функция удара new.line.if.not.on.left
работы следующим образом:
echo -n -e "\033[6n"
часть волшебства, которое спрашивает терминал о строке и столбце текущей позиции курсора. Терминал "отвечает" путем отправки поддельного ввода с клавиатуры с ответом.read -s -d \[ garbage
. Первая часть ответа является небольшим количеством мусора, своего рода управляющим кодом. Проигнорируйте его путем хранения его в garbage
.read -s -d R foo
. Сохраните поддельный ответ клавиатуры в переменной удара foo
. -s
необходим для остановки read
от повторения входа на экран снова. И -d R
разделитель - поддельный вход завершается R
, не новой строкой, как Вы могли бы ожидать.column="$(echo "$foo" | cut -d';' -f2)"
извлекает номер столбца из ответа (т.е. перескакивание через номер строки) и хранит результат в column
test "$column" "!=" 1 && { tput smso; echo "%"; tput rmso; }
Если число текущего столбца не 1, то распечатайте знак процента (и новая строка). tput
команды включают, "выделяются режим" - который должен сделать %
выделитесь более - возможно, полужирный или возможно путем инвертирования цветов фона и основных цветов. Используйте более умную оболочку, как zsh
:
Примечание, как это добавило %
для указания на отсутствие новой строки и распечатало подсказку на различной строке.
Просто хит Ctrl L . Это перерисует Ваш терминал и заставит все появиться, как он должен: