📄 pg.c
字号:
} else { p = endline(ttycols, b); sz = p - b; makeprint(b, sz); canjump = 1; write(1, b, sz); canjump = 0; } } if (dline >= pagelen || eof) { /* * Time for prompting! */ if (eof && seekeof) { eof = seekeof = 0; if (line >= pagelen) line -= pagelen; else line = 0; dline = -1; continue; }newcmd: if (eof) { if (fline == 0 || eflag) break; mesg(_("(EOF)")); } prompt((line - 1) / pagelen + 1); switch (cmd.key) { case '/': /* * Search forward. */ search = FORWARD; oldline = line; searchcount = cmd.count; p = makepat(); if (p != NULL && *p) { if (remembered == 1) regfree(&re); rerror = regcomp(&re, p, REG_NOSUB | REG_NEWLINE); if (rerror != 0) { mesg(_("RE error: ")); sz = regerror(rerror, &re, b, READBUF); mesg(b); goto newcmd; } remembered = 1; } else if (remembered == 0) { mesg(_("No remembered search string")); goto newcmd; } continue; case '?': case '^': /* * Search backward. */ search = BACKWARD; oldline = line; searchcount = cmd.count; p = makepat(); if (p != NULL && *p) { if (remembered == 1) regfree(&re); rerror = regcomp(&re, p, REG_NOSUB | REG_NEWLINE); if (rerror != 0) { mesg("RE error: "); regerror(rerror, &re, b, READBUF); mesg(b); goto newcmd; } remembered = 1; } else if (remembered == 0) { mesg("No remembered search string"); goto newcmd; } line -= pagelen; if (line <= 0) goto notfound_bw; while (line) { my_fseeko(find, --line * sizeof pos, SEEK_SET); if(fread(&pos, sizeof pos, 1,find)==0) tmperr(find, "index"); my_fseeko(find, (off_t)0, SEEK_END); my_fseeko(fbuf, pos, SEEK_SET); if (fgets(b, READBUF, fbuf) == NULL) tmperr(fbuf, "buffer"); colb(b); if (regexec(&re, b, 0, NULL, 0) == 0) searchcount--; if (searchcount == 0) goto found_bw; }notfound_bw: line = oldline; search = searchcount = 0; mesg(_("Pattern not found")); goto newcmd;found_bw: eof = search = dline = 0; skip(-1); switch (searchdisplay) { case TOP: /* line -= 1; */ break; case MIDDLE: line -= pagelen / 2; break; case BOTTOM: if (line != 0) dline = -1; line -= pagelen; break; } if (line < 0) line = 0; continue; case 's': /* * Save to file. */ p = cmd.cmdline; while (*++p == ' '); if (*p == '\0') goto newcmd; save = fopen(p, "wb"); if (save == NULL) { cmd.count = errno; mesg(_("Cannot open ")); mesg(p); mesg(": "); mesg(strerror(cmd.count)); goto newcmd; } /* * Advance to EOF. */ my_fseeko(find, (off_t)0, SEEK_END); for (;;) { if (!nobuf) my_fseeko(fbuf,(off_t)0,SEEK_END); pos = my_ftello(fbuf); if (fgets(b, READBUF, f) == NULL) { eofline = fline; break; } if (!nobuf) fputs(b, fbuf); fwrite(&pos, sizeof pos, 1, find); if (!fflag) { oldpos = pos; p = b; while (*(p = endline(ttycols, p)) != '\0') { pos = oldpos + (p - b); fwrite(&pos, sizeof pos, 1, find); fline++; bline++; } } fline++; bline++; } my_fseeko(fbuf, (off_t)0, SEEK_SET); while ((sz = fread(b, sizeof *b, READBUF, fbuf)) != 0) { /* * No error check for compat. */ fwrite(b, sizeof *b, sz, save); } fclose(save); my_fseeko(fbuf, (off_t)0, SEEK_END); mesg(_("saved")); goto newcmd; case 'l': /* * Next line. */ if (*cmd.cmdline != 'l') eof = 0; if (cmd.count == 0) cmd.count = 1; /* compat */ if (isdigit(cuc(*cmd.cmdline))) { line = cmd.count - 2; dline = 0; } else { if (cmd.count != 1) { line += cmd.count - 1 - pagelen; dline = -1; skip(cmd.count); } /* * Nothing to do if count==1. */ } break; case 'd': /* * Half screen forward. */ case '\004': /* ^D */ if (*cmd.cmdline != cmd.key) eof = 0; if (cmd.count == 0) cmd.count = 1; /* compat */ line += (cmd.count * pagelen / 2) - pagelen - 1; dline = -1; skip(cmd.count); break; case 'f': /* * Skip forward. */ if (cmd.count <= 0) cmd.count = 1; /* compat */ line += cmd.count * pagelen - 2; if (eof) line += 2; if (*cmd.cmdline != 'f') eof = 0; else if (eof) break; if (eofline && line >= eofline) line -= pagelen; dline = -1; skip(cmd.count); break; case '\0': /* * Just a number, or '-', or <newline>. */ if (cmd.count == 0) cmd.count = 1; /* compat */ if (isdigit(cuc(*cmd.cmdline))) line = (cmd.count - 1) * pagelen - 2; else line += (cmd.count - 1) * (pagelen - 1) - 2; if (*cmd.cmdline != '\0') eof = 0; if (cmd.count != 1) { skip(cmd.count); dline = -1; } else { dline = 1; line += 2; } break; case '$': /* * Advance to EOF. */ if (!eof) skip(1); eof = 0; line = LONG_MAX; seekeof = 1; dline = -1; break; case '.': case '\014': /* ^L */ /* * Repaint screen. */ eof = 0; if (line >= pagelen) line -= pagelen; else line = 0; dline = 0; break; case '!': /* * Shell escape. */ if (rflag) { mesg(progname); mesg(_(": !command not allowed in " "rflag mode.\n")); } else { pid_t cpid; write(1, cmd.cmdline, strlen(cmd.cmdline)); write(1, "\n", 1); my_sigset(SIGINT, SIG_IGN); my_sigset(SIGQUIT, SIG_IGN); switch (cpid = fork()) { case 0: p = getenv("SHELL"); if (p == NULL) p = "/bin/sh"; if (!nobuf) fclose(fbuf); fclose(find); if (isatty(0) == 0) { close(0); open(tty, O_RDONLY); } else { fclose(f); } my_sigset(SIGINT, oldint); my_sigset(SIGQUIT, oldquit); my_sigset(SIGTERM, oldterm); execl(p, p, "-c", cmd.cmdline + 1, NULL); pgerror(errno, p); _exit(0177); /*NOTREACHED*/ case -1: mesg(_("fork() failed, " "try again later\n")); break; default: while (wait(NULL) != cpid); } my_sigset(SIGINT, sighandler); my_sigset(SIGQUIT, sighandler); mesg("!\n"); } goto newcmd; case 'h': /* * Help! */ write(1, copyright + 4, strlen(copyright + 4)); write(1, helpscreen, strlen(helpscreen)); goto newcmd; case 'n': /* * Next file. */ if (cmd.count == 0) cmd.count = 1; nextfile = cmd.count; if (checkf()) { nextfile = 1; goto newcmd; } eof = 1; break; case 'p': /* * Previous file. */ if (cmd.count == 0) cmd.count = 1; nextfile = 0 - cmd.count; if (checkf()) { nextfile = 1; goto newcmd; } eof = 1; break; case 'q': case 'Q': /* * Exit pg. */ quit(exitstatus); /*NOTREACHED*/ case 'w': case 'z': /* * Set window size. */ if (cmd.count < 0) cmd.count = 0; if (*cmd.cmdline != cmd.key) pagelen = ++cmd.count; dline = 1; break; } if (line <= 0) { line = 0; dline = 0; } if (cflag && dline == 1) { dline = 0; line--; } } if (eof) break; } fclose(find); if (!nobuf) fclose(fbuf);}intmain(int argc, char **argv){ int arg, i; char *p; FILE *input; progname = basename(argv[0]); setlocale(LC_MESSAGES, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); if (tcgetattr(1, &otio) == 0) { ontty = 1; oldint = my_sigset(SIGINT, sighandler); oldquit = my_sigset(SIGQUIT, sighandler); oldterm = my_sigset(SIGTERM, sighandler); setlocale(LC_CTYPE, ""); setlocale(LC_COLLATE, ""); tty = ttyname(1); setupterm(NULL, 1, &tinfostat); getwinsize(); helpscreen = _(helpscreen); } for (arg = 1; argv[arg]; arg++) { if (*argv[arg] == '+') continue; if (*argv[arg] != '-' || argv[arg][1] == '\0') break; argc--; for (i = 1; argv[arg][i]; i++) { switch (argv[arg][i]) { case '-': if (i != 1 || argv[arg][i + 1]) invopt(&argv[arg][i]); goto endargs; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': pagelen = atoi(argv[arg] + i); havepagelen = 1; goto nextarg; case 'c': cflag = 1; break; case 'e': eflag = 1; break; case 'f': fflag = 1; break; case 'n': nflag = 1; break; case 'p': if (argv[arg][i + 1]) { pstring = &argv[arg][i + 1]; } else if (argv[++arg]) { --argc; pstring = argv[arg]; } else needarg("-p"); goto nextarg; case 'r': rflag = 1; break; case 's': sflag = 1; break; default: invopt(&argv[arg][i]); } }nextarg: ; }endargs: for (arg = 1; argv[arg]; arg++) { if (*argv[arg] == '-') { if (argv[arg][1] == '-') { arg++; break; } if (argv[arg][1] == '\0') break; if (argv[arg][1] == 'p' && argv[arg][2] == '\0') arg++; continue; } if (*argv[arg] != '+') break; argc--; switch (*(argv[arg] + 1)) { case '\0': needarg("+"); /*NOTREACHED*/ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': startline = atoi(argv[arg] + 1); break; case '/': searchfor = argv[arg] + 2; if (*searchfor == '\0') needarg("+/"); p = searchfor + strlen(searchfor) - 1; if (*p == '/') *p = '\0'; if (*searchfor == '\0') needarg("+/"); break; default: invopt(argv[arg]); } } if (argc == 1) { pgfile(stdin, "stdin"); } else { files.first = arg; files.last = arg + argc - 1; for ( ; argv[arg]; arg += nextfile) { nextfile = 1; files.current = arg; if (argc > 2) { static int firsttime; firsttime++; if (firsttime > 1) { mesg(_("(Next file: ")); mesg(argv[arg]); mesg(")");newfile: if (ontty) { prompt(-1); switch(cmd.key) { case 'n': /* * Next file. */ if (cmd.count == 0) cmd.count = 1; nextfile = cmd.count; if (checkf()) { nextfile = 1; mesg(":"); goto newfile; } continue; case 'p': /* * Previous file. */ if (cmd.count == 0) cmd.count = 1; nextfile = 0 - cmd.count; if (checkf()) { nextfile = 1; mesg(":"); goto newfile; } continue; case 'q': case 'Q': quit(exitstatus); } } else mesg("\n"); } } if (strcmp(argv[arg], "-") == 0) input = stdin; else { input = fopen(argv[arg], "r"); if (input == NULL) { pgerror(errno, argv[arg]); exitstatus++; continue; } } if (ontty == 0 && argc > 2) { /* * Use the prefix as specified by SUSv2. */ write(1, "::::::::::::::\n", 15); write(1, argv[arg], strlen(argv[arg])); write(1, "\n::::::::::::::\n", 16); } pgfile(input, argv[arg]); if (input != stdin) fclose(input); } } quit(exitstatus); /*NOTREACHED*/ return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -