Skip to content

Commit

Permalink
Add match-bracket widget that takes a position and/or parameter to st…
Browse files Browse the repository at this point in the history
…ore result, and does no weird vi stuff

I use this in my zle-line-pre-redraw hook,

  local -a hackcol=(red cyan)
  local mpos cpos off
  for off in 0 1; do
    (( cpos = CURSOR - off ))
    if (( cpos >= 0 )) && zle .match-bracket $cpos mpos; then
      region_highlight+=("$((cpos)) $((cpos+1)) bold,bg=${hackcol[2]},fg=black"
                         "$((mpos)) $((mpos+1)) bold,bg=${hackcol[1]},fg=black")
      break
    fi
  done
  • Loading branch information
Mikachu committed Sep 27, 2015
1 parent 8ab150a commit 72f7f90
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
1 change: 1 addition & 0 deletions Src/Zle/iwidgets.list
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"list-choices", listchoices, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL | ZLE_ISCOMP
"list-expand", listexpand, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
"magic-space", magicspace, ZLE_KEEPSUFFIX | ZLE_MENUCMP
"match-bracket", matchbracket, ZLE_KEEPSUFFIX | ZLE_MENUCMP
"menu-complete", menucomplete, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_ISCOMP
"menu-expand-or-complete", menuexpandorcomplete, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_ISCOMP
"neg-argument", negargument, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL | ZLE_NOTCOMMAND
Expand Down
74 changes: 74 additions & 0 deletions Src/Zle/zle_move.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,80 @@ vigotocolumn(UNUSED(char **args))
return 0;
}

/**/
int
matchbracket(char **args)
{
int ocs = zlecs, dir, ct;
unsigned char oth, me;

if (*args) {
char *end = NULL;
zlecs = zstrtol(*args, &end, 10);
if (end && end != *args && *end == '\0')
args++;
else
zlecs = ocs;
}

if (zlecs == zlell || zleline[zlecs] == '\n') {
zlecs = ocs;
return 1;
}
switch (me = zleline[zlecs]) {
case '{':
dir = 1;
oth = '}';
break;
case /*{*/ '}':
dir = -1;
oth = '{'; /*}*/
break;
case '(':
dir = 1;
oth = ')';
break;
case ')':
dir = -1;
oth = '(';
break;
case '[':
dir = 1;
oth = ']';
break;
case ']':
dir = -1;
oth = '[';
break;
default:
zlecs = ocs;
return 1;
}
ct = 1;
while (zlecs >= 0 && zlecs < zlell && ct) {
if (dir < 0)
DECCS();
else
INCCS();
if (zleline[zlecs] == oth)
ct--;
else if (zleline[zlecs] == me)
ct++;
}
if (zlecs < 0 || zlecs >= zlell) {
zlecs = ocs;
return 1;
}

if (*args) {
char digs[100];
sprintf(digs, "%d", zlecs);
zlecs = ocs;
setsparam(*args, ztrdup(digs));
}
return 0;
}

/**/
int
vimatchbracket(UNUSED(char **args))
Expand Down

0 comments on commit 72f7f90

Please sign in to comment.