
Ich verwende bindkey -v
(für Bash-Benutzer: set -o vi
Ich 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-select
was 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 -bc
Befehlszeilenargument oder cursorBlink
der 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, imctlseqs
Datei; 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'
}