내가 사용 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
또는 별명입니다 . 에서 모드를 다시 전환 할 때 사용할 것이라고 생각 했지만 대신 사용하는 것 같습니다 . 업데이트되었습니다. emacs
viins
vicmd
main
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+C
vi 명령 모드에 있을 때와 같은 작업을 수행 하면 프롬프트가 재설정되지만 실제로 삽입 모드에있을 때는 명령 모드에 표시됩니다.zle-line-init
항상 표시기를 삽입 모드로 변경해야합니다.$KEYMAP
zle-line-init가 호출 될 때 어떤 이유로 제대로 업데이트되지 않습니다.