bash에서 오래된 프롬프트 행을 지우면 스크롤 공간이 절약됩니다.


11

제 터미널 테마는 이렇습니다.

전에 터미널

그러나 나는 그 프롬프트가 너무 많은 공간을 낭비한다고 생각했다. 그리고 나중에 명령을 실행할 때마다 프롬프트를 정리할 수 있다는 아이디어를 얻었습니다. 나는 bash를 사용하고 있었고 해결책 중 하나는 preexec_invoke_exec기능 을 사용하는 것입니다.

다음 명령을 사용하여 마지막 프롬프트 문자를 정리합니다.

echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"

터미널이 이렇게 깨끗해 지도록

여기에 이미지 설명을 입력하십시오

그러나 이제 내 문제는 내가 사용할 때와 같이 한 줄에 여러 명령 을 사용하려는 경우 문제가 발생한다는 것 for i in ...입니다.

내 .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

Glyph Lefkowitz zsh 트릭 -좋습니다!

2
쉬운 해결책은 다음과 같이 시작합니다 zsh.
Gilles 'SO-stop

나는 거기에 귀하의 질문에 ... 놓친
데이비드 엘저를

@DavidHoelzer for i in $(seq 1 10); do ls; done그의 기능을 사용하면 반복 명령의 출력이 "삼키게"됩니다. 따라서 OP는 해당 프롬프트를 활성화하면서 동작을 삭제하려고했습니다. 내가 이것을 지원하는 이유는 쉘, 유용성, 피드백 및 이식성에 대한 인식에 대한 관심 때문입니다. 내가 이전에 언급 한 링크는 수퍼 유저에 대한 게시물로 연결됩니다.이 스 니펫을 작성하는 데 어려움을 겪었으므로 트랩 기능의 형태로 원시 zsh 기능 (흥미로운 것으로 생각합니다)을 에뮬레이트하는 프로토 타입입니다 여기.

답변:


3

preexec_invoke_exec여러 번 실행되지 않도록 먼저 수정해야 preexec합니다. 또한 preexec다음의 실제 줄 수를 고려하여 수정하십시오 $PS1.

preexec () { 
    # delete old prompt; one "\e[1A\e[K" per line of $PS1
    for (( i=0, l=$(echo -e $PS1 | wc -l) ; i < l ; i++ ))
    do             
        echo -ne "\e[1A\e[K"
    done
    # replacement for prompt
    echo -ne "\e[31;1m$ \e[0m"
    echo -n "$1"
    echo -ne "  \e[37;2m["
    echo -n "$2"
    echo -e "]\e[0m"
}

preexec_invoke_exec () {
    [ -n "$DONTCLEANPROMPT" ] && return
    DONTCLEANPROMPT=x
    [ -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

PROMPT_COMMAND='unset DONTCLEANPROMPT'

의 순서를 preexec다시 실행하려면 DONTCLEANPROMPT중 하나를 해제하거나 설정해야합니다 ''. 이 작업 PROMPT_COMMAND은 기본 프롬프트가 실행되기 직전에 실행됩니다. 따라서 preexec모든 명령 줄에 대해 한 번만 실행됩니다.


귀하의 솔루션은 for루프 문제를 해결합니다 ! 감사합니다! 더 불편하다. 무슨 일이 당신이 ls명령 을 수행 하고 출력을 가지고 있다면 ls, 당신은 다른 것을 수행 하면, 당신은 이전 출력의 마지막 줄이 지워지는 것을 보게 될 것입니다 ... 그 해결 방법에 대한 아이디어가 있습니까?

1
아마도 한 줄로만 프롬프트를 사용하고있을 것입니다. 첫 번째 반향 prexec을 print로 변경하십시오. "\033[1A\033[K\033[31;1m$ \033[0m"\033[1A\033[K, 2 개 대신 1 개만 이동하십시오 (1 줄 위로 이동, 줄 끝까지 삭제).
Adaephon

완벽한! 귀하의 솔루션에 대해 대단히 감사 드리며 시간을내어 설명해주십시오. 이를 통해 OP의 문제를 해결하고 솔루션을 더욱 디버깅 할 수 있습니다. 누구나 사용할 수 있습니다! 건배!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.