私はbindkey -v
(bashユーザーの場合はset -o vi
zshにも当てはまると思います)またはvi(m)モードを使用します。しかし、私を迷惑にするのは、私が現在挿入モードかコマンドモードであるかを知らせる視覚的な手がかりがないことです。私のプロンプトショーモーダルを作成する方法を知っている人はいますか?
答え1
答え2
zle-keymap-select
モードが変わるたびに何が実行されているかがわかりました。端末が何をサポートしているか(もちろんモードインジケータの表示の好み)に応じて、プロンプトに加えて他のビジュアルインジケータを設定するためにこれを使用できます。
標準があります用語情報能力カーソルの外観を変更します。ただし、一部の端末では、両方のモードで同じカーソルが表示されます。目に見えないカーソルの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仕様別)を使用してカーソルの色を変更することもできます。これらのシーケンスは xterm のドキュメントで説明されています。ctlseqs
ファイル;最新の端末エミュレータはxtermをエミュレートすることがよくありますが、その機能をすべてサポートしているわけではありません。
答え3
複数行のプロンプトを含むリセットプロンプトの使用に問題がある場合は、以下を使用してください。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
答え4
zshで「ブロック」と「ビーム」の形の間でカーソルを変更するために使用する方法は次のとおりです。
(試験用シロアリ、GNOME端末そしてペアリング端子)
# 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'
}