
時には、Zshで長いコマンドを書くか、RやPerlなどの他の言語のコードを含む長い文字列リテラルで終わるZshコマンドを書くが、かっこ、角かっこ、または中かっこを忘れます。blink-matching-paren
閉じカッコを入力すると、Readline 変数は対応する開かカッコをしばらく点滅します。 Zshに似たものをどうやって入手できますか?show-paren-mode
テキストカーソルが上にあるたびに、対応する括弧を強調表示するEmacsと同等の機能が優れています。
brackets
蛍光ペンはzsh-syntax-highlighting
この方向にありますが、引用された構造では機能しません。まさにこれが私が本当に必要とするところです(混乱しても、角かっこがバックスラッシュでエスケープされている場合、角かっこはまだ強調表示されます)。
答え1
zsh
同等の組み込みメカニズムはないと思いますが、次のカスタムウィジェットを使用してこれを行うことができるはずです。
zmodload zsh/zselect
showmatch() {
emulate -L zsh
set -o rematchpcre
local -A pair=(
']' '['
')' '('
'}' '{'
)
local MBEGIN
zle .self-insert
if [[ $LBUFFER =~ "(\\$pair[$KEYS](?:[^$KEYS$pair[$KEYS]]++|(?1))*\\$KEYS)\$" ]]; then
local oldCURSOR=$CURSOR
CURSOR=$MBEGIN-1
zle -R
zselect -t 50 -r 0 < /dev/tty
CURSOR=$oldCURSOR
fi
}
zle -N showmatch
bindkey ']' showmatch
bindkey ')' showmatch
bindkey '}' showmatch
if
/ 内部を次に置き換えて、一致するfi
括弧の間の領域を一時的に強調表示することもできます。
local oldCURSOR=$CURSOR
region_highlight+=("$((MBEGIN-1)) $CURSOR bg=yellow,fg=black,bold")
CURSOR=$MBEGIN-1
zle -R
zselect -t 50 -r 0 < /dev/tty
CURSOR=$oldCURSOR
region_highlight[-1]=()
(ここでは黄色の背景に黒いテキストで強調表示されています。)
show-paren-mode
次のように、カーソルが一端に達したときに一致する括弧を同様の強調表示と組み合わせることもできます。
zmodload zsh/zselect
SHOWMATCH_GR=fg=black,bg=yellow,bold
showmatch() {
emulate -L zsh
set -o rematchpcre
local -A pair=(
']' '['
')' '('
'}' '{'
)
local MBEGIN
zle .self-insert
if [[ $LBUFFER =~ "(\\$pair[$KEYS](?:[^$KEYS$pair[$KEYS]]++|(?1))*\\$KEYS)\$" ]]; then
local oldCURSOR=$CURSOR
local -a old_region_highlight=($region_highlight)
region_highlight+=("$((MBEGIN-1)) $CURSOR $SHOWMATCH_GR")
CURSOR=$MBEGIN-1
zle -R
zselect -t 50 -r 0 < /dev/tty
CURSOR=$oldCURSOR
region_highlight=($old_region_highlight)
fi
}
zle -N showmatch
bindkey ']' showmatch
bindkey ')' showmatch
bindkey '}' showmatch
zle-line-pre-redraw() {
emulate -L zsh
set -o rematchpcre
region_highlight=(${region_highlight:#* $SHOWMATCH_GR})
local a=$BUFFER[CURSOR+1] b c MBEGIN o=0
local -A pair=(
']' '['
')' '('
'}' '{'
)
[[ -n "$RBUFFER" ]] &&
case $a in
([[\({])
b=${(k)pair[(re)$a]}
[[ $RBUFFER =~ "^(\\$a(?:[^$b$a]++|(?1))*\\$b)" ]] && o=$CURSOR;;
([]\)}])
b=$pair[$a]
[[ $LBUFFER$a =~ "(\\$b(?:[^$a$b]++|(?1))*\\$a)\$" ]];;
(*) return;;
esac &&
region_highlight+=("$((o+MBEGIN-1)) $((o+MEND)) $SHOWMATCH_GR")
}
zle -N zle-line-pre-redraw