내가 사용 bindkey -v(bash는이-ERS를 위해 set -o vi또는 VI (m) 모드 내가 그 zsh을의 작품도 생각). 그러나 삽입 모드인지 명령 모드인지 여부를 알려주는 시각적 신호가 없다는 것이 버그입니다. 내 프롬프트가 모드를 표시하는 방법을 아는 사람이 있습니까?
내가 사용 bindkey -v(bash는이-ERS를 위해 set -o vi또는 VI (m) 모드 내가 그 zsh을의 작품도 생각). 그러나 삽입 모드인지 명령 모드인지 여부를 알려주는 시각적 신호가 없다는 것이 버그입니다. 내 프롬프트가 모드를 표시하는 방법을 아는 사람이 있습니까?
답변:
내가 발견 이를 통해 SU . 기본 예제는 다음과 같습니다. 그래도 사용자 정의하고 있습니다.
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
나는 아직 그것을 이해하지 못하는 것을 제외하고 그것을 설명 할 것이다.
zle reset-prompt(여러 줄을 당신의 프롬프트 경우) 다시 그릴 때 프롬프트 위의 라인 (더 이상)을 삭제합니다 :( 이것은 showstopper 나를 위해.
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 사양)을 사용하여 커서 색을 변경할 수도 있습니다 . 이 순서는 ctlseqs파일 의 xterm 문서에 설명되어 있습니다. 최신 터미널 에뮬레이터는 일반적으로 xterm을 에뮬레이트하지만 모든 기능을 지원하지는 않습니다.
main위해 KEYMAP대신 viins, 확실하지 왜.
main은 zsh가 좋아하는 편집기를 vi로 시작 했는지 여부에 대한 별칭 viins또는 별명입니다 . 에서 모드를 다시 전환 할 때 사용할 것이라고 생각 했지만 대신 사용하는 것 같습니다 . 업데이트되었습니다. emacsviinsvicmdmain
zle-line-init(또는 다른 방법으로) 두 배로 zle-keymap-select늘려야합니다.
: 리셋 프롬프트 여러 프롬프트로를 사용하는 데 문제가 사람들의 경우, 이것은 나를 위해 일한 http://zeitlens.com/posts/2014-06-29-howto-zsh-vi-style.html 와 함께 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
당신은 VimMode 를 시도 할 수 있습니다
이것은 zsh에서 'Block'과 'Beam'모양 사이에서 커서를 변경하는 데 사용하는 것입니다.
( Termite , gnome-terminal 및 mate-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'
}
add-zsh-hook하므로 gist.github.com/MatrixManAtYrService/…
I- 빔과 블록 사이에서 커서 모양을 변경하는 또 다른 솔루션입니다 (밑줄의 경우 \033[4 q). 에 추가하십시오 ~/.zshrc.
zle-keymap-select () {
if [ $KEYMAP = vicmd ]; then
printf "\033[2 q"
else
printf "\033[6 q"
fi
}
zle -N zle-keymap-select
zle-line-init () {
zle -K viins
printf "\033[6 q"
}
zle -N zle-line-init
bindkey -v
https://bbs.archlinux.org/viewtopic.php?id=95078 에서 수정되었습니다 . 그놈 터미널에서 테스트 3.22.
커서 모양 변경에 대한 또 다른 해결책은 여기에서 찾을 수 있습니다 . 이것은 분명히 iTerm2에서 작동하며 테스트 할 수단이 없지만 다른 사람에게 유용 할 수 있도록 여기에 추가 할 수 있습니다. 당신의 마지막 추가 ~/.zshrc는
function zle-keymap-select zle-line-init
{
# change cursor shape in iTerm2
case $KEYMAP in
vicmd) print -n -- "\E]50;CursorShape=0\C-G";; # block cursor
viins|main) print -n -- "\E]50;CursorShape=1\C-G";; # line cursor
esac
zle reset-prompt
zle -R
}
function zle-line-finish
{
print -n -- "\E]50;CursorShape=0\C-G" # block cursor
}
zle -N zle-line-init
zle -N zle-line-finish
zle -N zle-keymap-select
현재 Zsh를 초고속 열차 테마로 사용하고 있습니다. Sebastian Blask의 답변에 의해 주어진 예에 따라 , 나는 다음 코드로 끝났습니다.
bindkey -v
KEYTIMEOUT=1
function zle-line-init zle-keymap-select {
case ${KEYMAP} in
(vicmd) BULLETTRAIN_PROMPT_CHAR="N" ;;
(main|viins) BULLETTRAIN_PROMPT_CHAR="I" ;;
(*) BULLETTRAIN_PROMPT_CHAR="I" ;;
esac
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
이것은 기본 $ 만 문자 N 으로 일반 모드로, I 를 삽입 모드로 변경합니다.
이 이미지는 정상 모드에서 Ctrl+를 누를 때의 예입니다 C.
Sebastian Blask의 게시물을 기반으로 한 또 다른 버전이 있습니다. 내가 찾을 수있는 다른 모든 솔루션은 여분의 줄, 오른쪽 상태 또는 추가 문자를 사용했기 때문에 가능한 한 방해가되지 않았습니다.
$일반 모드가 활성화되면 단순히 흰색에서 빨간색으로 색상이 변경 됩니다. 원하는대로 프롬프트 편집
bindkey -v
function zle-line-init zle-keymap-select {
case ${KEYMAP} in
(vicmd) PROMPT=$'%{\e[0;32m%}%~%{\e[0m%} %{\e[0;31m%}$%{\e[0m%} ' ;;
(main|viins) PROMPT=$'%{\e[0;32m%}%~%{\e[0m%} $ ' ;;
(*) PROMPT=$'%{\e[0;32m%}%~%{\e[0m%} $ ' ;;
esac
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
oh-my-zsh사용자를 위한 버전oh-my-zsh호출 vi-mode할 수 있는 플러그인이 여기에 있습니다.
robbyrussell / oh-my-zsh / plugins / vi-mode
Antigen을 사용하여 플러그인을 관리하므로 내 플러그인을 추가하는 것만 큼 간단합니다 .zshrc.
antigen bundle vi-mode
zsh을-VIM-모드 플러그인 삽입, 명령, 검색, 교체 및 시각적 모드에 대한 지표를 표시 할 수 있습니다. 다른 답변의 기본 기술을 사용하여 다양한 ZLE 후크 (zle-keymap-select, zle-isearch-update 등)에 연결합니다. [[ $ZLE_STATE = *overwrite* ]]교체 모드를 확인 합니다. 이 검사 $REGION_ACTIVE영상 모드를 식별 할 수 있습니다.
isearch 모드를 종료 할 때 ZSH가 이벤트를 발생시키는 방법에 대한 몇 가지 단점으로 인해 논리가 복잡해집니다.
모듈의 또 다른 멋진 기능은 모드에 따라 커서 모양과 색상을 변경하는 기능입니다. 예를 들어, INSERT 모드에서 세로 막대를 사용하고 SEARCH 모드에서 깜박이는 밑줄을 사용할 수 있습니다.
CTRL+Cvi 명령 모드에 있을 때와 같은 작업을 수행 하면 프롬프트가 재설정되지만 실제로 삽입 모드에있을 때는 명령 모드에 표시됩니다.zle-line-init항상 표시기를 삽입 모드로 변경해야합니다.$KEYMAPzle-line-init가 호출 될 때 어떤 이유로 제대로 업데이트되지 않습니다.