나는 사용한다vi 모드존재하다아 맙소사그리고AF-매직 주제.
현재 위치에 있는지 커서 스타일로 표시하고 싶습니다.일반 모드(블록) 또는삽입 모드(량), zsh
및 vim
.
이것이 내가 지금까지 가지고 있는 것입니다:
내 ~/.zshrc
:
# 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'
}
발견하다여기.
이러한 구성을 사용하면 독립적으로 고려할 때 둘 다 잘 작동합니다 zsh
. vim
그러나 내가 in vim
에서 들어갈 때zsh
삽입 모드, vim
로 시작일반 모드(그렇게 해야 하지만) 빔 모양 커서는 여전히 표시됩니다. 마찬가지로 종료하면 vim
다시 들어갑니다 zsh
.삽입 모드, 그러나 커서는 여전히 블록에 있습니다(마지막 모드 vim
가정상).
그 후 처음으로 모드를 전환하면(in 및 out zsh
) vim
커서가 다시 정상적으로 작동합니다.
들어가고 나온 후에도 vim
올바른 커서를 표시하려면 어떻게 해야 합니까?
넣어보려고
autocmd VimEnter * stopinsert
autocmd VimLeave * startinsert
my 에서는 ~.vimrc
커서에 영향을 미치지 않습니다.
답변1
precmd()
대신 사용하는 것이 더 낫다고 생각합니다 preexec()
.
# .zshrc
_fix_cursor() {
echo -ne '\e[5 q'
}
precmd_functions+=(_fix_cursor)
이 방법:
- 넌 바꿀 필요 없어
.vimrc
- 명령을 실행하지 않고 새 프롬프트를 생성해도 커서가 고정됩니다.
- 당신은 당신
echo -ne '\e[5 q'
의.zshrc
.
답변2
이것은 나에게 효과적입니다. 여기에서 가져 왔습니다.https://gist.github.com/LukeSmithxyz/e62f26e55ea8b0ed41a65912fbebbe52
# vi mode
bindkey -v
export KEYTIMEOUT=1
# 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
zle-line-init() {
zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
echo -ne "\e[5 q"
}
zle -N zle-line-init
echo -ne '\e[5 q' # Use beam shape cursor on startup.
preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
\e[5 q
아래와 같이 숫자를 순서대로(빔은 5, 블록은 1) 변경하여 원하는 커서 유형(깜박임, |, 직사각형 또는 _)을 사용자 정의할 수 있습니다.
Set cursor style (DECSCUSR), VT520.
0 ⇒ blinking block.
1 ⇒ blinking block (default).
2 ⇒ steady block.
3 ⇒ blinking underline.
4 ⇒ steady underline.
5 ⇒ blinking bar, xterm.
6 ⇒ steady bar, xterm.
답변3
답변4
당신은 또한 사용할 수 있습니다zle-line-init()
zle-line-init() {
zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
echo -ne "\e[5 q"
}
precmd()
대신 이것을 사용 하거나 preexec()
둘 다 프롬프트를 수정하는 것이 아니라 명령을 실행하는 데 사용되기 때문에 문제가 더 잘 해결될 것이라고 생각합니다 .