이 문제에 대해 웹상에 많은 질문이 있지만 다음 두 가지 공통점 중 하나를 발견했습니다.
- 그들은 현재 실행 중인 프로그램만(인수 없이) 인쇄하는 수동 솔루션을 제공했습니다.
- zsh preexec 기능을 사용하세요(화면과 어떻게 상호작용하는지 잘 모르겠지만). Bash 솔루션을 찾고 있습니다.
화면 제목에 전체 명령 실행이 표시되도록 하려면 어떻게 해야 합니까? 예를 들어 장기 실행 Python 스크립트 3개를 실행하는 경우 제목에서 스크립트 이름도 볼 수 있습니까?보너스 포인트를 위해 마지막 명령 실행을 계속 표시하도록 할 수 있으면 좋을 것입니다.
내 현재 설정:
- 출구
PROMPT_COMMAND='/bin/echo -ne "\033k\033\0134"'
PS1
에 의해. . 마치다>
shelltitle ">|bash"
나는 시도했다:
\033k
와\033
- 사이에 뭔가를 추가하세요${BASH_COMMAND}
- 화면이 없는 XTERM의 경우 해결책을 알고 있으므로 트랩 디버깅을 사용하여 외부 추가 헤더를 설정하십시오. 이는 와 관련이 있습니다
PS1
.
그리고 위의 변형. 화면을 통과하는 솔루션을 원하므로 창 제목과 화면 창 목록 모두에 전체 명령이 표시됩니다.
보너스로, Screen이 Vim과 원활하게 상호작용하여 버퍼를 변경하거나 새 파일을 열거나 등을 할 수 있다면 정말 좋겠습니다. 화면 제목이 동적으로 업데이트됩니다.
답변1
1년 후, 여기에 트랩을 사용한 솔루션이 있습니다. 그러면 호스트 이름, 현재 정보 PWD
및 명령(및 화면에 있는 경우 화면 내용)이 표시됩니다. 아래에서 쉽게 사용자 정의 할 수 있습니다 set_screen_window
. 모든 것은 당신의 .bashrc
.
먼저 몇 가지 도우미 함수를 사용하여 내가 열려 있는지 확인합니다 screen
.
export PROMPT_COMMAND=''
if [[ "$TERM" == "screen"* ]]; then
screen_title_slicer() { echo "${1:0:40}"; } # Arbitrary cut off. use echo $1 for full.
screen_title_format='\ek%s\e\\'
else
screen_title_slicer() { echo "${1//[^[:print:]]/}"; }
screen_title_format='\033]0;%s\007'
fi
빌드 명령의 핵심은 유용한 에 의존합니다 BASH_COMMAND
. 저는 몇 가지 사용자 정의 작업 fg
(예: 원래 명령 표시) 및 cd
(실제 디렉터리 가져오기)을 수행했습니다.
ready="Ready!"
set_screen_window() {
title_string=$1
[ -z "$title_string" ] && title_string=$(screen_title_slicer "$BASH_COMMAND")
[ "$title_string" = "fg" ] && read -ra job < <( jobs %% 2> /dev/null )
[ "$title_string" = "fg " ] && read -ra job < <(jobs "${title_string:3} 2> /dev/null")
if [ ${#job[@]} -gt 0 ]; then
title_string=$(screen_title_slicer "${job[2]}")
fi
cwd=$PWD
if [ "${title_string::3}" = "cd " ]; then
cwd=$( eval cd "$(awk '{print $2}' <<< "$BASH_COMMAND")" &> /dev/null && pwd)
[ -z "$cwd" ] && cwd=$PWD
title_string="$ready"
fi
[ "$title_string" = "cd" ] && title_string=$ready && cwd=$HOME
printf "$screen_title_format" "$HOSTNAME -- ${cwd//$HOME/\~}> $title_string" > "$(tty)"
unset job
unset title_string
}
이제 내 문자열로 터미널 헤더를 초기화 ready
하고 오류를 포착하고 디버그하여 터미널 창을 업데이트합니다.
set_screen_window "$ready"
trap "set_screen_window $ready" ERR
trap set_screen_window DEBUG
마지막으로 구체적인 내용은 .vimrc
다음과 같습니다 vim
.
function! Filename()
if @% == ""
return "noname"
endif
let is_tracked=system("git ls-files " . expand("%"))
if is_tracked == ""
return expand("%:t")
endif
return gitbranch#name() . "/" . expand("%:t")
endfunction
let &titlestring = hostname() . " -- vim " . Filename()
if &term[:5] == "screen"
set t_ts=^[k
set t_fs=^[\
set title
endif
autocmd TabEnter,WinEnter,BufReadPost,FileReadPost,BufNewFile * silent execute '!printf "\033]0;'.hostname().' -- vim '.Filename().'\007"'
autocmd TabEnter,WinEnter,BufReadPost,FileReadPost,BufNewFile * let &titlestring = hostname() . ' -- vim ' . Filename()
여기에서 Filename
자신만의 제목 스타일을 얻기 위해 사용자 정의할 수 있습니다. autocmd
버퍼, 창 등 사이를 이동할 때 콘텐츠가 다시 로드되는지 확인하세요. 내 예에는 저장소에서 파일을 편집할 때 (예상대로) 분기 이름을 생성하는 gitbranch
데 사용할 수 있는 플러그인이 있습니다 .git
답변2
in 과 함께 PROMPT_COMMAND='/bin/echo -ne "\033k\033\0134"'
사용하면 나에게 잘 작동합니다 . 이 특정한 것을 사용하면 내 PS1이 고장나서 다음도 추가했습니다..bashrc
shelltitle '$ |bash'
.screenrc
PROMPT_COMMAND
.bashrc
case "$TERM" in
screen*) PROMPT_COMMAND='/bin/echo -ne "\033k\033\0134"';;
esac
첨부된 예시 이미지 - 창 0에서 절전 모드를 실행하고, 창 1에서 찾기, 창 2에서 감시, 창 3에서 핑, 창 4에서 bash를 실행합니다.