GNU 화면에 전체 명령을 표시하고, 제목에 bash를 포함하고, Vim 버퍼와 올바르게 상호 작용합니다.

GNU 화면에 전체 명령을 표시하고, 제목에 bash를 포함하고, Vim 버퍼와 올바르게 상호 작용합니다.

이 문제에 대해 웹상에 많은 질문이 있지만 다음 두 가지 공통점 중 하나를 발견했습니다.

  • 그들은 현재 실행 중인 프로그램만(인수 없이) 인쇄하는 수동 솔루션을 제공했습니다.
  • 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이 고장나서 다음도 추가했습니다..bashrcshelltitle '$ |bash'.screenrcPROMPT_COMMAND.bashrc

case "$TERM" in
    screen*) PROMPT_COMMAND='/bin/echo -ne "\033k\033\0134"';;
esac

첨부된 예시 이미지 - 창 0에서 절전 모드를 실행하고, 창 1에서 찾기, 창 2에서 감시, 창 3에서 핑, 창 4에서 bash를 실행합니다. 여기에 이미지 설명을 입력하세요.

관련 정보