わかりました、それで私は最終的に大きな変化をしました。私の.zshenvで、エディターを変更しました:
export EDITOR=vim
いくつかの質問があり、それらは非常に軽微で、個別の質問を開始したくありませんでした。はい、どうぞ:
Vimのように、zshで挿入モードとコマンドモードを区別するにはどうすればよいですか?できれば、カーソルを下線からvimのようなブロックに変更しますが、下部にテキストを表示することもできます。
Vimのように振る舞わせるにはどうすればよいですか?たとえば、私はむしろそれがデフォルトでコマンドモードになり、1つのコマンドの後にそれから出ないことを望みます。
1。)( http://zshwiki.org/home/examples/zlewidgets および http: //pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-Prompt/ ):
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
どこ:
「RPS」は「右のプロンプト文字列」を意味し、端末の右側に表示されるプロンプトを定義します。$ {variable/pattern/replacement}の構文は「パラメーターの展開」の構文です。次を参照してください: 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を作成する必要があると思われます。最初の問題の2つのリンクの最初に触発されます。
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
これらの2行は、コマンドモードで起動することを確認します
以下では、変更されたカーソルと現在のモードを表示するプロンプトが表示されます。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)'
注:これはzOS(5.3.1)を搭載したMacOS(10.12.6)のTerminal.app(2.7.3)でのみテストしました。また、edit-command-line
を追加すると、モードも正しく設定されます。