1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-03 10:21:46 +02:00

save and restore more variables in bufferwords(); move gotword() into core (11523)

This commit is contained in:
Sven Wischnowsky 2000-05-23 08:20:56 +00:00
parent de2c2a89c6
commit 7f9f81f3e2
8 changed files with 98 additions and 34 deletions

View file

@ -1,3 +1,9 @@
2000-05-23 Sven Wischnowsky <wischnow@zsh.org>
* 11523: Src/hist.c, Src/init.c, Src/lex.c, Src/zsh.h, Src/Zle/zle.h,
Src/Zle/zle_main.c, Src/Zle/zle_tricky.c: save and restore more
variables in bufferwords(); move gotword() into core
2000-05-22 Oliver Kiddle <opk@zsh.org>
* 11517: Completion/Core/_next_label: don't lose empty arguments

View file

@ -30,15 +30,14 @@
#undef trashzle
#undef zleread
#undef spaceinline
#undef gotword
#undef refresh
#undef zrefresh
typedef struct widget *Widget;
typedef struct thingy *Thingy;
/* widgets (ZLE functions) */
typedef void (*ZleIntFunc) _((void));
typedef int (*ZleIntFunc) _((char **));
struct widget {
int flags; /* flags (see below) */
@ -46,16 +45,24 @@ struct widget {
union {
ZleIntFunc fn; /* pointer to internally implemented widget */
char *fnnam; /* name of the shell function for user-defined widget */
struct {
ZleIntFunc fn; /* internal widget function to call */
char *wid; /* name of widget to call */
char *func; /* name of shell function to call */
} comp;
} u;
};
#define WIDGET_INT (1<<0) /* widget is internally implemented */
#define ZLE_MENUCMP (1<<1) /* DON'T invalidate completion list */
#define WIDGET_INT (1<<0) /* widget is internally implemented */
#define WIDGET_NCOMP (1<<1) /* new style completion widget */
#define ZLE_MENUCMP (1<<2) /* DON'T invalidate completion list */
#define ZLE_YANK (1<<3)
#define ZLE_LINEMOVE (1<<4) /* command is a line-oriented movement */
#define ZLE_LASTCOL (1<<5) /* command maintains lastcol correctly */
#define ZLE_LINEMOVE (1<<4) /* command is a line-oriented movement */
#define ZLE_LASTCOL (1<<5) /* command maintains lastcol correctly */
#define ZLE_KILL (1<<6)
#define ZLE_KEEPSUFFIX (1<<9) /* DON'T remove added suffix */
#define ZLE_KEEPSUFFIX (1<<7) /* DON'T remove added suffix */
#define ZLE_NOTCOMMAND (1<<8) /* widget should not alter lastcmd */
#define ZLE_ISCOMP (1<<9) /* usable for new style completion */
/* thingies */
@ -99,6 +106,7 @@ struct change {
int off; /* offset of the text changes */
char *del; /* characters to delete (metafied) */
char *ins; /* characters to insert (metafied) */
int old_cs, new_cs; /* old and new cursor positions */
};
#define CH_NEXT (1<<0) /* next structure is also part of this change */
@ -118,7 +126,7 @@ typedef void (*KeyScanFunc) _((char *, Thingy, char *, void *));
/* Standard type of suffix removal. */
#define removesuffix() iremovesuffix(256)
#define removesuffix() iremovesuffix(256, 0)
/* Cut/kill buffer type. The buffer itself is purely binary data, *
* not NUL-terminated. len is a length count. flags uses the *
@ -135,3 +143,54 @@ typedef struct cutbuffer *Cutbuffer;
#define CUTBUFFER_LINE 1 /* for vi: buffer contains whole lines of data */
#define KRINGCT 8 /* number of buffers in the kill ring */
/* Types of completion. */
#define COMP_COMPLETE 0
#define COMP_LIST_COMPLETE 1
#define COMP_SPELL 2
#define COMP_EXPAND 3
#define COMP_EXPAND_COMPLETE 4
#define COMP_LIST_EXPAND 5
#define COMP_ISEXPAND(X) ((X) >= COMP_EXPAND)
/* Information about one brace run. */
typedef struct brinfo *Brinfo;
struct brinfo {
Brinfo next; /* next in list */
Brinfo prev; /* previous (only for closing braces) */
char *str; /* the string to insert */
int pos; /* original position */
int qpos; /* original position, with quoting */
int curpos; /* position for current match */
};
/* Convenience macros for the hooks */
#define LISTMATCHESHOOK (zlehooks + 0)
#define COMPLETEHOOK (zlehooks + 1)
#define BEFORECOMPLETEHOOK (zlehooks + 2)
#define AFTERCOMPLETEHOOK (zlehooks + 3)
#define ACCEPTCOMPHOOK (zlehooks + 4)
#define REVERSEMENUHOOK (zlehooks + 5)
#define INVALIDATELISTHOOK (zlehooks + 6)
/* complete hook data struct */
typedef struct compldat *Compldat;
struct compldat {
char *s;
int lst;
int incmd;
};
/* List completion matches. */
#define listmatches() runhookdef(LISTMATCHESHOOK, NULL)
/* Invalidate the completion list. */
#define invalidatelist() runhookdef(INVALIDATELISTHOOK, NULL)

View file

@ -1039,7 +1039,6 @@ setup_(Module m)
{
/* Set up editor entry points */
trashzleptr = trashzle;
gotwordptr = gotword;
refreshptr = zrefresh;
spaceinlineptr = spaceinline;
zlereadptr = zleread;
@ -1116,7 +1115,6 @@ finish_(Module m)
/* editor entry points */
trashzleptr = noop_function;
gotwordptr = noop_function;
refreshptr = noop_function;
spaceinlineptr = noop_function_int;
zlereadptr = fallback_zleread;

View file

@ -58,11 +58,6 @@ mod_export int clwsize, clwnum, clwpos;
/**/
mod_export char **clwords;
/* wb and we hold the beginning/end position of the word we are completing. */
/**/
mod_export int wb, we;
/* offs is the cursor position within the tokenized *
* current word after removing nulargs. */
@ -1692,19 +1687,6 @@ doexpansion(char *s, int lst, int olst, int explincmd)
return ret;
}
/* This is called from the lexer to give us word positions. */
/**/
void
gotword(void)
{
we = ll + 1 - inbufct + (addedx == 2 ? 1 : 0);
if (cs <= we) {
wb = ll - wordbeg + addedx;
zleparse = 0;
}
}
/**/
static int
docompletion(char *s, int lst, int incmd)

View file

@ -2059,6 +2059,7 @@ mod_export LinkList
bufferwords(LinkList list, char *buf, int *index)
{
int num = 0, cur = -1, got = 0, ne = noerrs, ocs = cs;
int owb = wb, owe = we, oadx = addedx, ozp = zleparse;
char *p;
if (!list)
@ -2131,10 +2132,14 @@ bufferwords(LinkList list, char *buf, int *index)
noaliases = 0;
strinend();
inpop();
errflag = zleparse = 0;
errflag = 0;
zleparse = ozp;
noerrs = ne;
lexrestore();
cs = ocs;
wb = owb;
we = owe;
addedx = oadx;
if (index)
*index = cur;

View file

@ -1025,8 +1025,6 @@ noop_function_int(int nothing)
/**/
mod_export ZleVoidFn trashzleptr = noop_function;
/**/
mod_export ZleVoidFn gotwordptr = noop_function;
/**/
mod_export ZleVoidFn refreshptr = noop_function;
/**/
mod_export ZleVoidIntFn spaceinlineptr = noop_function_int;
@ -1036,7 +1034,6 @@ mod_export ZleReadFn zlereadptr = autoload_zleread;
#else /* !LINKED_XMOD_zshQszle */
mod_export ZleVoidFn trashzleptr = noop_function;
mod_export ZleVoidFn gotwordptr = noop_function;
mod_export ZleVoidFn refreshptr = noop_function;
mod_export ZleVoidIntFn spaceinlineptr = noop_function_int;
# ifdef UNLINKED_XMOD_zshQszle

View file

@ -93,6 +93,11 @@ mod_export int inwhat;
/**/
mod_export int addedx;
/* wb and we hold the beginning/end position of the word we are completing. */
/**/
mod_export int wb, we;
/* 1 if aliases should not be expanded */
/**/
@ -1483,6 +1488,19 @@ parse_subst_string(char *s)
return 0;
}
/* Called below to report word positions. */
/**/
mod_export void
gotword(void)
{
we = ll + 1 - inbufct + (addedx == 2 ? 1 : 0);
if (cs <= we) {
wb = ll - wordbeg + addedx;
zleparse = 0;
}
}
/* expand aliases and reserved words */
/**/

View file

@ -30,7 +30,6 @@
#define trashzle() trashzleptr()
#define zleread(X,Y,H) zlereadptr(X,Y,H)
#define spaceinline(X) spaceinlineptr(X)
#define gotword() gotwordptr()
#define zrefresh() refreshptr()
#define compctlread(N,A,O,R) compctlreadptr(N,A,O,R)