📄 opts.c
字号:
/* opts.c *//* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu *//* This file contains the code that manages the run-time options -- The * values that can be modified via the "set" command. */#include "config.h"#include "vi.h"#include "ctype.h"#ifndef NULL#define NULL (char *)0#endifextern char *getenv();/* maximum width to permit for strings, including ="" */#define MAXWIDTH 20/* These are the default values of all options */char o_autoindent[1] = {FALSE};char o_autoprint[1] = {TRUE};char o_autotab[1] = {TRUE};char o_autowrite[1] = {FALSE};char o_columns[3] = {80, 32, 255};char o_directory[30] = TMPDIR;char o_edcompatible[1] = {FALSE};char o_equalprg[80] = {"fmt"};char o_errorbells[1] = {TRUE};char o_exrefresh[1] = {TRUE};char o_ignorecase[1] = {FALSE};char o_keytime[3] = {1, 0, 50};char o_keywordprg[80] = {KEYWORDPRG};char o_lines[3] = {25, 2, 96};char o_list[1] = {FALSE};char o_number[1] = {FALSE};char o_readonly[1] = {FALSE};char o_remap[1] = {TRUE};char o_report[3] = {5, 1, 127};char o_scroll[3] = {12, 1, 127};char o_shell[60] = SHELL;char o_shiftwidth[3] = {8, 1, 255};char o_sidescroll[3] = {8, 1, 40};char o_sync[1] = {NEEDSYNC};char o_tabstop[3] = {8, 1, 40};char o_term[30] = "?";char o_flash[1] = {TRUE};char o_warn[1] = {TRUE};char o_wrapscan[1] = {TRUE};#ifndef CRUNCHchar o_beautify[1] = {FALSE};char o_exrc[1] = {FALSE};char o_mesg[1] = {TRUE};char o_more[1] = {TRUE};char o_novice[1] = {FALSE};char o_prompt[1] = {TRUE};char o_taglength[3] = {0, 0, 30};char o_terse[1] = {FALSE};char o_window[3] = {0, 1, 24};char o_wrapmargin[3] = {0, 0, 255};char o_writeany[1] = {FALSE};#endif#ifndef NO_ERRLISTchar o_cc[30] = {CC_COMMAND};char o_make[30] = {MAKE_COMMAND};#endif#ifndef NO_CHARATTRchar o_charattr[1] = {FALSE};#endif#ifndef NO_DIGRAPHchar o_digraph[1] = {FALSE};char o_flipcase[80]# ifdef CS_IBMPC = {"\207\200\201\232\202\220\204\216\206\217\221\222\224\231\244\245"}# endif# ifdef CS_LATIN1 /* initialized by initopts() */# endif ;#endif#ifndef NO_SENTENCEchar o_hideformat[1] = {FALSE};#endif#ifndef NO_EXTENSIONSchar o_inputmode[1] = {FALSE};char o_ruler[1] = {FALSE};#endif#ifndef NO_MAGICchar o_magic[1] = {TRUE};#endif#ifndef NO_MODELINESchar o_modelines[1] = {FALSE};#endif#ifndef NO_SENTENCEchar o_paragraphs[30] = "PPppIPLPQP";char o_sections[30] = "NHSHSSSEse";#endif#if MSDOSchar o_pcbios[1] = {TRUE};#endif#ifndef NO_SHOWMATCHchar o_showmatch[1] = {FALSE};#endif#ifndef NO_SHOWMODEchar o_smd[1] = {FALSE};#endif/* The following describes the names & types of all options */#define BOOL 0#define NUM 1#define STR 2#define SET 0x01 /* this option has had its value altered */#define CANSET 0x02 /* this option can be set at any time */#define RCSET 0x06 /* this option can be set in a .exrc file only */#define NOSAVE 0x0a /* this option should never be saved by mkexrc */#define WSET 0x20 /* is this the "window" size option? */#define MR 0x40 /* does this option affect the way text is displayed? */struct{ char *name; /* name of an option */ char *nm; /* short name of an option */ char type; /* type of an option */ char flags; /* boolean: has this option been set? */ char *value; /* value */} opts[] ={ /* name type flags value */ { "autoindent", "ai", BOOL, CANSET, o_autoindent }, { "autoprint", "ap", BOOL, CANSET, o_autoprint }, { "autotab", "at", BOOL, CANSET, o_autotab }, { "autowrite", "aw", BOOL, CANSET, o_autowrite },#ifndef CRUNCH { "beautify", "bf", BOOL, CANSET, o_beautify },#endif#ifndef NO_ERRLIST { "cc", "cc", STR, CANSET, o_cc },#endif#ifndef NO_CHARATTR { "charattr", "ca", BOOL, CANSET|MR, o_charattr },#endif { "columns", "co", NUM, SET|NOSAVE|MR, o_columns },#ifndef NO_DIGRAPH { "digraph", "dig", BOOL, CANSET, o_digraph },#endif { "directory", "dir", STR, RCSET, o_directory }, { "edcompatible","ed", BOOL, CANSET, o_edcompatible }, { "equalprg", "ep", STR, CANSET, o_equalprg }, { "errorbells", "eb", BOOL, CANSET, o_errorbells },#ifndef CRUNCH { "exrc", "exrc", BOOL, CANSET, o_exrc },#endif { "exrefresh", "er", BOOL, CANSET, o_exrefresh }, { "flash", "vbell",BOOL, CANSET, o_flash },#ifndef NO_DIGRAPH { "flipcase", "fc", STR, CANSET, o_flipcase },#endif#ifndef NO_SENTENCE { "hideformat", "hf", BOOL, CANSET|MR, o_hideformat },#endif { "ignorecase", "ic", BOOL, CANSET, o_ignorecase },#ifndef NO_EXTENSIONS { "inputmode", "im", BOOL, CANSET, o_inputmode },#endif { "keytime", "kt", NUM, CANSET, o_keytime }, { "keywordprg", "kp", STR, CANSET, o_keywordprg }, { "lines", "ls", NUM, SET|NOSAVE|MR, o_lines }, { "list", "li", BOOL, CANSET|MR, o_list },#ifndef NO_MAGIC { "magic", "ma", BOOL, CANSET, o_magic },#endif#ifndef NO_ERRLIST { "make", "mk", STR, CANSET, o_make },#endif#ifndef CRUNCH { "mesg", "me", BOOL, CANSET, o_mesg },#endif#ifndef NO_MODELINES { "modelines", "ml", BOOL, CANSET, o_modelines },#endif#ifndef CRUNCH { "more", "mo", BOOL, CANSET, o_more }, { "novice", "nov", BOOL, CANSET, o_novice },#endif { "number", "nu", BOOL, CANSET|MR, o_number },#ifndef NO_SENTENCE { "paragraphs", "para", STR, CANSET, o_paragraphs },#endif#if MSDOS { "pcbios", "pc", BOOL, SET|NOSAVE, o_pcbios },#endif#ifndef CRUNCH { "prompt", "pr", BOOL, CANSET, o_prompt },#endif { "readonly", "ro", BOOL, CANSET, o_readonly }, { "remap", "remap",BOOL, CANSET, o_remap }, { "report", "re", NUM, CANSET, o_report },#ifndef NO_EXTENSIONS { "ruler", "ru", BOOL, CANSET, o_ruler },#endif { "scroll", "sc", NUM, CANSET, o_scroll },#ifndef NO_SENTENCE { "sections", "sect", STR, CANSET, o_sections },#endif { "shell", "sh", STR, CANSET, o_shell },#ifndef NO_SHOWMATCH { "showmatch", "sm", BOOL, CANSET, o_showmatch },#endif#ifndef NO_SHOWMODE { "showmode", "smd", BOOL, CANSET, o_smd },#endif { "shiftwidth", "sw", NUM, CANSET, o_shiftwidth }, { "sidescroll", "ss", NUM, CANSET, o_sidescroll }, { "sync", "sy", BOOL, CANSET, o_sync }, { "tabstop", "ts", NUM, CANSET|MR, o_tabstop },#ifndef CRUNCH { "taglength", "tl", NUM, CANSET, o_taglength },#endif { "term", "te", STR, SET, o_term },#ifndef CRUNCH { "terse", "tr", BOOL, CANSET, o_terse }, { "timeout", "to", BOOL, CANSET, o_keytime },#endif#ifndef CRUNCH { "window", "wi", NUM, CANSET|MR|WSET, o_window }, { "wrapmargin", "wm", NUM, CANSET, o_wrapmargin },#endif { "wrapscan", "ws", BOOL, CANSET, o_wrapscan },#ifndef CRUNCH { "writeany", "wr", BOOL, CANSET, o_writeany },#endif { NULL, NULL, 0, CANSET, NULL }};/* This function initializes certain options from environment variables, etc. */void initopts(){ char *val; int i; /* set some stuff from environment variables */#if MSDOS if (val = getenv("COMSPEC")) /* yes, ASSIGNMENT! */#else if (val = getenv("SHELL")) /* yes, ASSIGNMENT! */#endif { strcpy(o_shell, val); } strcpy(o_term, termtype);#if MSDOS if (strcmp(termtype, "pcbios")) { o_pcbios[0] = FALSE; } else { o_pcbios[0] = TRUE; }#endif#if AMIGA || MSDOS || TOS if ((val = getenv("TMP")) /* yes, ASSIGNMENT! */ || (val = getenv("TEMP"))) strcpy(o_directory, val);#endif#ifndef CRUNCH if ((val = getenv("LINES")) && atoi(val) > 4) /* yes, ASSIGNMENT! */ { LINES = atoi(val); } if ((val = getenv("COLUMNS")) && atoi(val) > 30) /* yes, ASSIGNMENT! */ { COLS = atoi(val); }#endif *o_lines = LINES; *o_columns = COLS; *o_scroll = LINES / 2 - 1;#ifndef CRUNCH if (o_window[0] == 0) { o_window[0] = o_window[2] = *o_lines; }#endif /* disable the flash option if we don't know how to do a flash */ if (!has_VB) { for (i = 0; opts[i].value != o_flash; i++) { } opts[i].flags &= ~CANSET; *o_flash = FALSE; }#ifndef NO_DIGRAPH# ifdef CS_LATIN1 for (i = 0, val = o_flipcase; i < 32; i++) { /* leave out the multiply/divide symbols */ if (i == 23) continue; /* add lower/uppercase pair */ *val++ = i + 0xe0; *val++ = i + 0xc0; } *val = '\0';# endif /* CS_LATIN1 */ /* initialize the ctype package */ _ct_init(o_flipcase);#else _ct_init("");#endif /* not NO_DIGRAPH */}/* This function lists the current values of all options */void dumpopts(all) int all; /* boolean: dump all options, or just set ones? */{#ifndef NO_OPTCOLS int i, j, k; char nbuf[4]; /* used for converting numbers to ASCII */ int widths[5]; /* width of each column, including gap */ int ncols; /* number of columns */ int nrows; /* number of options per column */ int nset; /* number of options to be output */ int width; /* width of a particular option */ int todump[60]; /* indicies of options to be dumped */ /* step 1: count the number of set options */ for (nset = i = 0; opts[i].name; i++) { if (all || (opts[i].flags & SET)) { todump[nset++] = i; } } /* step two: try to use as many columns as possible */ for (ncols = (nset > 5 ? 5 : nset); ncols > 1; ncols--) { /* how many would go in this column? */ nrows = (nset + ncols - 1) / ncols; /* figure out the width of each column */ for (i = 0; i < ncols; i++) { widths[i] = 0; for (j = 0, k = nrows * i; j < nrows && k < nset; j++, k++) { /* figure out the width of a particular option */ switch (opts[todump[k]].type) { case BOOL: if (!*opts[todump[k]].value) width = 2; else width = 0; break; case STR: width = 3 + strlen(opts[todump[k]].value); if (width > MAXWIDTH) width = MAXWIDTH; break; case NUM: width = 4; break; } width += strlen(opts[todump[k]].name); /* if this is the widest so far, widen col */ if (width > widths[i])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -