📄 ng.c
字号:
#ifdef VERIFY printcmd();#endif putchar('\n') FLUSH; if (*buf == 'h') {#ifdef VERBOSE IF(verbose) { fputs("\Type + to enter select thread mode using all the unread articles.\n\(The selected threads will be marked as unread and displayed as usual.)\n\",stdout) FLUSH; fputs(u_help_thread,stdout); fputs("\Type a to mark all articles in this group as unread.\n\Type n to change nothing.\n\",stdout) FLUSH; } ELSE#endif#ifdef TERSE { fputs("\+ to select threads from the unread.\n\",stdout) FLUSH; fputs(u_help_thread,stdout); fputs("\a to mark all articles unread.\n\n to change nothing.\n\",stdout) FLUSH; }#endif goto reask_unread; } else if (*buf == 'n' || *buf == 'q') return AS_ASK; else if (*buf == 't' && u_help_thread != nullstr) { unkill_thread(artp->subj->thread); if ((artp = first_art(artp->subj)) != Nullart) art = article_num(artp); } else if (*buf == 's' && u_help_thread != nullstr) unkill_subthread(artp); else if (*buf == 'a') { register ARTICLE *ap; check_first(absfirst); ap = article_ptr(absfirst); for (i = absfirst; i <= lastart; i++, ap++) if ((ap->flags & (AF_READ|AF_MISSING)) == AF_READ) { ap->flags &= ~AF_READ; /* mark as unread */ toread[ng]++; } count_subjects(CS_NORM); } else if (*buf == '+') { *buf = 'U'; goto run_the_selector; } else { fputs(hforhelp,stdout) FLUSH; settle_down(); goto reask_unread; } return AS_NORM; } case '[': /* goto parent article */ case '{': /* goto thread's root article */ if (artp) { if (!find_parent(*buf == '{')) { register char *cp = (*buf=='['?"parent":"root");#ifdef VERBOSE IF(verbose) printf("\nThere is no %s article prior to this one.\n", cp) FLUSH; ELSE#endif#ifdef TERSE printf("\nNo prior %s.\n",cp) FLUSH;#endif return AS_ASK; } reread = TRUE; return AS_NORM; }not_threaded: if (ThreadedGroup) {#ifdef VERBOSE IF(verbose) fputs("\nThis article is not threaded.\n",stdout) FLUSH; ELSE#endif#ifdef TERSE fputs("\nUnthreaded article.\n",stdout) FLUSH;#endif return AS_ASK; }#ifdef VERBOSE IF(verbose) fputs("\nThis group is not threaded.\n",stdout) FLUSH; ELSE#endif#ifdef TERSE fputs("\nUnthreaded group.\n",stdout) FLUSH;#endif return AS_ASK; case ']': /* goto child article */ case '}': /* goto thread's leaf article */ if (artp) { if (!find_leaf(*buf == '}')) {#ifdef VERBOSE IF(verbose) fputs("\n\This is the last leaf in this tree.\n",stdout) FLUSH; ELSE#endif#ifdef TERSE fputs("\nLast leaf.\n",stdout) FLUSH;#endif return AS_ASK; } reread = TRUE; return AS_NORM; } goto not_threaded; case '(': /* goto previous sibling */ case ')': /* goto next sibling */ if (artp) { if (!(*buf == '(' ? find_prev_sib() : find_next_sib())) { register char *cp = (*buf == '(' ? "previous" : "next");#ifdef VERBOSE IF(verbose) printf("\nThis article has no %s sibling.\n",cp) FLUSH; ELSE#endif#ifdef TERSE printf("\nNo %s sibling.\n",cp) FLUSH;#endif return AS_ASK; } reread = TRUE; return AS_NORM; } goto not_threaded; case 'T': if (!ThreadedGroup) goto not_threaded; /* FALL THROUGH */ case 'A': if (!artp) { printf("You're not at an article.\n"); return AS_ASK; } switch (ask_memorize(*buf)) { case ',': case 'j': return AS_NORM; } return AS_ASK; case 'K': if (!artp) { printf("You're not at an article.\n"); return AS_ASK; } /* first, write kill-subject command */ (void)art_search(buf, (sizeof buf), TRUE); art = curr_art; artp = curr_artp; kill_subject(artp->subj,KF_ALL);/* take care of any prior subjects */ return AS_NORM; case ',': /* kill this node and all descendants */ if (ThreadedGroup) kill_subthread(artp,KF_ALL); else if (art >= absfirst && art <= lastart) mark_as_read(); return AS_NORM; case 'J': /* Junk all nodes in this thread */ if (ThreadedGroup) { kill_thread(artp->subj->thread,KF_ALL); return AS_NORM; } /* FALL THROUGH */ case 'k': /* kill current subject */ kill_subject(artp->subj,KF_ALL); if (last_cached < lastart) { *buf = 'k'; goto normal_search; } return AS_NORM; case 't': carriage_return();#ifndef CLEAREOL erase_eol(); /* erase the prompt */#else if (erase_screen && can_home_clear) clear_rest(); else erase_eol(); /* erase the prompt */#endif /* CLEAREOL */ fflush(stdout); page_line = 1; entire_tree(curr_artp); return AS_ASK; case ':': /* execute command on selected articles */ page_line = 1; if (!use_selected()) return AS_INP; putchar('\n'); art = curr_art; artp = curr_artp; return AS_ASK; case 'p': /* find previous unread article */ do { dec_art(selected_only,FALSE); } while (art >= firstart && (was_read(art) || !parseheader(art)));#ifdef ARTSEARCH srchahead = 0;#endif if (art >= firstart) return AS_NORM; art = absfirst; /* FALL THROUGH */ case 'P': /* goto previous article */ dec_art(FALSE,TRUE); check_dec_art: if (art < absfirst) {#ifdef VERBOSE IF(verbose) printf("\nThere are no%s%s articles prior to this one.\n", *buf=='P'?nullstr:" unread", selected_only?" selected":nullstr) FLUSH; ELSE#endif#ifdef TERSE printf("\nNo previous%s%s articles\n", *buf=='P'?nullstr:" unread", selected_only?" selected":nullstr) FLUSH;#endif art = curr_art; artp = curr_artp; return AS_ASK; } reread = TRUE;#ifdef ARTSEARCH srchahead = 0;#endif return AS_NORM; case '-': if (recent_art >= 0) { art = recent_art; artp = recent_artp; reread = TRUE; forcelast = TRUE;#ifdef ARTSEARCH srchahead = -(srchahead != 0);#endif return AS_NORM; } else { exit_code = NG_MINUS; return AS_CLEAN; } case 'n': /* find next unread article? */ if (art > lastart) { if (!toread[ng]) return AS_CLEAN; top_article(); }#ifdef ARTSEARCH else if (scanon && !ThreadedGroup && srchahead) { *buf = Ctl('n'); if (!next_art_with_subj()) goto normal_search; return AS_NORM; }#endif else inc_art(selected_only,FALSE);#ifdef ARTSEARCH srchahead = 0;#endif return AS_NORM; case 'N': /* goto next article */ if (art > lastart) if (!first_subject) { art = absfirst; artp = article_ptr(art); } else { artp = first_subject->articles; if (artp->flags & AF_MISSING) inc_art(FALSE,TRUE); else art = article_num(artp); } else inc_art(FALSE,TRUE); if (art <= lastart) reread = TRUE;#ifdef ARTSEARCH srchahead = 0;#endif return AS_NORM; case '$': art = lastart+1; artp = Nullart; forcelast = TRUE;#ifdef ARTSEARCH srchahead = 0;#endif return AS_NORM; case '1': case '2': case '3': /* goto specified article */ case '4': case '5': case '6': /* or do something with a range */ case '7': case '8': case '9': case '.': forcelast = TRUE; switch (numnum()) { case NN_INP: return AS_INP; case NN_ASK: return AS_ASK; case NN_REREAD: reread = TRUE;#ifdef ARTSEARCH if (srchahead) srchahead = -1;#endif break; case NN_NORM: if (was_read(art)) { top_article(); pad(just_a_sec/3); } else { putchar('\n'); return AS_ASK; } break; } return AS_NORM; case Ctl('k'): edit_kfile(); return AS_ASK; case Ctl('n'): /* search for next article with same subject */ case Ctl('p'): /* search for previous article with same subject */ if (*buf == Ctl('n')? next_art_with_subj() : prev_art_with_subj()) return AS_NORM; case '/': case '?':normal_search:#ifdef ARTSEARCH { /* search for article by pattern */ char cmd = *buf; reread = TRUE; /* assume this */ page_line = 1; switch (art_search(buf, (sizeof buf), TRUE)) { case SRCH_ERROR: art = curr_art; return AS_ASK; case SRCH_ABORT: art = curr_art; return AS_INP; case SRCH_INTR:#ifdef VERBOSE IF(verbose) printf("\n(Interrupted at article %ld)\n",(long)art) FLUSH; ELSE#endif#ifdef TERSE printf("\n(Intr at %ld)\n",(long)art) FLUSH;#endif art = curr_art; /* restore to current article */ return AS_ASK; case SRCH_DONE: fputs("done\n",stdout) FLUSH; pad(just_a_sec/3); /* 1/3 second */ if (!srchahead) { art = curr_art; return AS_ASK; } top_article(); reread = FALSE; return AS_NORM; case SRCH_SUBJDONE:#ifdef UNDEF fputs("\n\n\n\nSubject not found.\n",stdout) FLUSH; pad(just_a_sec/3); /* 1/3 second */#endif top_article(); reread = FALSE; return AS_NORM; case SRCH_NOTFOUND: fputs("\n\n\n\nNot found.\n",stdout) FLUSH; art = curr_art; /* restore to current article */ return AS_ASK; case SRCH_FOUND: if (cmd == Ctl('n') || cmd == Ctl('p')) { oldsubject = TRUE; reread = FALSE; } break; } return AS_NORM; }#else buf[1] = '\0'; notincl(buf); return AS_ASK;#endif case 'u': /* unsubscribe from this newsgroup? */ rcchar[ng] = NEGCHAR; return AS_CLEAN; case 'M': if (art <= lastart) { delay_unmark(artp); oneless(artp); printf("\nArticle %ld will return.\n",(long)art) FLUSH; } return AS_ASK; case 'm': if (art >= absfirst && art <= lastart) { unmark_as_read(); printf("\nArticle %ld marked as still unread.\n",(long)art) FLUSH; } return AS_ASK; case 'c': /* catch up */ switch (ask_catchup()) { case 'n': return AS_ASK; case 'u': return AS_CLEAN; } art = lastart+1; artp = Nullart; forcelast = FALSE; return AS_NORM; case 'Q': exit_code = NG_ASK; /* FALL THROUGH */ case 'q': /* go back up to newsgroup level? */ return AS_CLEAN; case 'j': putchar('\n') FLUSH; if (art >= absfirst && art <= lastart) mark_as_read(); return AS_ASK; case 'h': { /* help? */ int cmd; if ((cmd = help_art()) > 0) pushchar(cmd); return AS_ASK; } case '&': if (switcheroo()) /* get rest of command */ return AS_INP; /* if rubbed out, try something else */ return AS_ASK; case '#':#ifdef VERBOSE IF(verbose) printf("\nThe last article is %ld.\n",(long)lastart) FLUSH; ELSE#endif#ifdef TERSE printf("\n%ld\n",(long)lastart) FLUSH;#endif return AS_ASK; case '+': /* enter selection mode */run_the_selector: *buf = do_selector(*buf); switch (*buf) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -