2016-08-04 8 views
0

У меня есть запрос на две строки, как показано ниже. Есть ли команда, например, clear, которая очистит экран, но сохранит как строки подсказки видны?Очистить экран терминала с двухстрочным приглашением и оставить обе линии видимыми

~/current/directory git-branch* 
$ echo 'hello... 
+0

Clear держит многострочные подсказки ... – 123

+1

О, ты прав. Я использовал C-l, и у меня нет такого же поведения. Я думал, что они такие же. – Joe

ответ

0

short: no, нет такой команды.

длинный: вы можете написать сценарий. Вот краткое введение в эту тему.

Программа clear очищает весь экран. Ваша оболочка выведет новое приглашение (вверху только что очищенного экрана). Но предположим, что вы хотели очистить части экрана до, ваша команда завершена и возвращается в оболочку.

Большинство терминалов, которые вы использовали бы поддержать управляющую последовательность ANSI, которая очищает от текущей позиции курсора до конца экрана, который является terminfo capability ed:

clr_eos     ed  cd clear to end of 
             screen (P*) 

показано infocmp в ed=\E[J.

Вы можете использовать его в сценарии, например, с помощью tput:

tput ed 

Это одна из областей, где "ANSI.SYS" отличается от стандарта ANSI (на самом деле ECMA-48 см 8.3.29 ERASE IN PAGE) , ansi.sys очищает весь экран, когда он получает

printf '\033]J' 

Некоторых людей прописывать это в сценарий, и предположит, что «ANSI.SYS» соответствует стандарту. См., Например, How do I get color with VT100? в FAQ ncurses.

Отмечая комментарий о том, как проверить это: вероятно, на экране ниже ничего не отображается. Поэтому типизация tput ed может показаться недействительной. Как отмечено выше, он очищает ниже курсора. Если вы хотите, чтобы очистить выше (2 линии) подскажите, что это немного сложнее:

  • сохранить позиции курсора
  • перемещения курсора вверх две линии
  • ясно перед тем курсор
  • восстановить позицию курсора.

Если ваше приглашение случается на первой строке экрана, это может быть обнаружены с помощью отчета о положении курсора. Но это сложнее, чем предполагалось. Предположим, что существует пространство над:

tput sc 
tput cuu 2 
tput cub 999 
printf '\033[1J' 
tput rc 

Регулярное printf, а не tput здесь используется, потому что нет никакого предопределенного TERMINFO (или TERMCAP) возможность определить для данного типа стирания.

Если вы хотите обработать случай, когда приглашение начинается в верхней строке терминала, вам нужно будет найти текущую строку номер и решить, нужно ли делать клиринг выше (или нет).

Дальнейшее чтение:

+0

Не 'tput ed' или' printf '\ 033] J'' работают в 'konsole'. –

+0

Ни 'tput ed', ни' printf '\ 033] J'' работал в st (suckless terminal). Обе команды просто возвращаются. В xterm 'printf '\ 033] J'' зависает. – Joe

+0

Я бы не ожидал, что это сработает, так как это ** 'OSC J' **, а не **' CSI J' **. xterm обрабатывает его, как ожидалось. Начиная с этого момента, комментарий относительно konsole и tput нуждается в некотором уточнении (konsole работает, как и ожидалось ...). –