about summary refs log tree commit diff stats
path: root/src/LYrcFile.c
diff options
context:
space:
mode:
authorThomas E. Dickey <dickey@invisible-island.net>1999-04-23 15:06:34 -0400
committerThomas E. Dickey <dickey@invisible-island.net>1999-04-23 15:06:34 -0400
commita735f5ad5123baaa15a0057515f3b242c5d3f372 (patch)
tree58936995ce9e2afd4ba65a735fd44c15509db19a /src/LYrcFile.c
parentb223937ff728f8242329bedb9c660e81da253e9a (diff)
downloadlynx-snapshots-a735f5ad5123baaa15a0057515f3b242c5d3f372.tar.gz
snapshot of project "lynx", label v2-8-2dev_23
Diffstat (limited to 'src/LYrcFile.c')
-rw-r--r--src/LYrcFile.c552
1 files changed, 302 insertions, 250 deletions
diff --git a/src/LYrcFile.c b/src/LYrcFile.c
index aea6fa9c..531a03c2 100644
--- a/src/LYrcFile.c
+++ b/src/LYrcFile.c
@@ -31,7 +31,7 @@ PRIVATE char *SkipEquals ARGS1(char *, src)
 
 PUBLIC void read_rc NOPARAMS
 {
-    char line_buffer[LINESIZE];
+    char *line_buffer = NULL;
     char rcfile[LY_MAXPATH];
     FILE *fp;
     char *cp;
@@ -56,13 +56,7 @@ PUBLIC void read_rc NOPARAMS
     /*
      *  Process the entries.
      */
-    while (fgets(line_buffer, sizeof(line_buffer)-1, fp) != NULL) {
-	/*
-	 *  Remove the /n from the end of the line.
-	 */
-	if (line_buffer[0] && line_buffer[strlen(line_buffer)-1] == '\n')
-	    line_buffer[strlen(line_buffer)-1] = '\0';
-
+    while ((line_buffer = LYSafeGets(line_buffer, fp)) != NULL) {
 	/*
 	 *  Remove any trailing white space.
 	 */
@@ -473,6 +467,17 @@ PUBLIC void read_rc NOPARAMS
 		user_mode = NOVICE_MODE;
 	    }
 
+#ifdef DISP_PARTIAL
+	/*
+	 *  Partial display logic--set the threshold # of lines before
+	 *  Lynx redraws the screen
+	 */
+	} else if (FIND_KEYWORD(cp, "partial_thres")) {
+	    cp = SkipEquals(cp);
+	    if (atoi(cp) != 0)
+		partial_threshold = atoi(cp);
+#endif /* DISP_PARTIAL */
+
 #ifdef ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS
 	/*
 	 *  Local execution mode - all links.
@@ -485,17 +490,6 @@ PUBLIC void read_rc NOPARAMS
 	     else
 		local_exec = FALSE;
 
-#ifdef DISP_PARTIAL
-	/*
-	 *  Partial display logic--set the threshold # of lines before
-	 *  Lynx redraws the screen
-	 */
-	} else if (FIND_KEYWORD(cp, "partial_thres")) {
-	    cp = SkipEquals(cp);
-	    if (atoi(cp) != 0)
-		partial_threshold = atoi(cp);
-#endif /* DISP_PARTIAL */
-
 	/*
 	 *  Local execution mode - only links in local files.
 	 */
@@ -521,6 +515,29 @@ PUBLIC void read_rc NOPARAMS
     fclose(fp);
 } /* big end */
 
+/*
+ * Write a set of comments.  Doing it this way avoids preprocessor problems
+ * with the leading '#', makes it simpler to use gettext.
+ */
+PRIVATE void write_list ARGS2(
+    	FILE *,		fp,
+	char *,		list)
+{
+    int first = TRUE;
+    while (*list != 0) {
+	int ch = *list++;
+	if (ch == '\n') {
+	    first = TRUE;
+	} else {
+	    if (first) {
+		fputs("# ", fp);
+		first = FALSE;
+	    }
+	}
+	fputc(ch, fp);
+    }
+}
+
 PUBLIC int save_rc NOPARAMS
 {
     char rcfile[LY_MAXPATH];
@@ -543,48 +560,55 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Header.
      */
-    fprintf(fp, gettext("# Lynx User Defaults File\n#\n\
-# This file contains options saved from the Lynx Options Screen (normally\n\
-# with the '>' key).  There is normally no need to edit this file manually,\n\
-# since the defaults here can be controlled from the Options Screen, and the\n\
-# next time options are saved from the Options Screen this file will be\n\
-# completely rewritten.  You have been warned...\n\
-# If you are looking for the general configuration file - it is normally\n\
-# called lynx.cfg, and it has different content and a different format.\n\
-# It is not this file.\n\n"));
+    write_list(fp, gettext("\
+Lynx User Defaults File\n\
+\n\
+This file contains options saved from the Lynx Options Screen (normally\n\
+with the '>' key).  There is normally no need to edit this file manually,\n\
+since the defaults here can be controlled from the Options Screen, and the\n\
+next time options are saved from the Options Screen this file will be\n\
+completely rewritten.  You have been warned...\n\
+If you are looking for the general configuration file - it is normally\n\
+called lynx.cfg, and it has different content and a different format.\n\
+It is not this file.\n\
+"));
+    fprintf(fp, "\n");
 
     /*
      *  File editor
      */
-    fprintf(fp, gettext("\
-# file_editor specifies the editor to be invoked when editing local files\n\
-# or sending mail.  If no editor is specified, then file editing is disabled\n\
-# unless it is activated from the command line, and the built-in line editor\n\
-# will be used for sending mail.\n"));
+    write_list(fp, gettext("\
+file_editor specifies the editor to be invoked when editing local files\n\
+or sending mail.  If no editor is specified, then file editing is disabled\n\
+unless it is activated from the command line, and the built-in line editor\n\
+will be used for sending mail.\n\
+"));
     fprintf(fp, "file_editor=%s\n\n", (editor ? editor : ""));
 
     /*
      *  Default bookmark file.
      */
-    fprintf(fp, gettext("\
-# bookmark_file specifies the name and location of the default bookmark\n\
-# file into which the user can paste links for easy access at a later\n\
-# date.\n"));
+    write_list(fp, gettext("\
+bookmark_file specifies the name and location of the default bookmark\n\
+file into which the user can paste links for easy access at a later\n\
+date.\n\
+"));
     fprintf(fp, "bookmark_file=%s\n\n", (bookmark_page ? bookmark_page : ""));
 
     /*
      *  Multiple (sub)bookmark support settings.
      */
-    fprintf(fp, gettext("\
-# If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n\
-# been defined (see below), then all bookmark operations will first\n\
-# prompt the user to select an active sub-bookmark file.  If the default\n\
-# Lynx bookmark_file is defined (see above), it will be used as the\n\
-# default selection.  When this option is set to \"advanced\", and the\n\
-# user mode is advanced, the 'v'iew bookmark command will invoke a\n\
-# statusline prompt instead of the menu seen in novice and intermediate\n\
-# user modes.  When this option is set to \"standard\", the menu will be\n\
-# presented regardless of user mode.\n"));
+    write_list(fp, gettext("\
+If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n\
+been defined (see below), then all bookmark operations will first\n\
+prompt the user to select an active sub-bookmark file.  If the default\n\
+Lynx bookmark_file is defined (see above), it will be used as the\n\
+default selection.  When this option is set to \"advanced\", and the\n\
+user mode is advanced, the 'v'iew bookmark command will invoke a\n\
+statusline prompt instead of the menu seen in novice and intermediate\n\
+user modes.  When this option is set to \"standard\", the menu will be\n\
+presented regardless of user mode.\n\
+"));
     fprintf(fp, "sub_bookmarks=%s\n\n", (LYMultiBookmarks ?
 					   (LYMBMAdvanced ?
 					       "advanced" : "standard")
@@ -593,11 +617,12 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Multiple (sub)bookmark definitions and descriptions.
      */
-    fprintf(fp, gettext("\
-# The following allow you to define sub-bookmark files and descriptions.\n\
-# The format is multi_bookmark<capital_letter>=<filename>,<description>\n\
-# Up to 26 bookmark files (for the English capital letters) are allowed.\n\
-# We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"));
+    write_list(fp, gettext("\
+The following allow you to define sub-bookmark files and descriptions.\n\
+The format is multi_bookmark<capital_letter>=<filename>,<description>\n\
+Up to 26 bookmark files (for the English capital letters) are allowed.\n\
+We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n\
+"));
     for (MBM_c = 1; MBM_c <= MBM_V_MAXFILES; MBM_c++)
        fprintf(fp, "multi_bookmark%c=%s%s%s\n",
 		   (MBM_c + 'A'),
@@ -612,13 +637,14 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  FTP/file sorting method.
      */
-    fprintf(fp, gettext("\
-# The file_sorting_method specifies which value to sort on when viewing\n\
-# file lists such as FTP directories.  The options are:\n\
-#    BY_FILENAME -- sorts on the name of the file\n\
-#    BY_TYPE     -- sorts on the type of the file\n\
-#    BY_SIZE     -- sorts on the size of the file\n\
-#    BY_DATE     -- sorts on the date of the file\n"));
+    write_list(fp, gettext("\
+The file_sorting_method specifies which value to sort on when viewing\n\
+file lists such as FTP directories.  The options are:\n\
+   BY_FILENAME -- sorts on the name of the file\n\
+   BY_TYPE     -- sorts on the type of the file\n\
+   BY_SIZE     -- sorts on the size of the file\n\
+   BY_DATE     -- sorts on the date of the file\n\
+"));
     fprintf(fp, "file_sorting_method=%s\n\n",
 		(HTfileSortMethod == FILE_BY_NAME ? "BY_FILENAME"
 						  :
@@ -630,36 +656,39 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Personal mail address.
      */
-    fprintf(fp, gettext("\
-# personal_mail_address specifies your personal mail address.  The\n\
-# address will be sent during HTTP file transfers for authorization and\n\
-# logging purposes, and for mailed comments.\n\
-# If you do not want this information given out, set the NO_FROM_HEADER\n\
-# to TRUE in lynx.cfg, or use the -nofrom command line switch.  You also\n\
-# could leave this field blank, but then you won't have it included in\n\
-# your mailed comments.\n"));
+    write_list(fp, gettext("\
+personal_mail_address specifies your personal mail address.  The\n\
+address will be sent during HTTP file transfers for authorization and\n\
+logging purposes, and for mailed comments.\n\
+If you do not want this information given out, set the NO_FROM_HEADER\n\
+to TRUE in lynx.cfg, or use the -nofrom command line switch.  You also\n\
+could leave this field blank, but then you won't have it included in\n\
+your mailed comments.\n\
+"));
     fprintf(fp, "personal_mail_address=%s\n\n",
 		(personal_mail_address ? personal_mail_address : ""));
 
     /*
      *  Searching type.
      */
-    fprintf(fp, gettext("\
-# If case_sensitive_searching is \"on\" then when the user invokes a search\n\
-# using the 's' or '/' keys, the search performed will be case sensitive\n\
-# instead of case INsensitive.  The default is usually \"off\".\n"));
+    write_list(fp, gettext("\
+If case_sensitive_searching is \"on\" then when the user invokes a search\n\
+using the 's' or '/' keys, the search performed will be case sensitive\n\
+instead of case INsensitive.  The default is usually \"off\".\n\
+"));
     fprintf(fp, "case_sensitive_searching=%s\n\n",
 		(case_sensitive ? "on" : "off"));
 
     /*
      *  Character set.
      */
-    fprintf(fp, gettext("\
-# The character_set definition controls the representation of 8 bit\n\
-# characters for your terminal.  If 8 bit characters do not show up\n\
-# correctly on your screen you may try changing to a different 8 bit\n\
-# set or using the 7 bit character approximations.\n\
-# Current valid characters sets are:\n"));
+    write_list(fp, gettext("\
+The character_set definition controls the representation of 8 bit\n\
+characters for your terminal.  If 8 bit characters do not show up\n\
+correctly on your screen you may try changing to a different 8 bit\n\
+set or using the 7 bit character approximations.\n\
+Current valid characters sets are:\n\
+"));
     for (i = 0; LYchar_set_names[i]; i++)
 	fprintf(fp, "#    %s\n", LYchar_set_names[i]);
     fprintf(fp, "character_set=%s\n\n", LYchar_set_names[current_char_set]);
@@ -668,30 +697,32 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Preferred language.
      */
-    fprintf(fp, gettext("\
-# preferred_language specifies the language in MIME notation (e.g., en,\n\
-# fr, may be a comma-separated list in decreasing preference)\n\
-# which Lynx will indicate you prefer in requests to http servers.\n\
-# If a file in that language is available, the server will send it.\n\
-# Otherwise, the server will send the file in it's default language.\n"));
+    write_list(fp, gettext("\
+preferred_language specifies the language in MIME notation (e.g., en,\n\
+fr, may be a comma-separated list in decreasing preference)\n\
+which Lynx will indicate you prefer in requests to http servers.\n\
+If a file in that language is available, the server will send it.\n\
+Otherwise, the server will send the file in it's default language.\n\
+"));
     fprintf(fp, "preferred_language=%s\n\n", (language ? language : ""));
 
     /*
      *  Preferred charset.
      */
-    fprintf(fp, gettext("\
-# preferred_charset specifies the character set in MIME notation (e.g.,\n\
-# ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n\
-# to http servers using an Accept-Charset header.  The value should NOT\n\
-# include ISO-8859-1 or US-ASCII, since those values are always assumed\n\
-# by default.  May be a comma-separated list.\n\
-# If a file in that character set is available, the server will send it.\n\
-# If no Accept-Charset header is present, the default is that any\n\
-# character set is acceptable.  If an Accept-Charset header is present,\n\
-# and if the server cannot send a response which is acceptable\n\
-# according to the Accept-Charset header, then the server SHOULD send\n\
-# an error response, though the sending of an unacceptable response\n\
-# is also allowed.\n"));
+    write_list(fp, gettext("\
+preferred_charset specifies the character set in MIME notation (e.g.,\n\
+ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n\
+to http servers using an Accept-Charset header.  The value should NOT\n\
+include ISO-8859-1 or US-ASCII, since those values are always assumed\n\
+by default.  May be a comma-separated list.\n\
+If a file in that character set is available, the server will send it.\n\
+If no Accept-Charset header is present, the default is that any\n\
+character set is acceptable.  If an Accept-Charset header is present,\n\
+and if the server cannot send a response which is acceptable\n\
+according to the Accept-Charset header, then the server SHOULD send\n\
+an error response, though the sending of an unacceptable response\n\
+is also allowed.\n\
+"));
     fprintf(fp, "preferred_charset=%s\n\n",
 		(pref_charset ? pref_charset : ""));
 
@@ -699,22 +730,23 @@ PUBLIC int save_rc NOPARAMS
      *  Show color.
      */
     if (LYChosenShowColor != SHOW_COLOR_UNKNOWN) {
-	fprintf(fp, gettext("\
-# show_color specifies how to set the color mode at startup.  A value of\n\
-# \"never\" will force color mode off (treat the terminal as monochrome)\n\
-# at startup even if the terminal appears to be color capable.  A value of\n\
-# \"always\" will force color mode on even if the terminal appears to be\n\
-# monochrome, if this is supported by the library used to build lynx.\n\
-# A value of \"default\" will yield the behavior of assuming\n\
-# a monochrome terminal unless color capability is inferred at startup\n\
-# based on the terminal type, or the -color command line switch is used, or\n\
-# the COLORTERM environment variable is set.  The default behavior always is\n\
-# used in anonymous accounts or if the \"option_save\" restriction is set.\n\
-# The effect of the saved value can be overridden via\n\
-# the -color and -nocolor command line switches.\n\
-# The mode set at startup can be changed via the \"show color\" option in\n\
-# the 'o'ptions menu.  If the option settings are saved, the \"on\" and\n\
-# \"off\" \"show color\" settings will be treated as \"default\".\n"));
+	write_list(fp, gettext("\
+show_color specifies how to set the color mode at startup.  A value of\n\
+\"never\" will force color mode off (treat the terminal as monochrome)\n\
+at startup even if the terminal appears to be color capable.  A value of\n\
+\"always\" will force color mode on even if the terminal appears to be\n\
+monochrome, if this is supported by the library used to build lynx.\n\
+A value of \"default\" will yield the behavior of assuming\n\
+a monochrome terminal unless color capability is inferred at startup\n\
+based on the terminal type, or the -color command line switch is used, or\n\
+the COLORTERM environment variable is set.  The default behavior always is\n\
+used in anonymous accounts or if the \"option_save\" restriction is set.\n\
+The effect of the saved value can be overridden via\n\
+the -color and -nocolor command line switches.\n\
+The mode set at startup can be changed via the \"show color\" option in\n\
+the 'o'ptions menu.  If the option settings are saved, the \"on\" and\n\
+\"off\" \"show color\" settings will be treated as \"default\".\n\
+"));
      fprintf(fp, "show_color=%s\n\n",
 	     ((LYChosenShowColor == SHOW_COLOR_NEVER  ? "never"  :
 	       (LYChosenShowColor == SHOW_COLOR_ALWAYS ? "always" :
@@ -724,90 +756,99 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  VI keys.
      */
-    fprintf(fp, gettext("\
-# If vi_keys is set to \"on\", then the normal VI movement keys:\n\
-#   j = down    k = up\n\
-#   h = left    l = right\n\
-# will be enabled.  These keys are only lower case.\n\
-# Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n\
-# and the keymap display, respectively.\n"));
+    write_list(fp, gettext("\
+If vi_keys is set to \"on\", then the normal VI movement keys:\n\
+  j = down    k = up\n\
+  h = left    l = right\n\
+will be enabled.  These keys are only lower case.\n\
+Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n\
+and the keymap display, respectively.\n\
+"));
      fprintf(fp, "vi_keys=%s\n\n", (vi_keys ? "on" : "off"));
 
     /*
      *  EMACS keys.
      */
-    fprintf(fp, gettext("\
-# If emacs_keys is to \"on\" then the normal EMACS movement keys:\n\
-#   ^N = down    ^P = up\n\
-#   ^B = left    ^F = right\n\
-# will be enabled.\n"));
+    write_list(fp, gettext("\
+If emacs_keys is to \"on\" then the normal EMACS movement keys:\n\
+  ^N = down    ^P = up\n\
+  ^B = left    ^F = right\n\
+will be enabled.\n\
+"));
     fprintf(fp, "emacs_keys=%s\n\n", (emacs_keys ? "on" : "off"));
 
     /*
      *  Show dot files.
      */
-    fprintf(fp, gettext("\
-# show_dotfiles specifies that the directory listing should include\n\
-# \"hidden\" (dot) files/directories.  If set \"on\", this will be\n\
-# honored only if enabled via userdefs.h and/or lynx.cfg, and not\n\
-# restricted via a command line switch.  If display of hidden files\n\
-# is disabled, creation of such files via Lynx also is disabled.\n"));
+    write_list(fp, gettext("\
+show_dotfiles specifies that the directory listing should include\n\
+\"hidden\" (dot) files/directories.  If set \"on\", this will be\n\
+honored only if enabled via userdefs.h and/or lynx.cfg, and not\n\
+restricted via a command line switch.  If display of hidden files\n\
+is disabled, creation of such files via Lynx also is disabled.\n\
+"));
     fprintf(fp, "show_dotfiles=%s\n\n", (show_dotfiles ? "on" : "off"));
 
     /*
      *  Select popups.
      */
-    fprintf(fp, gettext("\
-# select_popups specifies whether the OPTIONs in a SELECT block which\n\
-# lacks a MULTIPLE attribute are presented as a vertical list of radio\n\
-# buttons or via a popup menu.  Note that if the MULTIPLE attribute is\n\
-# present in the SELECT start tag, Lynx always will create a vertical list\n\
-# of checkboxes for the OPTIONs.  A value of \"on\" will set popup menus\n\
-# as the default while a value of \"off\" will set use of radio boxes.\n\
-# The default can be overridden via the -popup command line toggle.\n"));
+    write_list(fp, gettext("\
+select_popups specifies whether the OPTIONs in a SELECT block which\n\
+lacks a MULTIPLE attribute are presented as a vertical list of radio\n\
+buttons or via a popup menu.  Note that if the MULTIPLE attribute is\n\
+present in the SELECT start tag, Lynx always will create a vertical list\n\
+of checkboxes for the OPTIONs.  A value of \"on\" will set popup menus\n\
+as the default while a value of \"off\" will set use of radio boxes.\n\
+The default can be overridden via the -popup command line toggle.\n\
+"));
     fprintf(fp, "select_popups=%s\n\n", (LYSelectPopups ? "on" : "off"));
 
     /*
      *  Show cursor.
      */
-    fprintf(fp, gettext("\
-# show_cursor specifies whether to 'hide' the cursor to the right (and\n\
-# bottom, if possible) of the screen, or to place it to the left of the\n\
-# current link in documents, or current option in select popup windows.\n\
-# Positioning the cursor to the left of the current link or option is\n\
-# helpful for speech or braille interfaces, and when the terminal is\n\
-# one which does not distinguish the current link based on highlighting\n\
-# or color.  A value of \"on\" will set positioning to the left as the\n\
-# default while a value of \"off\" will set 'hiding' of the cursor.\n\
-# The default can be overridden via the -show_cursor command line toggle.\n"));
+    write_list(fp, gettext("\
+show_cursor specifies whether to 'hide' the cursor to the right (and\n\
+bottom, if possible) of the screen, or to place it to the left of the\n\
+current link in documents, or current option in select popup windows.\n\
+Positioning the cursor to the left of the current link or option is\n\
+helpful for speech or braille interfaces, and when the terminal is\n\
+one which does not distinguish the current link based on highlighting\n\
+or color.  A value of \"on\" will set positioning to the left as the\n\
+default while a value of \"off\" will set 'hiding' of the cursor.\n\
+The default can be overridden via the -show_cursor command line toggle.\n\
+"));
     fprintf(fp, "show_cursor=%s\n\n", (LYShowCursor ? "on" : "off"));
 
     /*
      *  Keypad mode.
      */
-    fprintf(fp, gettext("\
-# If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n\
-# your keypad when the numlock is on will act as arrow keys:\n\
-#             8 = Up Arrow\n\
-#   4 = Left Arrow    6 = Right Arrow\n\
-#             2 = Down Arrow\n\
-# and the corresponding keyboard numbers will act as arrow keys,\n\
-# regardless of whether numlock is on.\n"));
-    fprintf(fp, gettext("\
-# If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n\
-# appear next to each link and numbers are used to select links.\n"));
-    fprintf(fp, gettext("\
-# If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n\
-# numbers will appear next to each link and visible form input field.\n\
-# Numbers are used to select links, or to move the \"current link\" to a\n\
-# form input field or button.  In addition, options in popup menus are\n\
-# indexed so that the user may type an option number to select an option in\n\
-# a popup menu, even if the option isn't visible on the screen.  Reference\n\
-# lists and output from the list command also enumerate form inputs.\n"));
-    fprintf(fp, gettext("\
-# NOTE: Some fixed format documents may look disfigured when\n\
-# \"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n\
-# enabled.\n"));
+    write_list(fp, gettext("\
+If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n\
+your keypad when the numlock is on will act as arrow keys:\n\
+            8 = Up Arrow\n\
+  4 = Left Arrow    6 = Right Arrow\n\
+            2 = Down Arrow\n\
+and the corresponding keyboard numbers will act as arrow keys,\n\
+regardless of whether numlock is on.\n\
+"));
+    write_list(fp, gettext("\
+If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n\
+appear next to each link and numbers are used to select links.\n\
+"));
+    write_list(fp, gettext("\
+If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n\
+numbers will appear next to each link and visible form input field.\n\
+Numbers are used to select links, or to move the \"current link\" to a\n\
+form input field or button.  In addition, options in popup menus are\n\
+indexed so that the user may type an option number to select an option in\n\
+a popup menu, even if the option isn't visible on the screen.  Reference\n\
+lists and output from the list command also enumerate form inputs.\n\
+"));
+    write_list(fp, gettext("\
+NOTE: Some fixed format documents may look disfigured when\n\
+\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n\
+enabled.\n\
+"));
     fprintf(fp, "keypad_mode=%s\n\n",
 		((keypad_mode == NUMBERS_AS_ARROWS) ?  "NUMBERS_AS_ARROWS" :
 	       ((keypad_mode == LINKS_ARE_NUMBERED) ? "LINKS_ARE_NUMBERED" :
@@ -817,30 +858,32 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Partial display threshold
      */
-    fprintf(fp, gettext("\
-# partial_thres specifies the number of lines Lynx should download and render\n\
-# before we redraw the screen in Partial Display logic\n\
-# e.g., partial_thres=2\n\
-# would have Lynx redraw every 2 lines that it renders\n\
-# partial_thres=-1 would use the entire screensize\n"));
+    write_list(fp, gettext("\
+partial_thres specifies the number of lines Lynx should download and render\n\
+before we redraw the screen in Partial Display logic\n\
+e.g., partial_thres=2\n\
+would have Lynx redraw every 2 lines that it renders\n\
+partial_thres=-1 would use the entire screensize\n\
+"));
     fprintf(fp, "partial_thres=%d\n\n", partial_threshold);
 #endif /* DISP_PARTIAL */
 
     /*
      *  Line edit mode.
      */
-    fprintf(fp, gettext("\
-# lineedit_mode specifies the key binding used for inputting strings in\n\
-# prompts and forms.  If lineedit_mode is set to \"Default Binding\" then\n\
-# the following control characters are used for moving and deleting:\n\
-#\n\
-#              Prev  Next       Enter = Accept input\n\
-#    Move char: <-    ->        ^G    = Cancel input\n\
-#    Move word: ^P    ^N        ^U    = Erase line\n\
-#  Delete char: ^H    ^R        ^A    = Beginning of line\n\
-#  Delete word: ^B    ^F        ^E    = End of line\n\
-#\n\
-# Current lineedit modes are:\n"));
+    write_list(fp, gettext("\
+lineedit_mode specifies the key binding used for inputting strings in\n\
+prompts and forms.  If lineedit_mode is set to \"Default Binding\" then\n\
+the following control characters are used for moving and deleting:\n\
+\n\
+             Prev  Next       Enter = Accept input\n\
+   Move char: <-    ->        ^G    = Cancel input\n\
+   Move word: ^P    ^N        ^U    = Erase line\n\
+ Delete char: ^H    ^R        ^A    = Beginning of line\n\
+ Delete word: ^B    ^F        ^E    = End of line\n\
+\n\
+Current lineedit modes are:\n\
+"));
     {
 	char **bindings = LYLineeditNames;
 	while (*bindings) {
@@ -857,11 +900,12 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Directory list style.
      */
-    fprintf(fp, gettext("\
-# dir_list_styles specifies the directory list style under DIRED_SUPPORT\n\
-# (if implemented).  The default is \"MIXED_STYLE\", which sorts both\n\
-# files and directories together.  \"FILES_FIRST\" lists files first and\n\
-# \"DIRECTORIES_FIRST\" lists directories first.\n"));
+    write_list(fp, gettext("\
+dir_list_styles specifies the directory list style under DIRED_SUPPORT\n\
+(if implemented).  The default is \"MIXED_STYLE\", which sorts both\n\
+files and directories together.  \"FILES_FIRST\" lists files first and\n\
+\"DIRECTORIES_FIRST\" lists directories first.\n\
+"));
     fprintf(fp, "dir_list_style=%s\n\n",
 		(dir_list_style==FILES_FIRST ? "FILES_FIRST"
 					     :
@@ -872,13 +916,14 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  User mode.
      */
-    fprintf(fp, gettext("\
-# user_mode specifies the users level of knowledge with Lynx.  The\n\
-# default is \"NOVICE\" which displays two extra lines of help at the\n\
-# bottom of the screen to aid the user in learning the basic Lynx\n\
-# commands.  Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n\
-# Use \"ADVANCED\" to see the URL of the currently selected link at the\n\
-# bottom of the screen.\n"));
+    write_list(fp, gettext("\
+user_mode specifies the users level of knowledge with Lynx.  The\n\
+default is \"NOVICE\" which displays two extra lines of help at the\n\
+bottom of the screen to aid the user in learning the basic Lynx\n\
+commands.  Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n\
+Use \"ADVANCED\" to see the URL of the currently selected link at the\n\
+bottom of the screen.\n\
+"));
     fprintf(fp, "user_mode=%s\n\n",
 		(user_mode == NOVICE_MODE ? "NOVICE" :
 			 (user_mode == ADVANCED_MODE ?
@@ -887,20 +932,22 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Cookie options
      */
-    fprintf(fp, gettext("\
-# accept_all_cookies allows the user to tell Lynx to automatically\n\
-# accept all cookies if desired.  The default is \"FALSE\" which will\n\
-# prompt for each cookie.  Set accept_all_cookies to \"TRUE\" to accept\n\
-# all cookies.\n"));
+    write_list(fp, gettext("\
+accept_all_cookies allows the user to tell Lynx to automatically\n\
+accept all cookies if desired.  The default is \"FALSE\" which will\n\
+prompt for each cookie.  Set accept_all_cookies to \"TRUE\" to accept\n\
+all cookies.\n\
+"));
     fprintf(fp, "accept_all_cookies=%s\n\n",
 		(LYAcceptAllCookies == FALSE ? "FALSE" : "TRUE"));
 
-    fprintf(fp, gettext("\
-# cookie_accept_domains and cookie_reject_domains are comma-delimited\n\
-# lists of domains from which Lynx should automatically accept or reject\n\
-# all cookies.  If a domain is specified in both options, rejection will\n\
-# take precedence.  The accept_all_cookies parameter will override any\n\
-# settings made here.\n"));
+    write_list(fp, gettext("\
+cookie_accept_domains and cookie_reject_domains are comma-delimited\n\
+lists of domains from which Lynx should automatically accept or reject\n\
+all cookies.  If a domain is specified in both options, rejection will\n\
+take precedence.  The accept_all_cookies parameter will override any\n\
+settings made here.\n\
+"));
     fprintf(fp, "cookie_accept_domains=%s\n",
 		    (LYCookieAcceptDomains == NULL ? ""
 		    : LYCookieAcceptDomains));
@@ -909,14 +956,15 @@ PUBLIC int save_rc NOPARAMS
 		    : LYCookieRejectDomains));
 
 
-    fprintf(fp, gettext("\
-# cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n\
-# cookie_query_invalid_domains are comma-delimited lists of which domains\n\
-# should be subjected to varying degrees of validity checking.  If a\n\
-# domain is set to strict checking, strict conformance to RFC2109 will\n\
-# be applied.  A domain with loose checking will be allowed to set cookies\n\
-# with an invalid path or domain attribute.  All domains will default to\n\
-# querying the user for an invalid path or domain.\n"));
+    write_list(fp, gettext("\
+cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n\
+cookie_query_invalid_domains are comma-delimited lists of which domains\n\
+should be subjected to varying degrees of validity checking.  If a\n\
+domain is set to strict checking, strict conformance to RFC2109 will\n\
+be applied.  A domain with loose checking will be allowed to set cookies\n\
+with an invalid path or domain attribute.  All domains will default to\n\
+querying the user for an invalid path or domain.\n\
+"));
     fprintf(fp, "cookie_loose_invalid_domains=%s\n",
 	    (LYCookieLooseCheckDomains == NULL) ? ""
 		    : LYCookieLooseCheckDomains);
@@ -932,9 +980,10 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Cookie file.
      */
-    fprintf(fp, gettext("\
-# cookie_file specifies the file in which to store persistent cookies.\n\
-# The default is ~/.lynx_cookies.\n"));
+    write_list(fp, gettext("\
+cookie_file specifies the file in which to store persistent cookies.\n\
+The default is ~/.lynx_cookies.\n\
+"));
     fprintf(fp, "cookie_file=%s\n\n",
 		(LYCookieFile == NULL ? "~/.lynx_cookies" : LYCookieFile));
 #endif /* EXP_PERSISTENT_COOKIES */
@@ -945,43 +994,46 @@ PUBLIC int save_rc NOPARAMS
     /*
      *  Local execution mode - all links.
      */
-    fprintf(fp, gettext("\
-# If run_all_execution_links is set \"on\" then all local execution links\n\
-# will be executed when they are selected.\n\
-#\n\
-# WARNING - This is potentially VERY dangerous.  Since you may view\n\
-#           information that is written by unknown and untrusted sources\n\
-#           there exists the possibility that Trojan horse links could be\n\
-#           written.  Trojan horse links could be written to erase files\n\
-#           or compromise security.  This should only be set to \"on\" if\n\
-#           you are viewing trusted source information.\n"));
+    write_list(fp, gettext("\
+If run_all_execution_links is set \"on\" then all local execution links\n\
+will be executed when they are selected.\n\
+\n\
+WARNING - This is potentially VERY dangerous.  Since you may view\n\
+          information that is written by unknown and untrusted sources\n\
+          there exists the possibility that Trojan horse links could be\n\
+          written.  Trojan horse links could be written to erase files\n\
+          or compromise security.  This should only be set to \"on\" if\n\
+          you are viewing trusted source information.\n\
+"));
     fprintf(fp, "run_all_execution_links=%s\n\n",
 		(local_exec ? "on" : "off"));
 
     /*
      *  Local execution mode - only links in local files.
      */
-    fprintf(fp, gettext("\
-# If run_execution_links_on_local_files is set \"on\" then all local\n\
-# execution links that are found in LOCAL files will be executed when they\n\
-# are selected.  This is different from run_all_execution_links in that\n\
-# only files that reside on the local system will have execution link\n\
-# permissions.\n\
-#\n\
-# WARNING - This is potentially dangerous.  Since you may view\n\
-#           information that is written by unknown and untrusted sources\n\
-#           there exists the possibility that Trojan horse links could be\n\
-#           written.  Trojan horse links could be written to erase files\n\
-#           or compromise security.  This should only be set to \"on\" if\n\
-#           you are viewing trusted source information.\n"));
+    write_list(fp, gettext("\
+If run_execution_links_on_local_files is set \"on\" then all local\n
+execution links that are found in LOCAL files will be executed when they\n\
+are selected.  This is different from run_all_execution_links in that\n\
+only files that reside on the local system will have execution link\n\
+permissions.\n\
+\n\
+WARNING - This is potentially dangerous.  Since you may view\n\
+          information that is written by unknown and untrusted sources\n\
+          there exists the possibility that Trojan horse links could be\n\
+          written.  Trojan horse links could be written to erase files\n\
+          or compromise security.  This should only be set to \"on\" if\n\
+          you are viewing trusted source information.\n\
+"));
     fprintf(fp, "run_execution_links_on_local_files=%s\n\n",
 		(local_exec_on_local_files ? "on" : "off"));
 #endif /* defined(EXEC_LINKS) || defined(EXEC_SCRIPTS) */
 
-    fprintf(fp, gettext("\
-# If verbose_images is \"on\", lynx will print the name of the image\n\
-# source file in place of [INLINE], [LINK] or [IMAGE]\n\
-# See also VERBOSE_IMAGES in lynx.cfg\n"));
+    write_list(fp, gettext("\
+If verbose_images is \"on\", lynx will print the name of the image\n\
+source file in place of [INLINE], [LINK] or [IMAGE]\n\
+See also VERBOSE_IMAGES in lynx.cfg\n\
+"));
     fprintf(fp, "verbose_images=%s\n\n",
 		verbose_img ? "on" : "off");