int describekeybriefly(UNUSED(char **args)) { char *seq, *str, *msg, *is; Thingy func; if (statusline) return 1; clearlist = 1; statusline = "Describe key briefly: _"; zrefresh(); seq = getkeymapcmd(curkeymap, &func, &str); statusline = NULL; if(!*seq) return 1; msg = bindztrdup(seq); msg = appstr(msg, " is "); if (!func) is = bindztrdup(str); else is = nicedup(func->nam, 0); msg = appstr(msg, is); zsfree(is); showmsg(msg); zsfree(msg); return 0; }
static void scanfindfunc(char *seq, Thingy func, UNUSED(char *str), void *magic) { struct findfunc *ff = magic; if(func != ff->func) return; if (!ff->found++) ff->msg = appstr(ff->msg, " is on"); if(ff->found <= MAXFOUND) { char *b = bindztrdup(seq); ff->msg = appstr(ff->msg, " "); ff->msg = appstr(ff->msg, b); zsfree(b); } }
int whereis(UNUSED(char **args)) { struct findfunc ff; if (!(ff.func = executenamedcommand("Where is: "))) return 1; ff.found = 0; ff.msg = nicedup(ff.func->nam, 0); scankeymap(curkeymap, 1, scanfindfunc, &ff); if (!ff.found) ff.msg = appstr(ff.msg, " is not bound to any key"); else if(ff.found > MAXFOUND) ff.msg = appstr(ff.msg, " et al"); showmsg(ff.msg); zsfree(ff.msg); return 0; }
static int bin_ln(char *nam, char **args, Options ops, int func) { MoveFunc movefn; int flags, have_dir, err = 0; char **a, *ptr, *rp, *buf; struct stat st; size_t blen; if(func == BIN_MV) { movefn = (MoveFunc) rename; flags = OPT_ISSET(ops,'f') ? 0 : MV_ASKNW; flags |= MV_ATOMIC; } else { flags = OPT_ISSET(ops,'f') ? MV_FORCE : 0; #ifdef HAVE_LSTAT if(OPT_ISSET(ops,'h') || OPT_ISSET(ops,'n')) flags |= MV_NOCHASETARGET; if(OPT_ISSET(ops,'s')) movefn = (MoveFunc) symlink; else #endif { movefn = (MoveFunc) link; if(!OPT_ISSET(ops,'d')) flags |= MV_NODIRS; } } if(OPT_ISSET(ops,'i') && !OPT_ISSET(ops,'f')) flags |= MV_INTERACTIVE; for(a = args; a[1]; a++) ; if(a != args) { rp = unmeta(*a); if(rp && !stat(rp, &st) && S_ISDIR(st.st_mode)) { have_dir = 1; if((flags & MV_NOCHASETARGET) && !lstat(rp, &st) && S_ISLNK(st.st_mode)) { /* * So we have "ln -h" with the target being a symlink pointing * to a directory; if there are multiple sources but the target * is a symlink, then it's an error as we're not following * symlinks; if OTOH there's just one source, then we need to * either fail EEXIST or if "-f" given then remove the target. */ if(a > args+1) { errno = ENOTDIR; zwarnnam(nam, "%s: %e", *a, errno); return 1; } if(flags & MV_FORCE) { unlink(rp); have_dir = 0; } else { errno = EEXIST; zwarnnam(nam, "%s: %e", *a, errno); return 1; } } /* Normal case, target is a directory, chase into it */ if (have_dir) goto havedir; } } if(a > args+1) { zwarnnam(nam, "last of many arguments must be a directory"); return 1; } if(!args[1]) { ptr = strrchr(args[0], '/'); if(ptr) args[1] = ptr+1; else args[1] = args[0]; } return domove(nam, movefn, args[0], args[1], flags); havedir: buf = ztrdup(*a); *a = NULL; buf = appstr(buf, "/"); blen = strlen(buf); for(; *args; args++) { ptr = strrchr(*args, '/'); if(ptr) ptr++; else ptr = *args; buf[blen] = 0; buf = appstr(buf, ptr); err |= domove(nam, movefn, *args, buf, flags); } zsfree(buf); return err; }