Zshで強調表示されるReadlineスタイルブラケット

Zshで強調表示されるReadlineスタイルブラケット

時には、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

おすすめ記事