vi 모드에서 내 zsh 프롬프트 표시 모드를 만듭니다.

vi 모드에서 내 zsh 프롬프트 표시 모드를 만듭니다.

나는 bindkey -v(bash-ers의 경우 set -o vizsh에서도 작동한다고 생각함) 또는 vi(m) 모드를 사용합니다. 하지만 현재 삽입 모드인지 명령 모드인지 알려주는 시각적 신호가 없다는 점이 문제입니다. 프롬프트에 모드를 표시하는 방법을 아는 사람이 있나요?

답변1

나는 찾았다이것~을 통해. 기본 예는 다음과 같습니다. 아직은 직접 맞춤설정하는 중입니다.

function zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/-- NORMAL --}/(main|viins)/-- INSERT --}"
    RPS2=$RPS1
    zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

아직 잘 이해가 안 되는 것 외에는 설명하겠습니다.

답변2

zle-keymap-select모드가 변경될 때마다 실행되는 것을 이미 찾았습니다 . 터미널이 무엇을 지원하는지(물론 모드 표시기 표시에 대한 취향도 포함)에 따라 프롬프트 이외의 다른 시각적 표시기를 설정하는 데 사용할 수 있습니다.

표준이 있습니다terminfo 기능커서의 모양을 변경하려면 그러나 일부 터미널에서는 두 모드 모두에서 동일한 커서를 표시합니다. 덜 눈에 띄는 커서에 대한 Xterm의 개념은 커서를 깜박이게 만드는 것입니다(그리고 이는 -bc명령줄 인수나 cursorBlink리소스를 사용하여 활성화해야 합니다).

zle-keymap-select () {
  case $KEYMAP in
    vicmd) print -rn -- $terminfo[cvvis];; # block cursor
    viins|main) print -rn -- $terminfo[cnorm];; # less visible cursor
  esac
}

print -n '\e]12;pink\a'일부 터미널에서는 (색상 이름별) 또는 print -n '\e]12;#abcdef\a'(RGB 사양별)을 사용하여 커서 색상을 변경할 수도 있습니다 . 이러한 시퀀스는 xterm 문서에 설명되어 있습니다.ctlseqs파일; 최신 터미널 에뮬레이터는 일반적으로 xterm을 에뮬레이트하지만 모든 기능을 지원하지는 않습니다.

답변3

여러 줄 프롬프트와 함께 재설정 프롬프트를 사용하는 데 문제가 있는 사람들을 위해https://stackoverflow.com/questions/3622943/zsh-vi-mode-status-line나는 결국 다음을 수행했습니다.

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]

function insert-mode () { echo "-- INSERT --" }
function normal-mode () { echo "-- NORMAL --" }

precmd () {
    # yes, I actually like to have a new line, then some stuff and then 
    # the input line
    print -rP "
[%D{%a, %d %b %Y, %H:%M:%S}] %n %{$fg[blue]%}%m%{$reset_color%}"

    # this is required for initial prompt and a problem I had with Ctrl+C or
    # Enter when in normal mode (a new line would come up in insert mode,
    # but normal mode would be indicated)
    PS1="%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%~ $ "
}
function set-prompt () {
    case ${KEYMAP} in
      (vicmd)      VI_MODE="$(normal-mode)" ;;
      (main|viins) VI_MODE="$(insert-mode)" ;;
      (*)          VI_MODE="$(insert-mode)" ;;
    esac
    PS1="%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%~ $ "
}

function zle-line-init zle-keymap-select {
    set-prompt
    zle reset-prompt
}
preexec () { print -rn -- $terminfo[el]; }

zle -N zle-line-init
zle -N zle-keymap-select

답변4

이것은 zsh에서 '블록'과 '빔' 모양 사이에서 커서를 변경하는 데 사용하는 것입니다.

(테스트흰개미,그놈 터미널그리고메이트 터미널)

# vim mode config
# ---------------

# Activate vim mode.
bindkey -v

# Remove mode switching delay.
KEYTIMEOUT=5

# Change cursor shape for different vi modes.
function zle-keymap-select {
  if [[ ${KEYMAP} == vicmd ]] ||
     [[ $1 = 'block' ]]; then
    echo -ne '\e[1 q'

  elif [[ ${KEYMAP} == main ]] ||
       [[ ${KEYMAP} == viins ]] ||
       [[ ${KEYMAP} = '' ]] ||
       [[ $1 = 'beam' ]]; then
    echo -ne '\e[5 q'
  fi
}
zle -N zle-keymap-select

# Use beam shape cursor on startup.
echo -ne '\e[5 q'

# Use beam shape cursor for each new prompt.
preexec() {
   echo -ne '\e[5 q'
}

관련 정보