Mój motyw terminalu był taki,
Ale myślałem, że szybkie marnuje tyle miejsca. Później wpadłem na pomysł, że mogę wyczyścić monit za każdym razem, gdy uruchamiam polecenie. Korzystałem z bash, jednym z rozwiązań jest użycie preexec_invoke_exec
funkcji.
Używam następującego polecenia, aby wyczyścić ostatnie znaki zachęty:
echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"
Aby terminal był bardzo czysty, taki jak ten,
Ale teraz mój problem polega na tym, że będzie problem, jeśli chcę używać wielu poleceń w jednym wierszu , powiedzmy, kiedy używam for i in ...
.
Oto pełna wersja funkcji w moim .bashrc,
preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne " \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; }
preexec_invoke_exec () {
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
local this_pwd=`pwd`;
preexec "$this_command" "$this_pwd"
}
trap 'preexec_invoke_exec' DEBUG
zsh
…for i in $(seq 1 10); do ls; done
jego funkcję, wynik komend iteracyjnych zostanie „połknięty”, że tak powiem. Więc OP chciał zdezynfekować zachowanie, jednocześnie umożliwiając to pytanie. Powodem, dla którego to popieram, jest zainteresowanie świadomością powłoki, użyteczność, informacje zwrotne i przenośność. Link, który umieściłem w poprzednim komentarzu, prowadzi do posta na stronie superużytkownika - zadali sobie trud przypisania tego fragmentu kodu, więc jest to prototyp, który emuluje natywną funkcjonalność zsh (co moim zdaniem jest interesujące), w postaci funkcji pułapki tutaj.Odpowiedzi:
Najpierw
preexec_invoke_exec
należy zmodyfikować, aby zapobiec wielokrotnemu wykonywaniupreexec
. Zmodyfikuj również,preexec
aby uwzględnić faktyczną liczbę wierszy w$PS1
:Aby
preexec
ponownie uruchomić,DONTCLEANPROMPT
musi być albo rozbrojony, albo ustawiony na''
. Odbywa się to za pomocąPROMPT_COMMAND
, który jest uruchamiany tuż przed wydaniem podstawowego monitu. Dlategopreexec
będzie uruchamiany raz i tylko raz dla każdej linii poleceń.źródło
for
pętlą! Dziękuję Ci! Jest jeszcze jedna niedogodność. Co się stanie, jeśli wykonaszls
polecenie i uzyskasz wynik, a następnie zrobisz innyls
, zobaczysz, że ostatni wiersz poprzedniego wyjścia zostanie usunięty ... czy masz pomysł, jak to rozwiązać?prexec
na drukowane"\033[1A\033[K\033[31;1m$ \033[0m"
, czyli tylko jedno\033[1A\033[K
(przesuń 1 linię w górę, usuń do końca linii) zamiast dwóch.