meinen ZSH-Prompt-Show-Modus im VI-Modus machen

meinen ZSH-Prompt-Show-Modus im VI-Modus machen

Ich verwende bindkey -v(für Bash-Benutzer: set -o viIch glaube, das funktioniert auch in zsh) oder den vi(m)-Modus. Aber es nervt mich, dass ich keinen visuellen Hinweis habe, der mir sagt, ob ich mich im Einfügemodus oder im Befehlsmodus befinde. Weiß jemand, wie ich in meiner Eingabeaufforderung den Modus anzeigen lassen kann?

Antwort1

ich fandDasüberSO. Hier ist das grundlegende Beispiel, das ich allerdings noch für mich anpasse:

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

Ich würde es erklären, aber ich verstehe es noch nicht wirklich

Antwort2

Sie haben bereits herausgefunden, zle-keymap-selectwas ausgeführt wird, wenn sich der Modus ändert. Sie können es verwenden, um einen anderen visuellen Indikator als die Eingabeaufforderung festzulegen, je nachdem, was Ihr Terminal unterstützt (und natürlich je nachdem, welchen Geschmack Sie hinsichtlich der Anzeige des Modusindikators haben).

Es gibt einen StandardTerminfo-Funktionum die Form des Cursors zu ändern. Einige Terminals zeigen jedoch in beiden Modi denselben Cursor an. Xterms Konzept eines weniger sichtbaren Cursors besteht darin, ihn blinken zu lassen (und dies muss mit dem -bcBefehlszeilenargument oder cursorBlinkder Ressource aktiviert werden).

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

Bei manchen Terminals kann man die Cursorfarbe auch mit print -n '\e]12;pink\a'(by color name) oder print -n '\e]12;#abcdef\a'(by RGB specification) ändern. Diese Sequenzen sind in der xterm-Dokumentation beschrieben, imctlseqsDatei; moderne Terminalemulatoren emulieren normalerweise xterm, obwohl sie möglicherweise nicht alle dessen Funktionen unterstützen.

Antwort3

Für die Leute, die Probleme mit Reset-Prompt bei mehrzeiligen Eingabeaufforderungen haben, in Kombination mithttps://stackoverflow.com/questions/3622943/zsh-vi-mode-status-lineAm Ende habe ich Folgendes gemacht:

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

Antwort4

Dies ist, was ich verwende, um den Cursor in zsh zwischen der Form „Block“ und „Balken“ zu ändern:

(Getestet mitTermite,Gnome-TerminalUndMate-Terminal)

# 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'
}

verwandte Informationen