Podczas uruchamiania XTerm monit zaczyna się od pierwszej linii terminala. Podczas uruchamiania poleceń wiersz przesuwa się w dół, aż osiągnie dno, i od tego momentu pozostaje tam (nawet Shift- Page Downlub mysz może to zmienić). Zamiast tego, aby czas życia terminala był „specjalny”, monit powinien zawsze znajdować się na dole terminala. Pamiętaj, że mam monit wieloliniowy .
Oczywiście, w przeciwnym razie powinien działać jak poprzednio (zmiana rozmiaru, przewijanie, brak zbędnych znaków nowej linii i brak wyjścia w tajemniczy sposób znikający), więc PROMPT_COMMAND='echo;echo;...'
nie ma takiej opcji. Rozwiązanie idealnie nie powinno być specyficzne dla powłoki.
Edit: obecne rozwiązanie , pracując w prostych przypadkach, ma kilka problemów:
- Jest specyficzny dla Bash . Idealne rozwiązanie powinno być przenośne na inne powłoki.
- Nie powiedzie się, jeśli zmodyfikują się inne procesy
PS1
. Jednym z przykładów jest virtualenv, który dodaje(virtualenv)
na początku dniaPS1
, który następnie znika zawsze tuż powyżej krotnie. - Ctrl- lteraz usuwa ostatnią stronę historii.
Czy istnieje sposób na uniknięcie tych problemów, poza rozwidleniem XTerm?
clear
polecenie.Odpowiedzi:
Jeśli używasz
bash
, następujące czynności powinny załatwić sprawę:Lub (mniej wydajne, ponieważ uruchamia jedno
tput
polecenie przed każdym monitem, ale działa po zmianie rozmiaru okna terminala):Aby zapobiec
tput
zmianie kodu wyjścia, możesz go jawnie zapisać i zresetować:Zauważ, że zmienna
retval
jest lokalna; nie wpływa na żadnąretval
zmienną, którą mógłbyś zdefiniować w powłoce.Ponieważ większość terminali
cup
jest taka sama\e[y;xH
, możesz również kodować na stałe:Jeśli chcesz, aby był bezpieczny przed późniejszym resetowaniem PS1, możesz również użyć
PROMPT_COMMAND
zmiennej. Jeśli jest ustawiony, jest uruchamiany jako polecenie przed wyświetleniem monitu. Tak więc efekt można również osiągnąć przezOczywiście, chociaż resetowanie
PS1
nie wpłynie na to, niektóre inne programy również mogą się zmienićPROMPT_COMMAND
.źródło
tput
różnią się od wieluecho
poleceń? (Pytanie z ciekawości)'\[$(tput cup "$LINES")\]'
działa pięknie . Dzięki!tput
: Wygląda na to, że się resetuje$exit_code
. Naprawiono za pomocą\[\e[$LINES;1H\]
.tput
która zachowuje kod wyjścia.Dla uproszczenia poprzedniej odpowiedzi łatwiej mi było uruchomić:
na początku
.bashrc
lub.zshrc
. Po prostu działa.Plusy:
Cons:
clear
doclear; tput ...
nie pomaga;źródło
Użyte odpowiedzi
$LINES
są niepotrzebnie nieprzenośne. Po zakończeniuresize
możesz po prostu poprosićxterm
o ustawienie pozycji na dowolnie dużą liczbę wierszy, np.(zakładając, że masz okno mniejsze niż 10 tysięcy linii, bez względu na przewijanie ).
Ponieważ ciąg nie zmieni się jako efekt uboczny zmiany rozmiaru okna, możesz to raz obliczyć i wkleić jako ciąg zachęty, np.
i później
zgodnie z twoimi preferencjami.
Jeśli chodzi o inne modyfikujące procesy
PS1
:PS1
po tych zmianach będziesz musiał ponownie obliczyć , aby upewnić się, że będzie wyglądał tak, jak chcesz. Ale pytanie nie zawiera wystarczającej ilości szczegółów, aby wskazać, gdzie wprowadzić zmiany.I na koniec: zachowanie przy uzupełnianiu tabulatorów nie łączy się z tego rodzaju zmianą, z powodu założeń bash.
źródło
PS1="${TPUT_END} myprompt: "
, a nawetPS1="${TPUT_END}${PS1}"