좋아, 마침내 나는 큰 변화를 만들었다. 내 .zshenv에서 EDITOR를 변경했습니다.
export EDITOR=vim
내가 가진 몇 가지 질문이 있는데, 그 질문들에 대해 별도의 질문을 시작하고 싶지 않았습니다. 여기 있습니다:
-
vim에서와 같이 zsh가 삽입 모드와 명령 모드를 구별하도록하려면 어떻게해야합니까? vim과 같이 커서를 밑줄에서 블록으로 변경하는 것이 바람직하지만, 맨 아래에 텍스트를 표시해도 효과가 있습니다.
-
vim처럼 작동하도록하려면 어떻게해야합니까? 예를 들어, 기본적으로 명령 모드에 있고 하나의 명령 후에 나가지 않습니다.
답변
1. ) ( http://zshwiki.org/home/examples/zlewidgets 및 http://pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-prompt/ 참조 ) :
기능 zle-line-init zle-keymap-select { RPS1 = "$ {$ {KEYMAP / vicmd /-NORMAL-} / (main | viins) /-INSERT-}" RPS2 = $ RPS1 zle 재설정 프롬프트 } zle -N zle-line-init zle -N zle 키맵 선택
어디에:
-
“RPS”는 ‘오른쪽 프롬프트 문자열’을 나타내며 터미널의 오른쪽에 나타나는 프롬프트를 정의하며 $ {variable / pattern / replacement} 구문은 ‘parameter expansion’의 구문입니다. http : // mywiki .wooledge.org / BashSheet # Parameter_Operations .
-
‘zle -N’은 사용자 정의 가능 위젯 ‘zle-line-init’및 ‘zle-keymap-select’가 동일한 이름의 쉘 기능에 바인드되어 라인 편집기가 초기화 될 때 호출되도록합니다. 키맵이 각각 변경되었습니다. http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC125를 참조하십시오 .
2. ) 나는 그것을하기 위해 또 다른 zsh-widget을 작성해야한다고 생각합니다. 첫 번째 문제에 대한 두 링크 중 첫 번째 링크에서 영감을 얻으십시오.
답변
여러 줄 프롬프트를 사용할 때 akira의 솔루션에는 다음과 같은 문제가 있습니다. ins에서 cmd 모드로 전환 할 때 프롬프트 다시 그리기로 인해 이전 출력에서 몇 줄이 삭제되고 새 프롬프트가 몇 줄 위에 표시됩니다. 줄 수는 프롬프트에 몇 줄이 있는지에 달려 있습니다.
그것을 다루는 방법은 거기 에서 사용 zle-line-finish
하지 않고를 사용하는 zle reset-prompt
것입니다. 예를 들면 :
# perform parameter expansion/command substitution in prompt
setopt PROMPT_SUBST
vim_ins_mode="[INS]"
vim_cmd_mode="[CMD]"
vim_mode=$vim_ins_mode
function zle-keymap-select {
vim_mode="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}"
zle reset-prompt
}
zle -N zle-keymap-select
function zle-line-finish {
vim_mode=$vim_ins_mode
}
zle -N zle-line-finish
그런 다음 오른쪽 프롬프트에 추가 할 수 있습니다 (예 :
RPROMPT='${vim_mode}'
이것은 내 블로그 게시물에서 나온 것입니다.
답변
zle-line-init() { zle -K vicmd; }
zle -N zle-line-init
이 두 줄은 명령 모드에서 시작되는지 확인합니다.
답변
아래는. 수정 커서 당신이있는 모드를 표시하는 프롬프트를 설정합니다 당신은 변경할 수 있습니다 DEFAULT_VI_MODE
하나에 viins
또는 vicmd
. .zshrc
시작 하려면 아래를 새로 붙여 넣으십시오 .
# Prefer vi shortcuts
bindkey -v
DEFAULT_VI_MODE=viins
KEYTIMEOUT=1
__set_cursor() {
local style
case $1 in
reset) style=0;; # The terminal emulator's default
blink-block) style=1;;
block) style=2;;
blink-underline) style=3;;
underline) style=4;;
blink-vertical-line) style=5;;
vertical-line) style=6;;
esac
[ $style -ge 0 ] && print -n -- "\e[${style} q"
}
# Set your desired cursors here...
__set_vi_mode_cursor() {
case $KEYMAP in
vicmd)
__set_cursor block
;;
main|viins)
__set_cursor vertical-line
;;
esac
}
__get_vi_mode() {
local mode
case $KEYMAP in
vicmd)
mode=NORMAL
;;
main|viins)
mode=INSERT
;;
esac
print -n -- $mode
}
zle-keymap-select() {
__set_vi_mode_cursor
zle reset-prompt
}
zle-line-init() {
zle -K $DEFAULT_VI_MODE
}
zle -N zle-line-init
zle -N zle-keymap-select
# Optional: allows you to open the in-progress command inside of $EDITOR
autoload -Uz edit-command-line
bindkey -M vicmd 'v' edit-command-line
zle -N edit-command-line
# PROMPT_SUBST enables functions and variables to re-run everytime the prompt
# is rendered
setopt PROMPT_SUBST
# Single quotes are important so that function is not run immediately and saved
# in the variable
RPROMPT='$(__get_vi_mode)'
참고 :이를 zsh (5.3.1)가있는 MacOS (10.12.6)의 Terminal.app (2.7.3)에서만 테스트했습니다. 또한 추가 edit-command-line
하면 모드도 올바르게 설정됩니다.