mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-30 19:20:53 +02:00
24951: implement ZLS_COLORS ln=target
This commit is contained in:
parent
da037f7393
commit
dbe5fd93a7
5 changed files with 78 additions and 30 deletions
|
@ -5,6 +5,9 @@
|
|||
|
||||
2008-05-06 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 24951: Doc/Zsh/mod_complist, Src/Zle/comp.h, Src/Zle/compcore.c,
|
||||
Src/Zle/complist.c: implement ZLS_COLORS ln=target.
|
||||
|
||||
* 24937, 24938: Dag-Erling Smørgrav <des@des.no>: configure.ac:
|
||||
improved version of 24972.
|
||||
|
||||
|
|
|
@ -37,7 +37,9 @@ item(tt(di 32))(
|
|||
for directories
|
||||
)
|
||||
item(tt(ln 36))(
|
||||
for symbolic links
|
||||
for symbolic links. If this has the special value tt(target),
|
||||
symbolic links are dereferenced and the target file used to
|
||||
determine the display format.
|
||||
)
|
||||
item(tt(pi 31))(
|
||||
for named pipes (FIFOs)
|
||||
|
|
|
@ -114,6 +114,8 @@ struct cmatch {
|
|||
int gnum; /* global number */
|
||||
mode_t mode; /* mode field of a stat */
|
||||
char modec; /* LIST_TYPE-character for mode or nul */
|
||||
mode_t fmode; /* mode field of a stat, following symlink */
|
||||
char fmodec; /* LIST_TYPE-character for fmode or nul */
|
||||
};
|
||||
|
||||
#define CMF_FILE (1<< 0) /* this is a file */
|
||||
|
|
|
@ -2784,8 +2784,8 @@ add_match_data(int alt, char *str, char *orig, Cline line,
|
|||
(complist ?
|
||||
((strstr(complist, "packed") ? CMF_PACKED : 0) |
|
||||
(strstr(complist, "rows") ? CMF_ROWS : 0)) : 0));
|
||||
cm->mode = 0;
|
||||
cm->modec = '\0';
|
||||
cm->mode = cm->fmode = 0;
|
||||
cm->modec = cm->fmodec = '\0';
|
||||
if ((flags & CMF_FILE) && orig[0] && orig[strlen(orig) - 1] != '/') {
|
||||
struct stat buf;
|
||||
char *pb;
|
||||
|
@ -2799,6 +2799,11 @@ add_match_data(int alt, char *str, char *orig, Cline line,
|
|||
if ((cm->modec = file_type(buf.st_mode)) == ' ')
|
||||
cm->modec = '\0';
|
||||
}
|
||||
if (!ztat(pb, &buf, 0)) {
|
||||
cm->fmode = buf.st_mode;
|
||||
if ((cm->fmodec = file_type(buf.st_mode)) == ' ')
|
||||
cm->fmodec = '\0';
|
||||
}
|
||||
}
|
||||
if ((*compqstack == QT_BACKSLASH && compqstack[1]) ||
|
||||
(autoq && *compqstack && compqstack[1] == QT_BACKSLASH))
|
||||
|
@ -3208,6 +3213,8 @@ dupmatch(Cmatch m, int nbeg, int nend)
|
|||
r->disp = ztrdup(m->disp);
|
||||
r->mode = m->mode;
|
||||
r->modec = m->modec;
|
||||
r->fmode = m->fmode;
|
||||
r->fmodec = m->fmodec;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -108,12 +108,6 @@ static int mtab_been_reallocated;
|
|||
* as mtab and mmtabp.
|
||||
*/
|
||||
static Cmgroup *mgtab, *mgtabp;
|
||||
/*
|
||||
* Contains information about the colours to be used for entries.
|
||||
* Sometimes mcolors is passed as an argument even though it's
|
||||
* available to all the functions.
|
||||
*/
|
||||
static struct listcols mcolors;
|
||||
#ifdef DEBUG
|
||||
/*
|
||||
* Allow us to keep track of pointer arithmetic for mgtab; could
|
||||
|
@ -248,12 +242,26 @@ struct extcol {
|
|||
|
||||
typedef struct listcols *Listcols;
|
||||
|
||||
/* values for listcol flags */
|
||||
enum {
|
||||
/* ln=target: follow symlinks to determine highlighting */
|
||||
LC_FOLLOW_SYMLINKS = 0x0001
|
||||
};
|
||||
|
||||
struct listcols {
|
||||
Filecol files[NUM_COLS]; /* strings for file types */
|
||||
Patcol pats; /* strings for patterns */
|
||||
Extcol exts; /* strings for extensions */
|
||||
int flags; /* special settings, see above */
|
||||
};
|
||||
|
||||
/*
|
||||
* Contains information about the colours to be used for entries.
|
||||
* Sometimes mcolors is passed as an argument even though it's
|
||||
* available to all the functions.
|
||||
*/
|
||||
static struct listcols mcolors;
|
||||
|
||||
/* Combined length of LC and RC, maximum length of capability strings. */
|
||||
|
||||
static int lr_caplen, max_caplen;
|
||||
|
@ -428,24 +436,33 @@ getcoldef(char *s)
|
|||
for (i = 0, nn = colnames; *nn; i++, nn++)
|
||||
if (!strcmp(n, *nn))
|
||||
break;
|
||||
p = getcolval(s, 0);
|
||||
if (*nn) {
|
||||
Filecol fc, fo;
|
||||
/*
|
||||
* special case: highlighting link targets
|
||||
*/
|
||||
if (i == COL_LN && strpfx("target", s) &&
|
||||
(s[6] == ':' || !s[6])) {
|
||||
mcolors.flags |= LC_FOLLOW_SYMLINKS;
|
||||
p = s + 6;
|
||||
} else {
|
||||
p = getcolval(s, 0);
|
||||
if (*nn) {
|
||||
Filecol fc, fo;
|
||||
|
||||
fc = (Filecol) zhalloc(sizeof(*fc));
|
||||
fc->prog = (i == COL_EC || i == COL_LC || i == COL_RC ?
|
||||
NULL : gprog);
|
||||
fc->col = s;
|
||||
fc->next = NULL;
|
||||
if ((fo = mcolors.files[i])) {
|
||||
while (fo->next)
|
||||
fo = fo->next;
|
||||
fo->next = fc;
|
||||
} else
|
||||
mcolors.files[i] = fc;
|
||||
fc = (Filecol) zhalloc(sizeof(*fc));
|
||||
fc->prog = (i == COL_EC || i == COL_LC || i == COL_RC ?
|
||||
NULL : gprog);
|
||||
fc->col = s;
|
||||
fc->next = NULL;
|
||||
if ((fo = mcolors.files[i])) {
|
||||
while (fo->next)
|
||||
fo = fo->next;
|
||||
fo->next = fc;
|
||||
} else
|
||||
mcolors.files[i] = fc;
|
||||
}
|
||||
if (*p)
|
||||
*p++ = '\0';
|
||||
}
|
||||
if (*p)
|
||||
*p++ = '\0';
|
||||
return p;
|
||||
}
|
||||
}
|
||||
|
@ -474,6 +491,7 @@ getcols()
|
|||
int i, l;
|
||||
|
||||
max_caplen = lr_caplen = 0;
|
||||
mcolors.flags = 0;
|
||||
queue_signals();
|
||||
if (!(s = getsparam("ZLS_COLORS")) &&
|
||||
!(s = getsparam("ZLS_COLOURS"))) {
|
||||
|
@ -1685,7 +1703,7 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width)
|
|||
}
|
||||
zcoff();
|
||||
} else {
|
||||
int mx;
|
||||
int mx, modec;
|
||||
|
||||
if (g->widths) {
|
||||
int i;
|
||||
|
@ -1733,8 +1751,13 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width)
|
|||
zcputs(g->name, COL_HI);
|
||||
else if (mselect >= 0 && (m->flags & (CMF_MULT | CMF_FMULT)))
|
||||
zcputs(g->name, COL_DU);
|
||||
else if (m->mode)
|
||||
subcols = putfilecol(g->name, m->str, m->mode);
|
||||
else if (m->mode) {
|
||||
if (mcolors.flags & LC_FOLLOW_SYMLINKS) {
|
||||
subcols = putfilecol(g->name, m->str, m->fmode);
|
||||
} else {
|
||||
subcols = putfilecol(g->name, m->str, m->mode);
|
||||
}
|
||||
}
|
||||
else
|
||||
subcols = putmatchcol(g->name, (m->disp ? m->disp : m->str));
|
||||
|
||||
|
@ -1747,12 +1770,13 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width)
|
|||
len = ZMB_nicewidth(m->disp ? m->disp : m->str);
|
||||
mlprinted = len ? (len-1) / columns : 0;
|
||||
|
||||
if ((g->flags & CGF_FILES) && m->modec) {
|
||||
modec = (mcolors.flags & LC_FOLLOW_SYMLINKS) ? m->fmodec : m->modec;
|
||||
if ((g->flags & CGF_FILES) && modec) {
|
||||
if (m->gnum != mselect) {
|
||||
zcoff();
|
||||
zcputs(g->name, COL_TC);
|
||||
}
|
||||
putc(m->modec, shout);
|
||||
putc(modec, shout);
|
||||
len++;
|
||||
}
|
||||
if ((len = width - len - 2) > 0) {
|
||||
|
@ -2556,6 +2580,15 @@ domenuselect(Hookdef dummy, Chdata dat)
|
|||
s->origcs = origcs;
|
||||
s->origll = origll;
|
||||
s->status = dupstring(status);
|
||||
/*
|
||||
* with just the slightest hint of a note of infuriation:
|
||||
* mode here is the menu mode, not the file mode, despite
|
||||
* the fact we're in a file dealing with file highlighting;
|
||||
* but that's OK, because s is a menu stack entry, despite
|
||||
* the fact we're in a function declaring s as char *.
|
||||
* anyway, in functions we really mean *mode* it's
|
||||
* called m, to be clear.
|
||||
*/
|
||||
s->mode = mode;
|
||||
menucmp = menuacc = hasoldlist = 0;
|
||||
minfo.cur = NULL;
|
||||
|
@ -2674,6 +2707,7 @@ domenuselect(Hookdef dummy, Chdata dat)
|
|||
s->origcs = origcs;
|
||||
s->origll = origll;
|
||||
s->status = dupstring(status);
|
||||
/* see above */
|
||||
s->mode = mode;
|
||||
accept_last();
|
||||
handleundo();
|
||||
|
|
Loading…
Reference in a new issue