User Tools

Site Tools


docs:tips_n_tricks:screen.html

screen

show current directory or command in window name when using zsh

Linux

put this in your .zshrc

.zshrc
case "$STY" in
  "")
    ;;
  "$PPID".*)
    # chpwd () {
    #         let "len = 54 - ${#DISPLAY}"
    #         screen -X -S "$STY" title "$DISPLAY - `pwd|sed -e 's:^.*\(.\{'$len'\}\)$:..\1:g'`"
    # }
    precmd () {
            let "len = 54 - ${#DISPLAY}"
            screen -X -S "$PPID" title "$DISPLAY - `pwd|sed -e 's:^.*\(.\{'$len'\}\)$:..\1:g'` ($_my_last_cmd)"
    }
    preexec () {
            screen -X -S "$PPID" title "$DISPLAY - running: $1"
            _my_last_cmd="$1"
            # # Maybe $2 or $3 is a better choice - I didn't get the difference yet. You may
            # # analyse this with the statement:
            # printf "1:%s\n2:%s\n3:%s\n" "$1" "$2" "$3" >> "/tmp/preexec.$$.log"
    }
    ;;
esac

Mac OS X

On Mac OS X (maybe on BSD systems in general), screen launches a login process which then executes the shell. Therefore, the id of the screen session ($STY) does not start with the parent processes pid ($PPID), but with the parent pid of the parent process. Therefor, you have to use the following lines in your .zshrc

case "`ps -o 'command=' -p $PPID`" in
"login"*"zsh") pppid="`ps -o 'ppid=' -p $PPID|sed -e 's/^ *//g'`" ;;
*)        pppid="XXX" ;;
esac

case "$STY" in
  "")
    ;;
  "$pppid"*)
    eval " 
    precmd () {
            let \"len = 54 - \$#DISPLAY\"
          screen -X -S "$STY" title \"\$DISPLAY - \`pwd|sed -e 's:^.*\(.\{'\$len'\}\)\$:..\1:g'\`\"
    }
    preexec () {
            screen -X -S \"$STY\" title \"\$DISPLAY - running: \$1\"
    }
"
    ;;
esac

show current directory or command in window name when using bash

This is the beginning of an humble try:

case "$STY" in
  "")
    ;;
  "$PPID".*)
    precmd () {
            let "len = 54 - ${#DISPLAY}"
            screen -X -S "$PPID" title "$DISPLAY - `pwd|sed -e 's:^.*\(.\{'$len'\}\)$:..\1:g'`"
    }
    preexec () {
            screen -X -S "$PPID" title "$DISPLAY - running: $1"
            # # Maybe $2 or $3 is a better choice - I didn't get the difference yet. You may
            # # analyse this with the statement:
            # printf "1:%s\n2:%s\n3:%s\n" "$1" "$2" "$3" >> "/tmp/preexec.$$.log"
    }
    if [ "$BASH" ]
    then
      PROMPT_COMMAND='precmd'
      screentitle() { preexec "$BASH_COMMAND"; }
      # # nice try :-/
      # trap screentitle DEBUG
      on_debug()
      {
        case "$BASH_COMMAND" in
        "$PROMPT_COMMAND") ;;
        *) preexec "$BASH_COMMAND" >> /dev/tty < /dev/null 2>&1 & disown ;;
        esac
      }
      trap on_debug DEBUG
    fi
    # as we show user and cwd in screen title, 
    # clear hardstatus in screen:
    echo -en "\033]0;\007"
    ;;
esac

This seems to break some Pipe chains. There might be a better approach at at twistedmatrix where the idea to use “trapDEBUG” was stolen from ;-)

Actually, I consider this trick dirty and hence both solutions.

Have a separate history for each screen window

Put this in your .profile, .bashrc, .zshenv or whatever shell your're using:

[ -n "$WINDOW" ] && HISTFILE="${HISTFILE:-~/.screen_history}.${WINDOW}"

sample .screenrc file

.screenrc
#remove some stupid / dangerous key bindings
bind ^k
bind ^\
bind k
# # don't lock screen accidently - use if you don't know the accounts
# # password (e.g. when access is managed by ssh keys)
# bind x
# bind ^x
startup_message off
vbell on
vbell_msg " Klingeling! "
bindkey -k kb stuff ^?
# Enable cycling backward throug regions in Putty by C-a,Shift+TAB
bindkey -t "^A^[[Z" focus prev
# Make C-a C-a work smooth again
bindkey -t "^A^A" other
 
defscrollback 500
 
# make $HOME the base for all relative paths
chdir
 
caption always
# # show window title and optional
# # hardware status line text
# caption string "%?%F%{.c.}%?%3n %t%? [%h]%?"
 
# # show window title if set, else hardware status line text
# windowlist string "%3n %?[%h]%:%t%?"
# windowlist title "Num Name|HW Status"
# # show window title and hardware status line text if set
# windowlist string "%3n %t %?[%h]%?"
# windowlist title "Num Name [HW Status]"
# # Use approximately original windowlist string appended by hardware statusline if set
windowlist string "%3n %t%=%?[%h]    %:%?%f "
windowlist title "Num Name%=[HW Status] Flags"
# # show clock in caption line
# caption    string "%?%F%{.b.}%H: %?%3n%? [%h]%: %t%?%=| %c:%s "
# Higlight active window, show hold and escape-key state
caption    string "%?%F%{.bw}%?%H: %3n%?%E %{.rw}~a~%{-}%?%?%P %{.wb}~HOLD~%{-}%?%? [%h]%: %t%?%-11=| %c:%s "
 
hardstatus on
hardstatus alwayslastline
msgminwait 0
 
logfile .screenlog/screen.%S.%n.%Y-%m-%d.%0c.log
 
zombie xr onerror
# If you're using bash (won't hurt otherwise)
setenv PROMPT_COMMAND 'screen -p "$WINDOW" -X title "$PWD"'

Logging and reading logs

.screenrc
:
chdir
logfile screenlog/screen.%S.%n.%Y-%m-%d.%0c.log
:
col < ~/screenlog/screen.pts-0.www.14.2021-09-06.09:28.log | less

References:

Starting root shell in new screen with non-default shell

screen -t root sudo ZDOTDIR=$HOME -i /bin/zsh -
screen -t root sudo su - -c "ZDOTDIR=$HOME exec zsh"
docs/tips_n_tricks/screen.html.txt · Last modified: 27.09.2024 11:42 CEST by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki