|
@@ -1923,9 +1923,9 @@ void dynamically_expand()
|
|
|
if(dynaex.query == NULL) {
|
|
|
dynaex.end = curbp->b_point;
|
|
|
dynaex.start = curbp->b_point-1;
|
|
|
- dynaex.sp = 0;
|
|
|
while(isalpha(*(p = ptr(curbp, --dynaex.start))) || isdigit(*p) || *p == '_')
|
|
|
;;
|
|
|
+ dynaex.sp = dynaex.start;
|
|
|
dynaex.start++;
|
|
|
dynaex.nquery = dynaex.end - dynaex.start;
|
|
|
dynaex.nresult = dynaex.nquery;
|
|
@@ -1940,35 +1940,46 @@ void dynamically_expand()
|
|
|
}
|
|
|
|
|
|
restart:
|
|
|
- while (dynaex.sp < endpoint) {
|
|
|
- if(dynaex.sp >= dynaex.start && dynaex.sp <= dynaex.end) {
|
|
|
- dynaex.sp++;
|
|
|
- continue;
|
|
|
+ i = dynaex.nquery-1;
|
|
|
+ j = i;
|
|
|
+ int dir = -1;
|
|
|
+ point_t match = 0;
|
|
|
+ while (!(dynaex.sp >= dynaex.start && dynaex.sp <= dynaex.end)) {
|
|
|
+ if(dynaex.sp == -1) {
|
|
|
+ dynaex.sp = endpoint;
|
|
|
}
|
|
|
p = ptr(curbp, dynaex.sp);
|
|
|
- if(i == dynaex.nquery) {
|
|
|
+ if(i == -1) {
|
|
|
if(!isalpha(*p) && !isdigit(*p) && *p != '_') {
|
|
|
+ dynaex.sp = match;
|
|
|
break;
|
|
|
}
|
|
|
result[j] = *p;
|
|
|
result[++j] = '\0';
|
|
|
} else if(*p == dynaex.query[i]) {
|
|
|
result[j] = dynaex.query[i];
|
|
|
- i++;
|
|
|
- j++;
|
|
|
+ i--;
|
|
|
+ j--;
|
|
|
+ if(i == -1) {
|
|
|
+ j = dynaex.nquery;
|
|
|
+ dir = 1;
|
|
|
+ match = dynaex.sp;
|
|
|
+ dynaex.sp += dynaex.nquery - 1;
|
|
|
+ }
|
|
|
} else if(i > 0) {
|
|
|
- i = 0;
|
|
|
- j = 0;
|
|
|
+ i = dynaex.nquery-1;
|
|
|
+ j = i;
|
|
|
+ dir = -1;
|
|
|
}
|
|
|
- dynaex.sp++;
|
|
|
+ dynaex.sp += dir;
|
|
|
}
|
|
|
|
|
|
currentcommand = KBD_EXPAND;
|
|
|
|
|
|
- if(dynaex.sp == endpoint) {
|
|
|
+ if(dynaex.sp >= dynaex.start && dynaex.sp <= dynaex.end) {
|
|
|
msg("No dynamic expansion for \"%s\" found.", dynaex.query);
|
|
|
/* Free the struct so we can loop again */
|
|
|
- dynaex.sp = 0;
|
|
|
+ dynaex.sp = dynaex.start - 1;
|
|
|
dr = dynaex.results;
|
|
|
while(dynaex.results != NULL) {
|
|
|
dr = dynaex.results;
|
|
@@ -1986,18 +1997,17 @@ restart:
|
|
|
}
|
|
|
|
|
|
/* Check if the match has been used before, if so, skip it. */
|
|
|
- for(dr = dynaex.results; dr->result != NULL; dr = dr->d_next) {
|
|
|
+ for(dr = dynaex.results; dr != NULL && dr->result != NULL; dr = dr->d_next) {
|
|
|
int k = 0;
|
|
|
for(; dr->result[k] != '\0'; k++) {
|
|
|
if(dr->result[k] != result[k])
|
|
|
break;
|
|
|
}
|
|
|
- if(dr->result[k] == '\0') {
|
|
|
+ if(dr->result[k] == '\0' && result[k] == '\0') {
|
|
|
i = 0;
|
|
|
j = 0;
|
|
|
goto restart;
|
|
|
- } else
|
|
|
- break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
curbp->b_point = dynaex.start;
|