Контакт с командами повреждения удара определенной длины

Полагайте, что Вы хотите выполнить эту команду в 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

Это происходит с командами определенного размера, которые не печатают новую строку в конце.

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

3
задан 25 June 2015 в 19:17

3 ответа

Это может быть, покончили 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 команды включают, "выделяются режим" - который должен сделать % выделитесь более - возможно, полужирный или возможно путем инвертирования цветов фона и основных цветов.
2
ответ дан 1 December 2019 в 13:12

Используйте более умную оболочку, как zsh:

enter image description here

Примечание, как это добавило % для указания на отсутствие новой строки и распечатало подсказку на различной строке.

4
ответ дан 1 December 2019 в 13:12

Просто хит Ctrl L . Это перерисует Ваш терминал и заставит все появиться, как он должен:

enter image description here

3
ответ дан 1 December 2019 в 13:12

Другие вопросы по тегам:

Похожие вопросы: