Zsh 프롬프트는 다음 줄의 사용자 입력으로 전체 너비를 채웁니다.

Zsh 프롬프트는 다음 줄의 사용자 입력으로 전체 너비를 채웁니다.

왼쪽 및 오른쪽 프롬프트가 한 행에 있고 배경색이 전체 행에 걸쳐 있기를 원합니다. 사용자 입력은 다음 줄에 있어야 합니다.

hostname | ~/path/to/cwd                              branch master | insert mode
$ _

개행의 경우 $'\n'in을 사용해 보았지만 PS1이로 인해 두 번째 줄에 올바른 팁이 그려졌습니다.

전체 줄을 색칠하기 위해 닫지 않고 합류하려고 했는데 왼쪽 프롬프트의 마지막 문자 이후에 배경 색칠이 멈춥니다 %K{green}.PS1

이 메시지를 어떻게 구현하나요?

답변1

다음을 수행할 수 있습니다.

branch=master mode=insert
setopt promptsubst
left='%m | %~'
PS1='%K{green}$left${(l,COLUMNS-${#${(%)left}},)${${:-$branch | $mode}//[%]/%%}}%k$ '

왼쪽 패드 연산자를 사용하여 ${(l,length,)...}프롬프트의 오른쪽에서 $COLUMNS왼쪽에 표시된 길이를 뺀 값을 채웁니다.

$mode정시에 업데이트 하려면 Insert다음을 수행해야 합니다.

update-mode() {
  case $KEYMAP in
    (main)
      case $ZLE_STATE in
        (*insert*) mode=insert;;
        (*) mode=overwrite
      esac;;
    (*) mode=$KEYMAP
  esac
  [[ $mode = $oldmode ]] || zle reset-prompt
}

overwrite-mode() {
   zle ".$WIDGET"
   update-mode
}
zle -N overwrite-mode

이로 인해 모드를 전환할 때 프롬프트가 다시 그려집니다.

모드 의 경우 삽입 모드로 들어가는 모든 경우(삽입 모드( / , / , / , / ) 또는 덮어쓰기( )) vi를 고려해야 하며 , 찾은 대로 특수 후크 위젯을 사용할 수 있습니다 .aAiIcCsSRzle-keymap-select

zle -N zle-keymap-select update-mode

나는 당신을 다시 쓸 것입니다마지막 해결책처럼:

bindkey -v

# Bind the <Insert> key.
bindkey $terminfo[kich1] overwrite-mode
setopt promptsubst

(){ # local scope

  local left right invisible leftcontent

  # User name.
  left+='%B%F{black}%K{green} %n '
  # Current working directory.
  left+='%K{yellow} %~ '

  # Version control branch.
  right='${vcs_info_msg_0_:+${vcs_info_msg_0_//[%]/%%} }'
  # Virtualenv.
  export VIRTUAL_ENV_DISABLE_PROMP=1
  right+='${VIRTUAL_ENV:+venv }'

  # Editing mode. $ZLE_MODE shouldn't contain %, no need to escape
  ZLE_MODE=insert
  right+='%K{green} $ZLE_MODE'

  # closing
  right+=$' %k%f%b'

  # Combine left and right prompt with spacing in between.
  invisible='%([BSUbfksu]|([FBK]|){*})'

  leftcontent=${(S)left//$~invisible}
  rightcontent=${(S)right//$~invisible}

  PS1="$left\${(l,COLUMNS-\${#\${(%):-$leftcontent$rightcontent}},)}$right%{"$'\n%}$ '
}

autoload vcs_info
precmd() vcs_info

update-mode() {
  case $KEYMAP in
    (main)
      case $ZLE_STATE in
        (*insert*) ZLE_MODE=insert;;
        (*) ZLE_MODE=overwrite
      esac;;
    (*) ZLE_MODE=$KEYMAP
  esac
  [[ $ZLE_MODE = $oldmode ]] || zle reset-prompt
}

overwrite-mode() {
   zle ".$WIDGET"
   update-mode
}
zle -N overwrite-mode
zle -N zle-keymap-select update-mode

이렇게 하면 불필요한 분기 및 프롬프트 다시 그리기의 수가 최소화되고 창 크기가 조정되는 경우를 포함하여 모든 상황에서 쉘이 프롬프트를 올바르게 그릴 수 있습니다.

스크린샷:

여기에 이미지 설명을 입력하세요.

관련 정보