Подсветка квадратных скобок в стиле readline в Zsh

Форматируется одинаково в обеих системах:

$ ip a show eth0 # stretch
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 40:b0:34:96:d9:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.77/24 brd 192.168.0.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 fe80::39db:8c13:722f:b088/64 scope link tentative 
   valid_lft forever preferred_lft forever

$ ip a show eth0 # raspbian jessie
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:71:d5:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 fe80::1e43:2c74:e7d6:6419/64 scope link 
   valid_lft forever preferred_lft forever
2
02.12.2019, 22:13
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
1
27.01.2020, 22:16

Теги

Похожие вопросы