나는 bindkey -v
(bash 사용자의 경우 set -o vi
zsh에도 적용된다고 생각함) 또는 vi(m) 모드를 사용합니다. 그러나 나를 짜증나게 하는 것은 내가 현재 삽입 모드인지 명령 모드인지를 알려주는 시각적인 단서가 없다는 것입니다. 내 프롬프트 쇼 모달을 만드는 방법을 아는 사람이 있나요?
답변1
답변2
zle-keymap-select
모드가 바뀔 때마다 어떤 것이 실행되는지 알아냈습니다 . 터미널이 무엇을 지원하는지(물론 모드 표시기 표시에 대한 취향도)에 따라 프롬프트 외에 다른 시각적 표시기를 설정하는 데 이를 사용할 수 있습니다.
표준이 있습니다용어 정보 역량커서의 모양을 변경합니다. 그러나 일부 터미널에서는 두 모드 모두에서 동일한 커서를 표시합니다. 보이지 않는 커서에 대한 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'
}