GNU画面に完全なコマンドを表示し、タイトルにbashを含め、Vimバッファと正しく対話します。

GNU画面に完全なコマンドを表示し、タイトルにbashを含め、Vimバッファと正しく対話します。

この問題についてWeb上に多くの質問がありますが、次の2つの共通点の1つを見つけました。

  • 彼らは現在実行中のプログラムだけを(引数なしで)印刷する手動ソリューションを提供しました。
  • zsh preexec機能を使用してください(画面とどのようにやり取りするのかわかりませんが)。 Bashソリューションを探しています。

画面タイトルに完全なコマンド実行が表示されるようにするにはどうすればよいですか?たとえば、長期実行の3つのPythonスクリプトを実行している場合、タイトルにスクリプト名も表示できますか?ボーナスポイントのために最後のコマンドの実行を表示し続けることができれば幸いです。

私の現在の設定:

  • 出口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

おすすめ記事