]> git.lyx.org Git - lyx.git/blobdiff - src/LyXRC.cpp
Split pdf format as discussed on the list
[lyx.git] / src / LyXRC.cpp
index a9e01d961cfe5c4562b0b704056542e18275318e..e7e7593908e1de9f33f09b4e389cf022f757ccb1 100644 (file)
@@ -3,11 +3,11 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author Jean-Marc Lasgouttes
  * \author Angus Leeming
  * \author John Levon
- * \author André Pönitz
+ * \author André Pönitz
  * \author Allan Rae
  * \author Dekel Tsur
  *
 
 #include <config.h>
 
-#include <fstream>
-#include <iostream>
-
 #include "LyXRC.h"
 
-#include "support/debug.h"
-#include "Color.h"
+#include "ColorSet.h"
 #include "Converter.h"
+#include "FontEnums.h"
 #include "Format.h"
-#include "support/gettext.h"
-#include "Session.h"
 #include "Lexer.h"
-#include "FontEnums.h"
+#include "LyX.h"
 #include "Mover.h"
+#include "Session.h"
+#include "SpellChecker.h"
+#include "version.h"
 
 #include "graphics/GraphicsTypes.h"
 
 #include "support/convert.h"
+#include "support/debug.h"
 #include "support/environment.h"
+#include "support/FileName.h"
 #include "support/filetools.h"
+#include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/os.h"
+#include "support/Package.h"
 #include "support/userinfo.h"
 
+#include <fstream>
+#include <iostream>
+#include <algorithm>
+
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
 namespace os = support::os;
 
-using support::ascii_lowercase;
-using support::bformat;
-using support::expandPath;
-using support::FileName;
-using support::getEnv;
-using support::libFileSearch;
-using support::token;
-
-using std::cout;
-using std::endl;
-
-using std::ios;
-using std::ofstream;
-using std::ostream;
-using std::string;
-
-
 namespace {
 
+static unsigned int const LYXRC_FILEFORMAT = 11; // gb: Split pdf format into pdf and pdf6
+
 // when adding something to this array keep it sorted!
-keyword_item lyxrcTags[] = {
+LexerKeyword lyxrcTags[] = {
        { "\\accept_compound", LyXRC::RC_ACCEPT_COMPOUND },
        { "\\allow_geometry_session", LyXRC::RC_GEOMETRY_SESSION },
        { "\\alternate_language", LyXRC::RC_ALT_LANG },
        { "\\auto_number", LyXRC::RC_AUTO_NUMBER },
        { "\\auto_region_delete", LyXRC::RC_AUTOREGIONDELETE },
        { "\\auto_reset_options", LyXRC::RC_AUTORESET_OPTIONS },
+       { "\\autocorrection_math", LyXRC::RC_AUTOCORRECTION_MATH },
        { "\\autosave", LyXRC::RC_AUTOSAVE },
        { "\\backupdir_path", LyXRC::RC_BACKUPDIR_PATH },
+       { "\\bibtex_alternatives", LyXRC::RC_BIBTEX_ALTERNATIVES },
        { "\\bibtex_command", LyXRC::RC_BIBTEX_COMMAND },
        { "\\bind_file", LyXRC::RC_BINDFILE },
        { "\\check_lastfiles", LyXRC::RC_CHECKLASTFILES },
        { "\\chktex_command", LyXRC::RC_CHKTEX_COMMAND },
+       { "\\close_buffer_with_last_view", LyXRC::RC_CLOSE_BUFFER_WITH_LAST_VIEW },
+       { "\\completion_cursor_text", LyXRC::RC_COMPLETION_CURSOR_TEXT },
+       { "\\completion_inline_delay", LyXRC::RC_COMPLETION_INLINE_DELAY },
+       { "\\completion_inline_dots", LyXRC::RC_COMPLETION_INLINE_DOTS },
+       { "\\completion_inline_math", LyXRC::RC_COMPLETION_INLINE_MATH },
+       { "\\completion_inline_text", LyXRC::RC_COMPLETION_INLINE_TEXT },
+       { "\\completion_minlength", LyXRC::RC_COMPLETION_MINLENGTH },
+       { "\\completion_popup_after_complete", LyXRC::RC_COMPLETION_POPUP_AFTER_COMPLETE },
+       { "\\completion_popup_delay", LyXRC::RC_COMPLETION_POPUP_DELAY },
+       { "\\completion_popup_math", LyXRC::RC_COMPLETION_POPUP_MATH },
+       { "\\completion_popup_text", LyXRC::RC_COMPLETION_POPUP_TEXT },
        { "\\converter", LyXRC::RC_CONVERTER },
        { "\\converter_cache_maxage", LyXRC::RC_CONVERTER_CACHE_MAXAGE },
        { "\\copier", LyXRC::RC_COPIER },
        { "\\cursor_follows_scrollbar", LyXRC::RC_CURSOR_FOLLOWS_SCROLLBAR },
-       { "\\custom_export_command", LyXRC::RC_CUSTOM_EXPORT_COMMAND },
-       { "\\custom_export_format", LyXRC::RC_CUSTOM_EXPORT_FORMAT },
+       { "\\cursor_width", LyXRC::RC_CURSOR_WIDTH },
        { "\\date_insert_format", LyXRC::RC_DATE_INSERT_FORMAT },
        { "\\def_file", LyXRC::RC_DEFFILE },
-       { "\\default_language", LyXRC::RC_DEFAULT_LANGUAGE },
-       { "\\default_papersize", LyXRC::RC_DEFAULT_PAPERSIZE },
+       { "\\default_decimal_point", LyXRC::RC_DEFAULT_DECIMAL_POINT },
+       { "\\default_length_unit", LyXRC::RC_DEFAULT_LENGTH_UNIT },
+       { "\\default_view_format", LyXRC::RC_DEFAULT_VIEW_FORMAT },
        { "\\dialogs_iconify_with_main", LyXRC::RC_DIALOGS_ICONIFY_WITH_MAIN },
        { "\\display_graphics", LyXRC::RC_DISPLAY_GRAPHICS },
        { "\\document_path", LyXRC::RC_DOCUMENTPATH },
+       { "\\editor_alternatives", LyXRC::RC_EDITOR_ALTERNATIVES },
        { "\\escape_chars", LyXRC::RC_ESC_CHARS },
        { "\\example_path", LyXRC::RC_EXAMPLEPATH },
+       { "\\export_overwrite", LyXRC::RC_EXPORT_OVERWRITE },
        { "\\font_encoding", LyXRC::RC_FONT_ENCODING },
-       { "\\format", LyXRC::RC_FORMAT },
+       { "\\force_paint_single_char", LyXRC::RC_FORCE_PAINT_SINGLE_CHAR },
+       { "\\format", LyXRC::RC_FILEFORMAT },
+       { "\\forward_search_dvi", LyXRC::RC_FORWARD_SEARCH_DVI },
+       { "\\forward_search_pdf", LyXRC::RC_FORWARD_SEARCH_PDF },
+       { "\\fullscreen_limit", LyXRC::RC_FULL_SCREEN_LIMIT },
+       { "\\fullscreen_menubar", LyXRC::RC_FULL_SCREEN_MENUBAR },
+       { "\\fullscreen_scrollbar", LyXRC::RC_FULL_SCREEN_SCROLLBAR },
+       { "\\fullscreen_tabbar", LyXRC::RC_FULL_SCREEN_TABBAR },
+       { "\\fullscreen_toolbars", LyXRC::RC_FULL_SCREEN_TOOLBARS },
+       { "\\fullscreen_width", LyXRC::RC_FULL_SCREEN_WIDTH },
+       { "\\group_layouts", LyXRC::RC_GROUP_LAYOUTS },
+       { "\\gui_language", LyXRC::RC_GUI_LANGUAGE },
+       { "\\hunspelldir_path", LyXRC::RC_HUNSPELLDIR_PATH },
+       { "\\icon_set", LyXRC::RC_ICON_SET },
+       { "\\index_alternatives", LyXRC::RC_INDEX_ALTERNATIVES },
        { "\\index_command", LyXRC::RC_INDEX_COMMAND },
        { "\\input", LyXRC::RC_INPUT },
+       { "\\jbibtex_command", LyXRC::RC_JBIBTEX_COMMAND },
+       { "\\jindex_command", LyXRC::RC_JINDEX_COMMAND },
        { "\\kbmap", LyXRC::RC_KBMAP },
        { "\\kbmap_primary", LyXRC::RC_KBMAP_PRIMARY },
        { "\\kbmap_secondary", LyXRC::RC_KBMAP_SECONDARY },
-       { "\\label_init_length", LyXRC::RC_LABEL_INIT_LENGTH },
        { "\\language_auto_begin", LyXRC::RC_LANGUAGE_AUTO_BEGIN },
        { "\\language_auto_end", LyXRC::RC_LANGUAGE_AUTO_END },
        { "\\language_command_begin", LyXRC::RC_LANGUAGE_COMMAND_BEGIN },
        { "\\language_command_end", LyXRC::RC_LANGUAGE_COMMAND_END },
        { "\\language_command_local", LyXRC::RC_LANGUAGE_COMMAND_LOCAL },
+       { "\\language_custom_package", LyXRC::RC_LANGUAGE_CUSTOM_PACKAGE },
        { "\\language_global_options", LyXRC::RC_LANGUAGE_GLOBAL_OPTIONS },
-       { "\\language_package", LyXRC::RC_LANGUAGE_PACKAGE },
-       { "\\language_use_babel", LyXRC::RC_LANGUAGE_USE_BABEL },
+       { "\\language_package_selection", LyXRC::RC_LANGUAGE_PACKAGE_SELECTION },
        { "\\load_session", LyXRC::RC_LOADSESSION },
+       { "\\mac_dontswap_ctrl_meta", LyXRC::RC_MAC_DONTSWAP_CTRL_META },
+       { "\\mac_like_word_movement", LyXRC::RC_MAC_LIKE_WORD_MOVEMENT },
+       { "\\macro_edit_style", LyXRC::RC_MACRO_EDIT_STYLE },
        { "\\make_backup", LyXRC::RC_MAKE_BACKUP },
        { "\\mark_foreign_language", LyXRC::RC_MARK_FOREIGN_LANGUAGE },
+       { "\\mouse_wheel_speed", LyXRC::RC_MOUSE_WHEEL_SPEED },
+       { "\\nomencl_command", LyXRC::RC_NOMENCL_COMMAND },
        { "\\num_lastfiles", LyXRC::RC_NUMLASTFILES },
+       { "\\open_buffers_in_tabs", LyXRC::RC_OPEN_BUFFERS_IN_TABS },
+       { "\\paragraph_markers", LyXRC::RC_PARAGRAPH_MARKERS },
        { "\\path_prefix", LyXRC::RC_PATH_PREFIX },
-       { "\\personal_dictionary", LyXRC::RC_PERS_DICT },
        { "\\plaintext_linelen", LyXRC::RC_PLAINTEXT_LINELEN },
-       { "\\plaintext_roff_command", LyXRC::RC_PLAINTEXT_ROFF_COMMAND },
        { "\\preview", LyXRC::RC_PREVIEW },
        { "\\preview_hashed_labels", LyXRC::RC_PREVIEW_HASHED_LABELS },
        { "\\preview_scale_factor", LyXRC::RC_PREVIEW_SCALE_FACTOR },
@@ -139,6 +167,7 @@ keyword_item lyxrcTags[] = {
        { "\\print_to_printer", LyXRC::RC_PRINTTOPRINTER },
        { "\\printer", LyXRC::RC_PRINTER },
        { "\\rtl", LyXRC::RC_RTL_SUPPORT },
+       { "\\save_compressed", LyXRC::RC_SAVE_COMPRESSED },
        { "\\screen_dpi", LyXRC::RC_SCREEN_DPI },
        { "\\screen_font_roman", LyXRC::RC_SCREEN_FONT_ROMAN },
        { "\\screen_font_roman_foundry", LyXRC::RC_SCREEN_FONT_ROMAN_FOUNDRY },
@@ -149,36 +178,43 @@ keyword_item lyxrcTags[] = {
        { "\\screen_font_typewriter", LyXRC::RC_SCREEN_FONT_TYPEWRITER },
        { "\\screen_font_typewriter_foundry", LyXRC::RC_SCREEN_FONT_TYPEWRITER_FOUNDRY },
        { "\\screen_zoom", LyXRC::RC_SCREEN_ZOOM },
+       { "\\scroll_below_document", LyXRC::RC_SCROLL_BELOW_DOCUMENT },
+       { "\\scroll_wheel_zoom", LyXRC::RC_SCROLL_WHEEL_ZOOM },
        { "\\serverpipe", LyXRC::RC_SERVERPIPE },
        { "\\set_color", LyXRC::RC_SET_COLOR },
        { "\\show_banner", LyXRC::RC_SHOW_BANNER },
+       { "\\single_close_tab_button", LyXRC::RC_SINGLE_CLOSE_TAB_BUTTON },
+       { "\\single_instance", LyXRC::RC_SINGLE_INSTANCE },
        { "\\sort_layouts", LyXRC::RC_SORT_LAYOUTS },
-       { "\\spell_command", LyXRC::RC_SPELL_COMMAND },
+       { "\\spellcheck_continuously", LyXRC::RC_SPELLCHECK_CONTINUOUSLY },
+       { "\\spellcheck_notes", LyXRC::RC_SPELLCHECK_NOTES },
+       { "\\spellchecker", LyXRC::RC_SPELLCHECKER },
+       { "\\splitindex_command", LyXRC::RC_SPLITINDEX_COMMAND },
        { "\\tempdir_path", LyXRC::RC_TEMPDIRPATH },
        { "\\template_path", LyXRC::RC_TEMPLATEPATH },
        { "\\tex_allows_spaces", LyXRC::RC_TEX_ALLOWS_SPACES },
        { "\\tex_expects_windows_paths", LyXRC::RC_TEX_EXPECTS_WINDOWS_PATHS },
+       { "\\texinputs_prefix", LyXRC::RC_TEXINPUTS_PREFIX },
+       { "\\thesaurusdir_path", LyXRC::RC_THESAURUSDIRPATH },
        { "\\ui_file", LyXRC::RC_UIFILE },
-       { "\\use_alt_language", LyXRC::RC_USE_ALT_LANG },
        { "\\use_converter_cache", LyXRC::RC_USE_CONVERTER_CACHE },
-       { "\\use_escape_chars", LyXRC::RC_USE_ESC_CHARS },
-       { "\\use_input_encoding", LyXRC::RC_USE_INP_ENC },
        { "\\use_lastfilepos", LyXRC::RC_USELASTFILEPOS },
-       { "\\use_personal_dictionary", LyXRC::RC_USE_PERS_DICT },
        { "\\use_pixmap_cache", LyXRC::RC_USE_PIXMAP_CACHE },
+       { "\\use_qimage", LyXRC::RC_USE_QIMAGE },
        // compatibility with versions older than 1.4.0 only
-       { "\\use_pspell", LyXRC::RC_USE_SPELL_LIB },
-       { "\\use_spell_lib", LyXRC::RC_USE_SPELL_LIB },
-       // compatibility with versions older than 1.4.0 only
-       { "\\use_tempdir", LyXRC::RC_USETEMPDIR },
+       { "\\use_system_colors", LyXRC::RC_USE_SYSTEM_COLORS },
+       { "\\use_tooltip", LyXRC::RC_USE_TOOLTIP },
        { "\\user_email", LyXRC::RC_USER_EMAIL },
        { "\\user_name", LyXRC::RC_USER_NAME },
        { "\\view_dvi_paper_option", LyXRC::RC_VIEWDVI_PAPEROPTION },
        // compatibility with versions older than 1.4.0 only
-       { "\\viewer", LyXRC::RC_VIEWER}
+       { "\\viewer", LyXRC::RC_VIEWER},
+       { "\\viewer_alternatives", LyXRC::RC_VIEWER_ALTERNATIVES },
+       { "\\visual_cursor", LyXRC::RC_VISUAL_CURSOR },
+       { "format", LyXRC::RC_LYXRCFORMAT }
 };
 
-const int lyxrcCount = sizeof(lyxrcTags) / sizeof(keyword_item);
+const int lyxrcCount = sizeof(lyxrcTags) / sizeof(lyxrcTags[0]);
 
 } // namespace anon
 
@@ -189,10 +225,14 @@ LyXRC::LyXRC()
 }
 
 
-void LyXRC::setDefaults() {
+void LyXRC::setDefaults()
+{
+       icon_set = string();
        bind_file = "cua";
        def_file = "default";
        ui_file = "default";
+       // The current document directory
+       texinputs_prefix = ".";
        // Get printer from the environment. If fail, use default "",
        // assuming that everything is set up correctly.
        printer = getEnv("PRINTER");
@@ -212,14 +252,14 @@ void LyXRC::setDefaults() {
        print_paper_dimension_flag = "-T";
        document_path.erase();
        view_dvi_paper_option.erase();
-       default_papersize = PAPER_DEFAULT;
-       custom_export_format = "ps";
+       default_view_format = "pdf2";
        chktex_command = "chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38";
        bibtex_command = "bibtex";
        fontenc = "default";
        index_command = "makeindex -c -q";
+       nomencl_command = "makeindex -s nomencl.ist";
        dpi = 75;
-       // Because a screen typically is wider than a piece of paper:
+       // Because a screen is typically wider than a piece of paper:
        zoom = 150;
        allow_geometry_session = true;
        // Default LaTeX font size:
@@ -241,51 +281,97 @@ void LyXRC::setDefaults() {
        auto_region_delete = true;
        auto_reset_options = false;
        plaintext_linelen = 65;
+       mouse_wheel_speed = 1.0;
        num_lastfiles = maxlastfiles;
        check_lastfiles = true;
        use_lastfilepos = true;
        load_session = false;
        make_backup = true;
+       save_compressed = false;
        backupdir_path.erase();
-       display_graphics = graphics::ColorDisplay;
+       display_graphics = true;
        // Spellchecker settings:
-       use_spell_lib = true;
-       isp_command = "ispell";
-       isp_accept_compound = false;
-       isp_use_input_encoding = false;
-       isp_use_alt_lang = false;
-       isp_use_pers_dict = false;
-       isp_use_esc_chars = false;
+// FIXME: this check should test the target platform (darwin)
+#if defined(USE_MACOSX_PACKAGING)
+       spellchecker = "native";
+#elif defined(USE_ASPELL)
+       spellchecker = "aspell";
+#elif defined(USE_HUNSPELL)
+       spellchecker = "hunspell";
+#else
+       spellchecker = "aspell";
+#endif
+       spellchecker_accept_compound = false;
+       spellcheck_continuously = false;
+       completion_minlength = 6;
+       spellcheck_notes = true;
        use_kbmap = false;
        rtl_support = true;
+       visual_cursor = false;
        auto_number = true;
        mark_foreign_language = true;
        language_auto_begin = true;
        language_auto_end = true;
        language_global_options = true;
-       language_use_babel = true;
-       language_package = "\\usepackage{babel}";
+       language_package_selection = LP_AUTO;
+       language_custom_package = "\\usepackage{babel}";
        language_command_begin = "\\selectlanguage{$$lang}";
        language_command_local = "\\foreignlanguage{$$lang}{";
        sort_layouts = false;
-       default_language = "english";
+       group_layouts = true;
+       gui_language = "auto";
        show_banner = true;
        windows_style_tex_paths = false;
        tex_allows_spaces = false;
        date_insert_format = "%x";
        cursor_follows_scrollbar = false;
+       scroll_below_document = false;
+       scroll_wheel_zoom = SCROLL_WHEEL_ZOOM_CTRL;
+       paragraph_markers = false;
+       mac_dontswap_ctrl_meta = false;
+       mac_like_word_movement = false;
+       macro_edit_style = MACRO_EDIT_INLINE_BOX;
        dialogs_iconify_with_main = false;
-       label_init_length = 3;
        preview = PREVIEW_OFF;
        preview_hashed_labels  = false;
-       preview_scale_factor = "0.9";
+       preview_scale_factor = 1.0;
        use_converter_cache = true;
+       use_system_colors = false;
+       use_tooltip = true;
        use_pixmap_cache = false;
+       use_qimage = true;
        converter_cache_maxage = 6 * 30 * 24 * 3600; // 6 months
-
        user_name = to_utf8(support::user_name());
-
        user_email = to_utf8(support::user_email());
+       open_buffers_in_tabs = true;
+       single_close_tab_button = false;
+       single_instance = true;
+       forward_search_dvi = string();
+       forward_search_pdf = string();
+       export_overwrite = NO_FILES;
+
+       // Fullscreen settings
+       full_screen_limit = false;
+       full_screen_toolbars = true;
+       full_screen_tabbar = true;
+       full_screen_menubar = true;
+       full_screen_scrollbar = true;
+       full_screen_width = 700;
+
+       completion_cursor_text = true;
+       completion_popup_math = true;
+       completion_popup_text = false;
+       completion_popup_delay = 2.0;
+       completion_popup_after_complete = true;
+       autocorrection_math = false;
+       completion_inline_math = true;
+       completion_inline_text = false;
+       completion_inline_dots = -1;
+       completion_inline_delay = 0.2;
+       default_decimal_point = ".";
+       default_length_unit = Length::CM;
+       cursor_width = 1;
+       close_buffer_with_last_view = "yes";
 }
 
 
@@ -304,39 +390,60 @@ void oldFontFormat(string & family, string & foundry)
 } // namespace anon
 
 
-int LyXRC::read(FileName const & filename)
+bool LyXRC::read(FileName const & filename, bool check_format)
 {
-       Lexer lexrc(lyxrcTags, lyxrcCount);
-       if (lyxerr.debugging(Debug::PARSER))
-               lexrc.printTable(lyxerr);
-
+       Lexer lexrc(lyxrcTags);
        lexrc.setFile(filename);
-       if (!lexrc.isOK()) return -2;
-
        LYXERR(Debug::LYXRC, "Reading '" << filename << "'...");
-
-       return read(lexrc);
+       ReturnValues retval = read(lexrc, check_format);
+       if (!check_format || retval != FormatMismatch)
+               return retval == ReadOK;
+
+       LYXERR(Debug::FILES, "Converting LyXRC file to " << LYXRC_FILEFORMAT);
+       FileName const tempfile = FileName::tempName("convert_lyxrc");
+       bool const success = prefs2prefs(filename, tempfile, false);
+       if (!success) {
+               LYXERR0 ("Unable to convert " << filename.absFileName() <<
+                       " to format " << LYXRC_FILEFORMAT);
+               return false;
+       } else {
+               // Keep this in the else branch, such that lexrc2 goes out
+               // of scope and releases the lock on tempfile before we
+               // attempt to remove it. This matters on Windows.
+               Lexer lexrc2(lyxrcTags);
+               lexrc2.setFile(tempfile);
+               LYXERR(Debug::LYXRC, "Reading '" << tempfile << "'...");
+               retval = read(lexrc2, check_format);
+       }
+       tempfile.removeFile();
+       return retval == ReadOK;
 }
 
 
-int LyXRC::read(std::istream & is)
+// don't need to worry about conversion, because this is always
+// from an internal source
+bool LyXRC::read(istream & is)
 {
-       Lexer lexrc(lyxrcTags, lyxrcCount);
-       if (lyxerr.debugging(Debug::PARSER))
-               lexrc.printTable(lyxerr);
-
+       Lexer lexrc(lyxrcTags);
        lexrc.setStream(is);
-       if (!lexrc.isOK()) return -2;
-
        LYXERR(Debug::LYXRC, "Reading istream...");
-
-       return read(lexrc);
+       return read(lexrc, false) == ReadOK;
 }
 
 
-int LyXRC::read(Lexer & lexrc)
+LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format)
 {
-       if (!lexrc.isOK()) return -2;
+       if (lyxerr.debugging(Debug::PARSER))
+               lexrc.printTable(lyxerr);
+
+       if (!lexrc.isOK())
+               return ReadError;
+
+       // default for current rowpainter capabilities
+       force_paint_single_char = true;
+
+       // format prior to 2.0 and introduction of format tag
+       unsigned int format = 0;
 
        while (lexrc.isOK()) {
                // By using two switches we take advantage of the compiler
@@ -353,75 +460,70 @@ int LyXRC::read(Lexer & lexrc)
                        continue;
                case Lexer::LEX_FEOF:
                        continue;
-               default: break;
+               default:
+                       break;
                }
                switch (static_cast<LyXRCTags>(le)) {
+               case RC_LYXRCFORMAT:
+                       if (lexrc.next())
+                               format = lexrc.getInteger();
+                       break;
                case RC_INPUT: // Include file
                        if (lexrc.next()) {
                                FileName const tmp =
                                        libFileSearch(string(),
                                                      lexrc.getString());
-                               if (read(tmp)) {
-                                       lexrc.printError("Error reading "
-                                                        "included file: " + tmp.absFilename());
+                               if (read(tmp, check_format)) {
+                                       lexrc.printError(
+                                           "Error reading included file: " + tmp.absFileName());
                                }
                        }
                        break;
                case RC_BINDFILE:
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                bind_file = os::internal_path(lexrc.getString());
-                       }
                        break;
 
                case RC_DEFFILE:
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                def_file = os::internal_path(lexrc.getString());
-                       }
                        break;
 
                case RC_UIFILE:
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                ui_file = os::internal_path(lexrc.getString());
-                       }
                        break;
 
                case RC_AUTORESET_OPTIONS:
-                       if (lexrc.next()) {
-                               auto_reset_options = lexrc.getBool();
-                       }
+                       lexrc >> auto_reset_options;
                        break;
 
                case RC_DISPLAY_GRAPHICS:
-                       if (lexrc.next()) {
-                               display_graphics = graphics::displayTranslator().find(lexrc.getString());
-                       }
+                       if (lexrc.next())
+                               display_graphics = lexrc.getString() == "true";
                        break;
 
                case RC_TEX_EXPECTS_WINDOWS_PATHS:
-                       if (lexrc.next()) {
-                               windows_style_tex_paths = lexrc.getBool();
-                       }
+                       lexrc >> windows_style_tex_paths;
                        break;
 
                case RC_TEX_ALLOWS_SPACES:
-                       if (lexrc.next()) {
-                               tex_allows_spaces = lexrc.getBool();
-                       }
+                       lexrc >> tex_allows_spaces;
+                       break;
+
+               case RC_TEXINPUTS_PREFIX:
+                       lexrc >> texinputs_prefix;
                        break;
 
                case RC_KBMAP:
-                       if (lexrc.next()) {
-                               use_kbmap = lexrc.getBool();
-                       }
+                       lexrc >> use_kbmap;
                        break;
 
                case RC_KBMAP_PRIMARY:
                        if (lexrc.next()) {
                                string const kmap(os::internal_path(lexrc.getString()));
-                               if (kmap.empty()) {
-                                       // nothing
-                               } else if (!libFileSearch("kbd", kmap,
-                                                         "kmap").empty()) {
+                               if (!libFileSearch("kbd", kmap, "kmap").empty()
+                                         || kmap.empty()) {
                                        primary_kbmap = kmap;
                                } else {
                                        lexrc.printError("LyX: Keymap `$$Token' not found");
@@ -432,10 +534,8 @@ int LyXRC::read(Lexer & lexrc)
                case RC_KBMAP_SECONDARY:
                        if (lexrc.next()) {
                                string const kmap(os::internal_path(lexrc.getString()));
-                               if (kmap.empty()) {
-                                       // nothing
-                               } else if (!libFileSearch("kbd", kmap,
-                                                         "kmap").empty()) {
+                               if (!libFileSearch("kbd", kmap, "kmap").empty()
+                                         || kmap.empty()) {
                                        secondary_kbmap = kmap;
                                } else {
                                        lexrc.printError("LyX: Keymap `$$Token' not found");
@@ -444,75 +544,57 @@ int LyXRC::read(Lexer & lexrc)
                        break;
 
                case RC_FONT_ENCODING:
-                       if (lexrc.next()) {
-                               fontenc = lexrc.getString();
-                       }
+                       lexrc >> fontenc;
+                       break;
+
+               case RC_FORCE_PAINT_SINGLE_CHAR:
+                       lexrc >> force_paint_single_char;
                        break;
 
                case RC_PRINTER:
-                       if (lexrc.next()) {
-                               printer = lexrc.getString();
-                       }
+                       lexrc >> printer;
                        break;
 
                case RC_PRINT_COMMAND:
-                       if (lexrc.next()) {
+                       if (lexrc.next(true)) {
                                print_command = lexrc.getString();
                        }
                        break;
 
                case RC_PRINTEVENPAGEFLAG:
-                       if (lexrc.next()) {
-                               print_evenpage_flag = lexrc.getString();
-                       }
+                       lexrc >> print_evenpage_flag;
                        break;
 
                case RC_PRINTODDPAGEFLAG:
-                       if (lexrc.next()) {
-                               print_oddpage_flag = lexrc.getString();
-                       }
+                       lexrc >> print_oddpage_flag;
                        break;
 
                case RC_PRINTPAGERANGEFLAG:
-                       if (lexrc.next()) {
-                               print_pagerange_flag = lexrc.getString();
-                       }
+                       lexrc >> print_pagerange_flag;
                        break;
 
                case RC_PRINTCOPIESFLAG:
-                       if (lexrc.next()) {
-                               print_copies_flag = lexrc.getString();
-                       }
+                       lexrc >> print_copies_flag;
                        break;
 
                case RC_PRINTCOLLCOPIESFLAG:
-                       if (lexrc.next()) {
-                               print_collcopies_flag = lexrc.getString();
-                       }
+                       lexrc >> print_collcopies_flag;
                        break;
 
                case RC_PRINTREVERSEFLAG:
-                       if (lexrc.next()) {
-                               print_reverse_flag = lexrc.getString();
-                       }
+                       lexrc >> print_reverse_flag;
                        break;
 
                case RC_PRINTLANDSCAPEFLAG:
-                       if (lexrc.next()) {
-                               print_landscape_flag = lexrc.getString();
-                       }
+                       lexrc >> print_landscape_flag;
                        break;
 
                case RC_PRINTTOPRINTER:
-                       if (lexrc.next()) {
-                               print_to_printer = lexrc.getString();
-                       }
+                       lexrc >> print_to_printer;
                        break;
 
                case RC_PRINT_ADAPTOUTPUT:
-                       if (lexrc.next()) {
-                               print_adapt_output = lexrc.getBool();
-                       }
+                       lexrc >> print_adapt_output;
                        break;
 
                case RC_PRINTTOFILE:
@@ -522,181 +604,123 @@ int LyXRC::read(Lexer & lexrc)
                        break;
 
                case RC_PRINTFILEEXTENSION:
-                       if (lexrc.next()) {
-                               print_file_extension = lexrc.getString();
-                       }
+                       lexrc >> print_file_extension;
                        break;
 
                case RC_PRINTEXSTRAOPTIONS:
-                       if (lexrc.next()) {
-                               print_extra_options = lexrc.getString();
-                       }
+                       lexrc >> print_extra_options;
                        break;
 
                case RC_PRINTSPOOL_COMMAND:
-                       if (lexrc.next()) {
+                       if (lexrc.next(true)) {
                                print_spool_command = lexrc.getString();
                        }
                        break;
 
                case RC_PRINTSPOOL_PRINTERPREFIX:
-                       if (lexrc.next()) {
-                               print_spool_printerprefix = lexrc.getString();
-                       }
+                       lexrc >> print_spool_printerprefix;
                        break;
 
                case RC_PRINTPAPERDIMENSIONFLAG:
-                       if (lexrc.next()) {
-                               print_paper_dimension_flag = lexrc.getString();
-                       }
+                       lexrc >> print_paper_dimension_flag;
                        break;
 
                case RC_PRINTPAPERFLAG:
-                       if (lexrc.next()) {
-                               print_paper_flag = lexrc.getString();
-                       }
+                       lexrc >> print_paper_flag;
                        break;
 
-               case RC_CUSTOM_EXPORT_COMMAND:
-                       if (lexrc.next()) {
-                               custom_export_command = lexrc.getString();
-                       }
+               case RC_VIEWDVI_PAPEROPTION:
+                       if (lexrc.next())
+                               view_dvi_paper_option = lexrc.getString();
+                       else
+                               view_dvi_paper_option.erase();
                        break;
 
-               case RC_CUSTOM_EXPORT_FORMAT:
-                       if (lexrc.next()) {
-                               custom_export_format = lexrc.getString();
+               case RC_CHKTEX_COMMAND:
+                       if (lexrc.next(true)) {
+                               chktex_command = lexrc.getString();
                        }
                        break;
 
-               case RC_DEFAULT_PAPERSIZE:
-                       if (lexrc.next()) {
-                               string const size =
-                                       ascii_lowercase(lexrc.getString());
-                               if (size == "usletter")
-                                       default_papersize =
-                                               PAPER_USLETTER;
-                               else if (size == "legal")
-                                       default_papersize =
-                                               PAPER_USLEGAL;
-                               else if (size == "executive")
-                                       default_papersize =
-                                               PAPER_USEXECUTIVE;
-                               else if (size == "a3")
-                                       default_papersize =
-                                               PAPER_A3;
-                               else if (size == "a4")
-                                       default_papersize =
-                                               PAPER_A4;
-                               else if (size == "a5")
-                                       default_papersize =
-                                               PAPER_A5;
-                               else if (size == "b5")
-                                       default_papersize =
-                                               PAPER_B5;
-                               else if (size == "default")
-                                       default_papersize =
-                                               PAPER_DEFAULT;
+               case RC_BIBTEX_ALTERNATIVES:
+                       if (lexrc.next(true)) {
+                               bibtex_alternatives.insert(lexrc.getString());
                        }
                        break;
 
-               case RC_VIEWDVI_PAPEROPTION:
-                       if (lexrc.next()) {
-                               view_dvi_paper_option = lexrc.getString();
-                       } else {
-                               view_dvi_paper_option.erase();
+               case RC_BIBTEX_COMMAND:
+                       if (lexrc.next(true)) {
+                               bibtex_command = lexrc.getString();
                        }
                        break;
 
-               case RC_CHKTEX_COMMAND:
-                       if (lexrc.next()) {
-                               chktex_command = lexrc.getString();
+               case RC_JBIBTEX_COMMAND:
+                       if (lexrc.next(true)) {
+                               jbibtex_command = lexrc.getString();
                        }
                        break;
 
-               case RC_BIBTEX_COMMAND:
-                       if (lexrc.next()) {
-                               bibtex_command = lexrc.getString();
+               case RC_INDEX_ALTERNATIVES:
+                       if (lexrc.next(true)) {
+                               index_alternatives.insert(lexrc.getString());
                        }
                        break;
 
                case RC_INDEX_COMMAND:
-                       if (lexrc.next()) {
+                       if (lexrc.next(true)) {
                                index_command = lexrc.getString();
                        }
                        break;
 
-               case RC_SCREEN_DPI:
-                       if (lexrc.next()) {
-                               dpi = lexrc.getInteger();
+               case RC_JINDEX_COMMAND:
+                       if (lexrc.next(true)) {
+                               jindex_command = lexrc.getString();
                        }
                        break;
 
-               case RC_SCREEN_ZOOM:
-                       if (lexrc.next()) {
-                               zoom = lexrc.getInteger();
+               case RC_SPLITINDEX_COMMAND:
+                       if (lexrc.next(true)) {
+                               splitindex_command = lexrc.getString();
                        }
                        break;
 
-               case RC_GEOMETRY_SESSION:
-                       if (lexrc.next()) {
-                               allow_geometry_session = lexrc.getBool();
+               case RC_NOMENCL_COMMAND:
+                       if (lexrc.next(true)) {
+                               nomencl_command = lexrc.getString();
                        }
                        break;
 
+               case RC_SCREEN_DPI:
+                       lexrc >> dpi;
+                       break;
+
+               case RC_SCREEN_ZOOM:
+                       lexrc >> zoom;
+                       break;
+
+               case RC_GEOMETRY_SESSION:
+                       lexrc >> allow_geometry_session;
+                       break;
+
                case RC_SCREEN_FONT_SIZES:
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_TINY] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_SCRIPT] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_FOOTNOTE] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_SMALL] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_NORMAL] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_LARGE] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_LARGER] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_LARGEST] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_HUGE] =
-                                       lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               font_sizes[FONT_SIZE_HUGER] =
-                                       lexrc.getString();
-                       }
+                       lexrc >> font_sizes[FONT_SIZE_TINY];
+                       lexrc >> font_sizes[FONT_SIZE_SCRIPT];
+                       lexrc >> font_sizes[FONT_SIZE_FOOTNOTE];
+                       lexrc >> font_sizes[FONT_SIZE_SMALL];
+                       lexrc >> font_sizes[FONT_SIZE_NORMAL];
+                       lexrc >> font_sizes[FONT_SIZE_LARGE];
+                       lexrc >> font_sizes[FONT_SIZE_LARGER];
+                       lexrc >> font_sizes[FONT_SIZE_LARGEST];
+                       lexrc >> font_sizes[FONT_SIZE_HUGE];
+                       lexrc >> font_sizes[FONT_SIZE_HUGER];
                        break;
 
                case RC_SCREEN_FONT_SCALABLE:
-                       if (lexrc.next()) {
-                               use_scalable_fonts = lexrc.getBool();
-                       }
+                       lexrc >> use_scalable_fonts;
                        break;
 
                case RC_AUTOSAVE:
-                       if (lexrc.next()) {
-                               autosave = lexrc.getInteger();
-                       }
+                       lexrc >> autosave;
                        break;
 
                case RC_DOCUMENTPATH:
@@ -727,34 +751,86 @@ int LyXRC::read(Lexer & lexrc)
                        }
                        break;
 
-               case RC_USETEMPDIR:
+               case RC_THESAURUSDIRPATH:
                        if (lexrc.next()) {
-                               lyxerr << "Ignoring obsolete use_tempdir flag." << endl;
+                               thesaurusdir_path = os::internal_path(lexrc.getString());
+                               thesaurusdir_path = expandPath(thesaurusdir_path);
                        }
                        break;
 
-               case RC_USELASTFILEPOS:
+               case RC_HUNSPELLDIR_PATH:
                        if (lexrc.next()) {
-                               use_lastfilepos = lexrc.getBool();
+                               hunspelldir_path = os::internal_path(lexrc.getString());
+                               hunspelldir_path = expandPath(hunspelldir_path);
                        }
                        break;
 
+               case RC_USELASTFILEPOS:
+                       lexrc >> use_lastfilepos;
+                       break;
+
                case RC_LOADSESSION:
-                       if (lexrc.next()) {
-                               load_session = lexrc.getBool();
-                       }
+                       lexrc >> load_session;
+                       break;
+
+               case RC_MOUSE_WHEEL_SPEED:
+                       lexrc >> mouse_wheel_speed;
+                       break;
+
+               case RC_COMPLETION_INLINE_DELAY:
+                       lexrc >> completion_inline_delay;
+                       break;
+
+               case RC_COMPLETION_INLINE_MATH:
+                       lexrc >> completion_inline_math;
+                       break;
+
+               case RC_COMPLETION_INLINE_TEXT:
+                       lexrc >> completion_inline_text;
+                       break;
+
+               case RC_COMPLETION_INLINE_DOTS:
+                       lexrc >> completion_inline_dots;
+                       break;
+
+               case RC_AUTOCORRECTION_MATH:
+                       lexrc >> autocorrection_math;
+                       break;
+
+               case RC_COMPLETION_POPUP_DELAY:
+                       lexrc >> completion_popup_delay;
+                       break;
+
+               case RC_COMPLETION_POPUP_MATH:
+                       lexrc >> completion_popup_math;
+                       break;
+
+               case RC_COMPLETION_POPUP_TEXT:
+                       lexrc >> completion_popup_text;
+                       break;
+
+               case RC_COMPLETION_CURSOR_TEXT:
+                       lexrc >> completion_cursor_text;
+                       break;
+
+               case RC_COMPLETION_POPUP_AFTER_COMPLETE:
+                       lexrc >> completion_popup_after_complete;
+                       break;
+
+               case RC_COMPLETION_MINLENGTH:
+                       lexrc >> completion_minlength;
                        break;
 
                case RC_NUMLASTFILES:
-                       if (lexrc.next()) {
-                               num_lastfiles = lexrc.getInteger();
-                       }
+                       lexrc >> num_lastfiles;
                        break;
 
                case RC_CHECKLASTFILES:
-                       if (lexrc.next()) {
-                               check_lastfiles = lexrc.getBool();
-                       }
+                       lexrc >> check_lastfiles;
+                       break;
+
+               case RC_ICON_SET:
+                       lexrc >> icon_set;
                        break;
 
                case RC_SCREEN_FONT_ROMAN:
@@ -781,40 +857,29 @@ int LyXRC::read(Lexer & lexrc)
                        break;
 
                case RC_SCREEN_FONT_ROMAN_FOUNDRY:
-                       if (lexrc.next()) {
-                               roman_font_foundry = lexrc.getString();
-                       }
+                       lexrc >> roman_font_foundry;
                        break;
 
                case RC_SCREEN_FONT_SANS_FOUNDRY:
-                       if (lexrc.next()) {
-                               sans_font_foundry = lexrc.getString();
-                       }
+                       lexrc >> sans_font_foundry;
                        break;
 
                case RC_SCREEN_FONT_TYPEWRITER_FOUNDRY:
-                       if (lexrc.next()) {
-                               typewriter_font_foundry = lexrc.getString();
-                       }
+                       lexrc >> typewriter_font_foundry;
                        break;
 
-               case RC_SET_COLOR:
-               {
-                       string lyx_name, x11_name;
-
-                       if (lexrc.next()) {
-                               lyx_name = lexrc.getString();
-                       } else {
+               case RC_SET_COLOR: {
+                       if (!lexrc.next()) {
                                lexrc.printError("Missing color tag.");
                                break;
                        }
+                       string lyx_name = lexrc.getString();
 
-                       if (lexrc.next()) {
-                               x11_name = lexrc.getString();
-                       } else {
+                       if (!lexrc.next()) {
                                lexrc.printError("Missing color name for color: `$$Token'");
                                break;
                        }
+                       string x11_name = lexrc.getString();
 
                        ColorCode const col =
                                lcolor.getFromLyXName(lyx_name);
@@ -823,18 +888,14 @@ int LyXRC::read(Lexer & lexrc)
                            col == Color_ignore)
                                break;
 
-                       if (!lcolor.setColor(col, x11_name)) {
-                               lyxerr << "Bad lyxrc set_color for "
-                                       << lyx_name << endl;
-
-                       }
+                       if (!lcolor.setColor(col, x11_name))
+                               LYXERR0("Bad lyxrc set_color for " << lyx_name);
                        break;
                }
+
                case RC_AUTOREGIONDELETE:
                        // Auto region delete defaults to true
-                       if (lexrc.next()) {
-                               auto_region_delete = lexrc.getBool();
-                       }
+                       lexrc >> auto_region_delete;
                        break;
 
                case RC_SERVERPIPE:
@@ -845,87 +906,82 @@ int LyXRC::read(Lexer & lexrc)
                        break;
 
                case RC_CURSOR_FOLLOWS_SCROLLBAR:
-                       if (lexrc.next()) {
-                               cursor_follows_scrollbar = lexrc.getBool();
-                       }
+                       lexrc >> cursor_follows_scrollbar;
                        break;
 
-               case RC_DIALOGS_ICONIFY_WITH_MAIN:
-                       if (lexrc.next()) {
-                               dialogs_iconify_with_main = lexrc.getBool();
-                       }
+               case RC_CURSOR_WIDTH:
+                       lexrc >> cursor_width;
                        break;
 
-               case RC_PLAINTEXT_ROFF_COMMAND:
-                       if (lexrc.next()) {
-                               plaintext_roff_command = lexrc.getString();
-                       }
+               case RC_SCROLL_BELOW_DOCUMENT:
+                       lexrc >> scroll_below_document;
                        break;
-               case RC_PLAINTEXT_LINELEN:
-                       if (lexrc.next()) {
-                               plaintext_linelen = lexrc.getInteger();
-                       }
+
+               case RC_PARAGRAPH_MARKERS:
+                       lexrc >> paragraph_markers;
                        break;
-                       // Spellchecker settings:
-               case RC_USE_SPELL_LIB:
-                       if (lexrc.next()) {
-                               use_spell_lib = lexrc.getBool();
-                       }
+
+               case RC_MAC_DONTSWAP_CTRL_META:
+                       lexrc >> mac_dontswap_ctrl_meta;
                        break;
-               case RC_SPELL_COMMAND:
-                       if (lexrc.next()) {
-                               isp_command = lexrc.getString();
-                       }
+
+               case RC_MAC_LIKE_WORD_MOVEMENT:
+                       lexrc >> mac_like_word_movement;
                        break;
-               case RC_ACCEPT_COMPOUND:
+
+               case RC_MACRO_EDIT_STYLE:
                        if (lexrc.next()) {
-                               isp_accept_compound = lexrc.getBool();
+                               switch (lexrc.getInteger()) {
+                               case 0: macro_edit_style = MACRO_EDIT_INLINE_BOX; break;
+                               case 1: macro_edit_style = MACRO_EDIT_INLINE; break;
+                               case 2: macro_edit_style = MACRO_EDIT_LIST; break;
+                               }
                        }
                        break;
-               case RC_USE_INP_ENC:
-                       if (lexrc.next()) {
-                               isp_use_input_encoding = lexrc.getBool();
-                       }
+
+               case RC_DIALOGS_ICONIFY_WITH_MAIN:
+                       lexrc >> dialogs_iconify_with_main;
                        break;
-               case RC_USE_ALT_LANG:
-                       if (lexrc.next()) {
-                               isp_use_alt_lang = lexrc.getBool();
-                       }
+
+               case RC_PLAINTEXT_LINELEN:
+                       lexrc >> plaintext_linelen;
                        break;
-               case RC_USE_PERS_DICT:
-                       if (lexrc.next()) {
-                               isp_use_pers_dict = lexrc.getBool();
-                       }
+                       // Spellchecker settings:
+               case RC_ACCEPT_COMPOUND:
+                       lexrc >> spellchecker_accept_compound;
+                       break;
+               case RC_USE_SYSTEM_COLORS:
+                       lexrc >> use_system_colors;
+                       break;
+               case RC_USE_TOOLTIP:
+                       lexrc >> use_tooltip;
                        break;
                case RC_USE_PIXMAP_CACHE:
-                       if (lexrc.next()) {
-                               use_pixmap_cache = lexrc.getBool();
-                       }
+                       lexrc >> use_pixmap_cache;
                        break;
-               case RC_USE_ESC_CHARS:
-                       if (lexrc.next()) {
-                               isp_use_esc_chars = lexrc.getBool();
-                       }
+               case RC_USE_QIMAGE:
+                       lexrc >> use_qimage;
                        break;
-               case RC_ALT_LANG:
-                       if (lexrc.next()) {
-                               isp_alt_lang = lexrc.getString();
-                       }
+               case RC_SPELLCHECKER:
+                       lexrc >> spellchecker;
                        break;
-               case RC_PERS_DICT:
-                       if (lexrc.next()) {
-                               isp_pers_dict = os::internal_path(lexrc.getString());
-                       }
+               case RC_ALT_LANG:
+                       lexrc >> spellchecker_alt_lang;
                        break;
                case RC_ESC_CHARS:
-                       if (lexrc.next()) {
-                               isp_esc_chars = lexrc.getString();
-                       }
+                       lexrc >> spellchecker_esc_chars;
+                       break;
+               case RC_SPELLCHECK_CONTINUOUSLY:
+                       lexrc >> spellcheck_continuously;
+                       break;
+               case RC_SPELLCHECK_NOTES:
+                       lexrc >> spellcheck_notes;
                        break;
                case RC_MAKE_BACKUP:
-                       if (lexrc.next()) {
-                               make_backup = lexrc.getBool();
-                       }
+                       lexrc >> make_backup;
+                       break;
+               case RC_SAVE_COMPRESSED:
+                       lexrc >> save_compressed;
                        break;
                case RC_BACKUPDIR_PATH:
                        if (lexrc.next()) {
@@ -933,188 +989,183 @@ int LyXRC::read(Lexer & lexrc)
                                backupdir_path = expandPath(backupdir_path);
                        }
                        break;
+               case RC_DEFAULT_DECIMAL_POINT:
+                       lexrc >> default_decimal_point;
+                       break;
+               case RC_DEFAULT_LENGTH_UNIT:
+                       if (lexrc.next())
+                               default_length_unit = (Length::UNIT) lexrc.getInteger();
+                       break;
                case RC_DATE_INSERT_FORMAT:
-                       if (lexrc.next()) {
-                               date_insert_format = lexrc.getString();
-                       }
+                       lexrc >> date_insert_format;
                        break;
-               case RC_LANGUAGE_PACKAGE:
-                       if (lexrc.next()) {
-                               language_package = lexrc.getString();
-                       }
+               case RC_LANGUAGE_CUSTOM_PACKAGE:
+                       lexrc >> language_custom_package;
                        break;
                case RC_LANGUAGE_AUTO_BEGIN:
-                       if (lexrc.next()) {
-                               language_auto_begin = lexrc.getBool();
-                       }
+                       lexrc >> language_auto_begin;
                        break;
                case RC_LANGUAGE_AUTO_END:
-                       if (lexrc.next()) {
-                               language_auto_end = lexrc.getBool();
-                       }
+                       lexrc >> language_auto_end;
                        break;
                case RC_LANGUAGE_GLOBAL_OPTIONS:
-                       if (lexrc.next()) {
-                               language_global_options = lexrc.getBool();
-                       }
-                       break;
-               case RC_LANGUAGE_USE_BABEL:
-                       if (lexrc.next()) {
-                               language_use_babel = lexrc.getBool();
+                       lexrc >> language_global_options;
+                       break;
+               case RC_LANGUAGE_PACKAGE_SELECTION:
+                       if (lexrc.next()) {
+                               switch (lexrc.getInteger()) {
+                               case 0:
+                                       language_package_selection = LP_AUTO;
+                                       break;
+                               case 1:
+                                       language_package_selection = LP_BABEL;
+                                       break;
+                               case 2:
+                                       language_package_selection = LP_CUSTOM;
+                                       break;
+                               case 3:
+                                       language_package_selection = LP_NONE;
+                                       break;
+                               }
                        }
                        break;
                case RC_LANGUAGE_COMMAND_BEGIN:
-                       if (lexrc.next()) {
-                               language_command_begin = lexrc.getString();
-                       }
+                       lexrc >> language_command_begin;
                        break;
                case RC_LANGUAGE_COMMAND_END:
-                       if (lexrc.next()) {
-                               language_command_end = lexrc.getString();
-                       }
+                       lexrc >> language_command_end;
                        break;
                case RC_LANGUAGE_COMMAND_LOCAL:
-                       if (lexrc.next()) {
-                               language_command_local = lexrc.getString();
-                       }
+                       lexrc >> language_command_local;
                        break;
                case RC_RTL_SUPPORT:
-                       if (lexrc.next()) {
-                               rtl_support = lexrc.getBool();
-                       }
+                       lexrc >> rtl_support;
+                       break;
+               case RC_VISUAL_CURSOR:
+                       lexrc >> visual_cursor;
+                       break;
+               case RC_CLOSE_BUFFER_WITH_LAST_VIEW:
+                       lexrc >> close_buffer_with_last_view;
                        break;
                case RC_AUTO_NUMBER:
-                       if (lexrc.next()) {
-                               auto_number = lexrc.getBool();
-                       }
+                       lexrc >> auto_number;
                        break;
                case RC_MARK_FOREIGN_LANGUAGE:
-                       if (lexrc.next()) {
-                               mark_foreign_language = lexrc.getBool();
-                       }
+                       lexrc >> mark_foreign_language;
                        break;
 
                case RC_COPIER: {
                        string fmt, command;
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                fmt = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
+                       if (lexrc.next(true))
                                command = lexrc.getString();
-                       }
                        setMover(fmt, command);
                        break;
                }
 
                case RC_CONVERTER: {
                        string from, to, command, flags;
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                from = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                to = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
+                       if (lexrc.next(true))
                                command = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
+                       if (lexrc.next())
                                flags = lexrc.getString();
-                       }
-                       if (command.empty()) {
+                       if (command.empty())
                                theConverters().erase(from, to);
-                       } else {
+                       else
                                theConverters().add(from, to, command, flags);
-                       }
                        break;
                }
                // compatibility with versions older than 1.4.0 only
                case RC_VIEWER: {
                        string format, command;
-                       if (lexrc.next()) {
-                               format = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               command = lexrc.getString();
-                       }
+                       lexrc >> format >> command;
                        formats.setViewer(format, command);
                        break;
                }
-               case RC_FORMAT: {
-                       string format, extension, prettyname, shortcut;
-                       if (lexrc.next()) {
-                               format = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               extension = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               prettyname = lexrc.getString();
-                       }
-                       if (lexrc.next()) {
-                               shortcut = lexrc.getString();
-                       }
+               case RC_FILEFORMAT: {
+                       bool ok = true;
+                       string format, extensions, prettyname, shortcut;
+                       if (!(lexrc >> format >> extensions))
+                               ok = false;
+                       if (ok && lexrc.next(true))
+                               prettyname  = lexrc.getString();
+                       else
+                               ok = false;
+                       if (ok)
+                               if(!(lexrc >> shortcut))
+                                       ok = false;
                        string viewer, editor;
-                       if (lexrc.next())
+                       if (ok && lexrc.next(true))
                                viewer = lexrc.getString();
-                       if (lexrc.next())
+                       else
+                               ok = false;
+                       if (ok && lexrc.next(true))
                                editor = lexrc.getString();
-                       string flags;
-                       // Hack to ensure compatibility with versions older
-                       // than 1.5.0
-                       int le = lexrc.lex();
-                       if (le != Lexer::LEX_FEOF && le != Lexer::LEX_UNDEF) {
-                               flags = lexrc.getString();
-                               if (le != Lexer::LEX_DATA) {
-                                       // We have got a known token.
-                                       // Therefore this is an old style
-                                       // format definition without
-                                       // flags.
-                                       lexrc.pushToken(flags);
-                                       flags.erase();
-                               }
-                       }
+                       else
+                               ok = false;
+                       string flags, mime;
+                       if (!(lexrc >> flags >> mime))
+                               ok = false;
                        int flgs = Format::none;
                        while (!flags.empty()) {
                                string flag;
-                               flags = support::split(flags, flag, ',');
+                               flags = split(flags, flag, ',');
                                if (flag == "document")
                                        flgs |= Format::document;
                                else if (flag == "vector")
                                        flgs |= Format::vector;
+                               else if (flag == "zipped=native")
+                                       flgs |= Format::zipped_native;
+                               else if (flag == "menu=export")
+                                       flgs |= Format::export_menu;
                                else
-                                       lyxerr << "Ignoring unknown flag `"
+                                       LYXERR0("Ignoring unknown flag `"
                                               << flag << "' for format `"
-                                              << format << "'." << endl;
+                                              << format << "'.");
                        }
-                       if (prettyname.empty()) {
-                               if (theConverters().formatIsUsed(format)) {
-                                       lyxerr << "Can't delete format "
-                                              << format << endl;
-                               } else {
+                       if (!ok)
+                               LYXERR0("Syntax error in format " << format);
+                       else if (prettyname.empty()) {
+                               if (theConverters().formatIsUsed(format))
+                                       LYXERR0("Can't delete format " << format);
+                               else
                                        formats.erase(format);
-                               }
                        } else {
-                               formats.add(format, extension, prettyname,
-                                           shortcut, viewer, editor, flgs);
+                               formats.add(format, extensions, prettyname,
+                                           shortcut, viewer, editor, mime, flgs);
                        }
                        break;
                }
-               case RC_DEFAULT_LANGUAGE:
-                       if (lexrc.next()) {
-                               default_language = lexrc.getString();
-                       }
+               case RC_VIEWER_ALTERNATIVES:  {
+                       string format, command;
+                       lexrc >> format;
+                       lexrc >> command;
+                       viewer_alternatives[format].insert(command);
+                       break;
+               }
+               case RC_EDITOR_ALTERNATIVES:  {
+                       string format, command;
+                       lexrc >> format;
+                       lexrc >> command;
+                       editor_alternatives[format].insert(command);
                        break;
+               }
 
-               case RC_LABEL_INIT_LENGTH:
-                       if (lexrc.next()) {
-                               label_init_length = lexrc.getInteger();
-                       }
+               case RC_DEFAULT_VIEW_FORMAT:
+                       lexrc >> default_view_format;
+                       break;
+
+               case RC_GUI_LANGUAGE:
+                       lexrc >> gui_language;
                        break;
 
                case RC_SHOW_BANNER:
-                       if (lexrc.next()) {
-                               show_banner = lexrc.getBool();
-                       }
+                       lexrc >> show_banner;
                        break;
 
                case RC_PREVIEW:
@@ -1127,65 +1178,129 @@ int LyXRC::read(Lexer & lexrc)
                                else {
                                        preview = PREVIEW_OFF;
                                        if (tmp != "false" && tmp != "off")
-                                               lyxerr << "Unrecognized "
-                                                       "preview status \""
-                                                      << tmp << '\n' << endl;
+                                               LYXERR0("Unrecognized preview status \""
+                                                      << tmp << '\n');
                                }
                        }
                        break;
 
                case RC_PREVIEW_HASHED_LABELS:
-                       if (lexrc.next()) {
-                               preview_hashed_labels = lexrc.getBool();
-                       }
+                       lexrc >> preview_hashed_labels;
                        break;
 
                case RC_PREVIEW_SCALE_FACTOR:
-                       if (lexrc.next()) {
-                               preview_scale_factor = lexrc.getString();
-                       }
+                       lexrc >> preview_scale_factor;
                        break;
 
                case RC_USER_NAME:
-                       if (lexrc.next())
-                               user_name = lexrc.getString();
+                       lexrc >> user_name;
                        break;
-
                case RC_USER_EMAIL:
-                       if (lexrc.next())
-                               user_email = lexrc.getString();
+                       lexrc >> user_email;
                        break;
 
                case RC_PATH_PREFIX:
-                       if (lexrc.next())
-                               path_prefix = lexrc.getString();
+                       lexrc >> path_prefix;
                        break;
 
                case RC_USE_CONVERTER_CACHE:
-                       if (lexrc.next())
-                               use_converter_cache = lexrc.getBool();
+                       lexrc >> use_converter_cache;
                        break;
-
                case RC_CONVERTER_CACHE_MAXAGE:
-                       if (lexrc.next())
-                               converter_cache_maxage =
-                                       convert<unsigned int>(lexrc.getString());
+                       lexrc >> converter_cache_maxage;
                        break;
 
                case RC_SORT_LAYOUTS:
-                       if (lexrc.next())
-                               sort_layouts = lexrc.getBool();
+                       lexrc >> sort_layouts;
+                       break;
+               case RC_GROUP_LAYOUTS:
+                       lexrc >> group_layouts;
+                       break;
+               case RC_FULL_SCREEN_LIMIT:
+                       lexrc >> full_screen_limit;
+                       break;
+               case RC_FULL_SCREEN_TOOLBARS:
+                       lexrc >> full_screen_toolbars;
+                       break;
+               case RC_FULL_SCREEN_SCROLLBAR:
+                       lexrc >> full_screen_scrollbar;
+                       break;
+               case RC_FULL_SCREEN_TABBAR:
+                       lexrc >> full_screen_tabbar;
+                       break;
+               case RC_FULL_SCREEN_MENUBAR:
+                       lexrc >> full_screen_menubar;
+                       break;
+               case RC_FULL_SCREEN_WIDTH:
+                       lexrc >> full_screen_width;
+                       break;
+               case RC_OPEN_BUFFERS_IN_TABS:
+                       lexrc >> open_buffers_in_tabs;
+                       break;
+               case RC_SINGLE_CLOSE_TAB_BUTTON:
+                       lexrc >> single_close_tab_button;
+                       break;
+               case RC_SINGLE_INSTANCE:
+                       lexrc >> single_instance;
+                       if (run_mode == PREFERRED)
+                               run_mode = single_instance ? USE_REMOTE : NEW_INSTANCE;
+                       break;
+               case RC_FORWARD_SEARCH_DVI:
+                       if (lexrc.next(true))
+                               forward_search_dvi = lexrc.getString();
+                       break;
+               case RC_FORWARD_SEARCH_PDF:
+                       if (lexrc.next(true))
+                               forward_search_pdf = lexrc.getString();
+                       break;
+               case RC_EXPORT_OVERWRITE:
+                       if (lexrc.next()) {
+                               string const tmp = lexrc.getString();
+                               if (tmp == "all" || tmp == "true")
+                                       export_overwrite = ALL_FILES;
+                               else if (tmp == "main")
+                                       export_overwrite = MAIN_FILE;
+                               else {
+                                       export_overwrite = NO_FILES;
+                                       if (tmp != "ask" && tmp != "false")
+                                               LYXERR0("Unrecognized export_overwrite status \""
+                                                      << tmp << '"');
+                               }
+                       }
+                       break;
+               case RC_SCROLL_WHEEL_ZOOM:
+                       if (lexrc.next()) {
+                               string const tmp = lexrc.getString();
+                               if (tmp == "ctrl")
+                                       scroll_wheel_zoom = SCROLL_WHEEL_ZOOM_CTRL;
+                               else if (tmp == "shift")
+                                       scroll_wheel_zoom = SCROLL_WHEEL_ZOOM_SHIFT;
+                               else if (tmp == "alt")
+                                       scroll_wheel_zoom = SCROLL_WHEEL_ZOOM_ALT;
+                               else {
+                                       scroll_wheel_zoom = SCROLL_WHEEL_ZOOM_OFF;
+                                       if (tmp != "off" && tmp != "false")
+                                               LYXERR0("Unrecognized scroll_wheel_zoom status \""
+                                                      << tmp << '"');
+                               }
+                       }
                        break;
 
-               case RC_LAST: break; // this is just a dummy
+               case RC_LAST:
+                       break; // this is just a dummy
                }
+
+               // This is triggered the first time through the loop unless
+               // we hit a format tag.
+               if (check_format && format != LYXRC_FILEFORMAT)
+                       return FormatMismatch;
        }
 
        /// Update converters data-structures
        theConverters().update(formats);
        theConverters().buildGraph();
 
-       return 0;
+       return ReadOK;
 }
 
 
@@ -1208,7 +1323,7 @@ void LyXRC::print() const
 
 class SameMover {
 public:
-       typedef std::pair<std::string, SpecialisedMover> Data;
+       typedef pair<string, SpecialisedMover> Data;
 
        SameMover(Data const & comparison)
                : comparison_(comparison) {}
@@ -1224,10 +1339,21 @@ private:
 };
 
 
+namespace {
+
+       // Escape \ and " so that LyXLex can read the string later
+       string escapeCommand(string const & str) {
+               return subst(subst(str , "\\", "\\\\"),
+                            "\"", "\\\"");
+       }
+
+}
+
+
 void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) const
 {
        LyXRCTags tag = RC_LAST;
-       
+
        if (!name.empty()) {
                for (int i = 0; i != lyxrcCount; ++i)
                        if ("\\" + name == lyxrcTags[i].tag)
@@ -1235,21 +1361,13 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
        }
 
        if (tag == RC_LAST)
-               os << "### This file is part of\n"
-                  << "### ========================================================\n"
-                  << "###          LyX, The Document Processor\n"
-                  << "###\n"
-                  << "###          Copyright 1995 Matthias Ettrich\n"
-                  << "###          Copyright 1995-2007 The LyX Team.\n"
-                  << "###\n"
-                  << "### ========================================================\n"
-                  << "\n"
-                  << "# This file is written by LyX, if you want to make your own\n"
-                  << "# modifications you should do them from inside LyX and save\n"
-                  << "\n";
+               os << "# LyX " << lyx_version
+                  << " generated this file. If you want to make your own\n"
+                  << "# modifications you should do them from inside LyX and save.\n\n"
+                  << "Format " << LYXRC_FILEFORMAT << "\n\n";
 
        // Why the switch you might ask. It is a trick to ensure that all
-       // the elements in the LyXRCTags enum is handled. As you can see
+       // the elements in the LyXRCTags enum are handled. As you can see
        // there are no breaks at all. So it is just a huge fall-through.
        // The nice thing is that we will get a warning from the compiler
        // if we forget an element.
@@ -1257,6 +1375,7 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
        case RC_LAST:
        case RC_INPUT:
                // input/include files are not done here
+       case RC_LYXRCFORMAT:
        case RC_BINDFILE:
                if (ignore_system_lyxrc ||
                    bind_file != system_lyxrc.bind_file) {
@@ -1331,10 +1450,9 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                if (ignore_system_lyxrc ||
                    display_graphics != system_lyxrc.display_graphics) {
                        os << "# Display graphics within LyX\n"
-                          << "# monochrome|grayscale|color|none\n"
+                          << "# true|false\n"
                           << "\\display_graphics "
-                          << graphics::displayTranslator().find(
-                                graphics::DisplayType(display_graphics))
+                          << (display_graphics ? "true" : "false")
                           << '\n';
                }
                if (tag != RC_LAST)
@@ -1347,6 +1465,14 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
+       case RC_GROUP_LAYOUTS:
+               if (ignore_system_lyxrc ||
+                   group_layouts != system_lyxrc.group_layouts) {
+                       os << "# Group layouts by their category.\n"
+                          << "\\group_layouts " << convert<string>(group_layouts) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
        case RC_VIEWDVI_PAPEROPTION:
                if (ignore_system_lyxrc ||
                    view_dvi_paper_option
@@ -1358,60 +1484,83 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_DEFAULT_PAPERSIZE:
-               if (ignore_system_lyxrc ||
-                   default_papersize != system_lyxrc.default_papersize) {
-                       os << "# The default papersize to use.\n"
-                          << "\\default_papersize \"";
-                       switch (default_papersize) {
-                       case PAPER_DEFAULT:
-                               os << "default"; break;
-                       case PAPER_USLETTER:
-                               os << "usletter"; break;
-                       case PAPER_USLEGAL:
-                               os << "legal"; break;
-                       case PAPER_USEXECUTIVE:
-                               os << "executive"; break;
-                       case PAPER_A3:
-                               os << "a3"; break;
-                       case PAPER_A4:
-                               os << "a4"; break;
-                       case PAPER_A5:
-                               os << "a5"; break;
-                       case PAPER_B5:
-                               os << "b5"; break;
-                       case PAPER_CUSTOM:
-                       case PAPER_B3:
-                       case PAPER_B4: break;
-                       }
-                       os << "\"\n";
-               }
-               if (tag != RC_LAST)
-                       break;
        case RC_CHKTEX_COMMAND:
                if (ignore_system_lyxrc ||
                    chktex_command != system_lyxrc.chktex_command) {
-                       os << "\\chktex_command \"" << chktex_command << "\"\n";
+                       os << "\\chktex_command \"" << escapeCommand(chktex_command) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_BIBTEX_ALTERNATIVES: {
+               CommandSet::const_iterator it = bibtex_alternatives.begin();
+               CommandSet::const_iterator end = bibtex_alternatives.end();
+               for ( ; it != end; ++it) {
+                       if (ignore_system_lyxrc
+                           || !system_lyxrc.bibtex_alternatives.count(*it))
+                               os << "\\bibtex_alternatives \""
+                                  << *it << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
+       }
        case RC_BIBTEX_COMMAND:
                if (ignore_system_lyxrc ||
                    bibtex_command != system_lyxrc.bibtex_command) {
-                       os << "\\bibtex_command \"" << bibtex_command << "\"\n";
+                       os << "\\bibtex_command \"" << escapeCommand(bibtex_command) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_JBIBTEX_COMMAND:
+               if (ignore_system_lyxrc ||
+                   jbibtex_command != system_lyxrc.jbibtex_command) {
+                       os << "\\jbibtex_command \"" << escapeCommand(jbibtex_command) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_INDEX_ALTERNATIVES: {
+               CommandSet::const_iterator it = index_alternatives.begin();
+               CommandSet::const_iterator end = index_alternatives.end();
+               for ( ; it != end; ++it) {
+                       if (ignore_system_lyxrc
+                           || !system_lyxrc.index_alternatives.count(*it))
+                               os << "\\index_alternatives \""
+                                  << *it << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
+       }
        case RC_INDEX_COMMAND:
                if (ignore_system_lyxrc ||
                    index_command != system_lyxrc.index_command) {
-                       os << "\\index_command \"" << index_command << "\"\n";
+                       os << "\\index_command \"" << escapeCommand(index_command) << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
-       case RC_TEX_EXPECTS_WINDOWS_PATHS:
+       case RC_JINDEX_COMMAND:
+               if (ignore_system_lyxrc ||
+                   jindex_command != system_lyxrc.jindex_command) {
+                       os << "\\jindex_command \"" << escapeCommand(jindex_command) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_SPLITINDEX_COMMAND:
                if (ignore_system_lyxrc ||
-                   windows_style_tex_paths != system_lyxrc.windows_style_tex_paths) {
+                   splitindex_command != system_lyxrc.splitindex_command) {
+                       os << "\\splitindex_command \"" << escapeCommand(splitindex_command) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_NOMENCL_COMMAND:
+               if (ignore_system_lyxrc ||
+                   nomencl_command != system_lyxrc.nomencl_command) {
+                       os << "\\nomencl_command \"" << escapeCommand(nomencl_command) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_TEX_EXPECTS_WINDOWS_PATHS:
+               // Don't write this setting to the preferences file,
+               // but allow temporary changes (bug 7557).
+               if (ignore_system_lyxrc) {
                        os << "\\tex_expects_windows_paths "
                           << convert<string>(windows_style_tex_paths) << '\n';
                }
@@ -1463,14 +1612,6 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_LABEL_INIT_LENGTH:
-               if (ignore_system_lyxrc ||
-                   label_init_length != system_lyxrc.label_init_length) {
-                       os << "\\label_init_length " << label_init_length
-                          << '\n';
-               }
-               if (tag != RC_LAST)
-                       break;
 
        case RC_USER_NAME:
                os << "\\user_name \"" << user_name << "\"\n";
@@ -1551,6 +1692,15 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                   << "# SCREEN & FONTS SECTION ############################\n"
                   << "#\n\n";
 
+       case RC_ICON_SET:
+               if (ignore_system_lyxrc ||
+                   icon_set != system_lyxrc.icon_set) {
+                       os << "\\icon_set \"" << icon_set
+                          << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+
        case RC_SCREEN_DPI:
                if (ignore_system_lyxrc ||
                    dpi != system_lyxrc.dpi) {
@@ -1582,6 +1732,64 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
+       case RC_CURSOR_WIDTH:
+               if (ignore_system_lyxrc ||
+                       cursor_width
+                       != system_lyxrc.cursor_width) {
+                       os << "\\cursor_width "
+                       << cursor_width << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_SCROLL_BELOW_DOCUMENT:
+               if (ignore_system_lyxrc ||
+                   scroll_below_document
+                   != system_lyxrc.scroll_below_document) {
+                       os << "\\scroll_below_document "
+                          << convert<string>(scroll_below_document) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_PARAGRAPH_MARKERS:
+               if (ignore_system_lyxrc ||
+                       paragraph_markers
+                   != system_lyxrc.paragraph_markers) {
+                       os << "\\paragraph_markers "
+                          << convert<string>(paragraph_markers) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_MAC_DONTSWAP_CTRL_META:
+               if (ignore_system_lyxrc ||
+                   mac_dontswap_ctrl_meta
+                   != system_lyxrc.mac_dontswap_ctrl_meta) {
+                       os << "\\mac_dontswap_ctrl_meta "
+                          << convert<string>(mac_dontswap_ctrl_meta) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_MAC_LIKE_WORD_MOVEMENT:
+               if (ignore_system_lyxrc ||
+                   mac_like_word_movement
+                   != system_lyxrc.mac_like_word_movement) {
+                       os << "\\mac_like_word_movement "
+                          << convert<string>(mac_like_word_movement) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_MACRO_EDIT_STYLE:
+               if (ignore_system_lyxrc ||
+                   macro_edit_style
+                   != system_lyxrc.macro_edit_style) {
+                       os << "\\macro_edit_style ";
+                       switch (macro_edit_style) {
+                       case MACRO_EDIT_INLINE_BOX: os << "0\n"; break;
+                       case MACRO_EDIT_INLINE: os << "1\n"; break;
+                       case MACRO_EDIT_LIST: os << "2\n"; break;
+                       }
+               }
+               if (tag != RC_LAST)
+                       break;
        case RC_DIALOGS_ICONIFY_WITH_MAIN:
                if (ignore_system_lyxrc ||
                    dialogs_iconify_with_main
@@ -1688,18 +1896,112 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
+       case RC_FULL_SCREEN_LIMIT:
+               if (ignore_system_lyxrc ||
+                   full_screen_limit != system_lyxrc.full_screen_limit) {
+                       os << "\\fullscreen_limit "
+                          << convert<string>(full_screen_limit)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FULL_SCREEN_TOOLBARS:
+               if (ignore_system_lyxrc ||
+                   full_screen_toolbars != system_lyxrc.full_screen_toolbars) {
+                       os << "\\fullscreen_toolbars "
+                          << convert<string>(full_screen_toolbars)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FULL_SCREEN_SCROLLBAR:
+               if (ignore_system_lyxrc ||
+                   full_screen_scrollbar != system_lyxrc.full_screen_scrollbar) {
+                       os << "\\fullscreen_scrollbar "
+                          << convert<string>(full_screen_scrollbar)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FULL_SCREEN_TABBAR:
+               if (ignore_system_lyxrc ||
+                   full_screen_tabbar != system_lyxrc.full_screen_tabbar) {
+                       os << "\\fullscreen_tabbar "
+                          << convert<string>(full_screen_tabbar)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FULL_SCREEN_MENUBAR:
+               if (ignore_system_lyxrc ||
+                   full_screen_menubar != system_lyxrc.full_screen_menubar) {
+                       os << "\\fullscreen_menubar "
+                          << convert<string>(full_screen_menubar)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FULL_SCREEN_WIDTH:
+               if (ignore_system_lyxrc ||
+                   full_screen_width != system_lyxrc.full_screen_width) {
+                       os << "\\fullscreen_width "
+                          << convert<string>(full_screen_width)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_OPEN_BUFFERS_IN_TABS:
+               if (ignore_system_lyxrc ||
+                   open_buffers_in_tabs != system_lyxrc.open_buffers_in_tabs) {
+                       os << "\\open_buffers_in_tabs "
+                          << convert<string>(open_buffers_in_tabs)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_SINGLE_CLOSE_TAB_BUTTON:
+               if (ignore_system_lyxrc ||
+                   single_close_tab_button != system_lyxrc.single_close_tab_button) {
+                       os << "\\single_close_tab_button "
+                          << convert<string>(single_close_tab_button)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_SINGLE_INSTANCE:
+               if (ignore_system_lyxrc ||
+                   single_instance != system_lyxrc.single_instance) {
+                       os << "\\single_instance "
+                          << convert<string>(single_instance)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FORWARD_SEARCH_DVI:
+               if (ignore_system_lyxrc ||
+                   forward_search_dvi != system_lyxrc.forward_search_dvi) {
+                       os << "\\forward_search_dvi \"" << escapeCommand(forward_search_dvi) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_FORWARD_SEARCH_PDF:
+               if (ignore_system_lyxrc ||
+                   forward_search_pdf != system_lyxrc.forward_search_pdf) {
+                       os << "\\forward_search_pdf \"" << escapeCommand(forward_search_pdf) << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
 
-               os << "\n#\n"
-                  << "# COLOR SECTION ###################################\n"
-                  << "#\n\n";
+       os << "\n#\n"
+                       << "# COLOR SECTION ###################################\n"
+                       << "#\n\n";
 
        case RC_SET_COLOR:
                for (int i = 0; i < Color_ignore; ++i) {
                        ColorCode lc = static_cast<ColorCode>(i);
-
-                       string const col(lcolor.getX11Name(lc));
-                       if (ignore_system_lyxrc ||
-                           col != system_lcolor.getX11Name(lc)) {
+                       string const col = lcolor.getX11Name(lc);
+                       if (ignore_system_lyxrc
+                           || col != system_lcolor.getX11Name(lc)) {
                                os << "\\set_color \""
                                   << lcolor.getLyXName(lc) << "\" \""
                                   << col << "\"\n";
@@ -1731,7 +2033,7 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
        case RC_PRINT_COMMAND:
                if (ignore_system_lyxrc ||
                    print_command != system_lyxrc.print_command) {
-                       os << "\\print_command \"" << print_command << "\"\n";
+                       os << "\\print_command \"" << escapeCommand(print_command) << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
@@ -1746,7 +2048,7 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
        case RC_PRINTSPOOL_COMMAND:
                if (ignore_system_lyxrc ||
                    print_spool_command != system_lyxrc.print_spool_command) {
-                       os << "\\print_spool_command \"" << print_spool_command
+                       os << "\\print_spool_command \"" << escapeCommand(print_spool_command)
                           << "\"\n";
                }
                if (tag != RC_LAST)
@@ -1862,37 +2164,29 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                        break;
 
                os << "\n#\n"
-                  << "# EXPORT SECTION ####################################\n"
+                  << "# TEX SECTION #######################################\n"
                   << "#\n\n";
 
-       case RC_CUSTOM_EXPORT_COMMAND:
+       case RC_TEXINPUTS_PREFIX:
                if (ignore_system_lyxrc ||
-                   custom_export_command
-                   != system_lyxrc.custom_export_command) {
-                       os << "\\custom_export_command \""
-                          << custom_export_command
-                          << "\"\n";
+                   texinputs_prefix != system_lyxrc.texinputs_prefix) {
+                       os << "\\texinputs_prefix \"" << texinputs_prefix << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
-       case RC_CUSTOM_EXPORT_FORMAT:
+
+       case RC_FONT_ENCODING:
                if (ignore_system_lyxrc ||
-                   custom_export_format
-                   != system_lyxrc.custom_export_format) {
-                       os << "\\custom_export_format \"" << custom_export_format
-                          << "\"\n";
+                   fontenc != system_lyxrc.fontenc) {
+                       os << "\\font_encoding \"" << fontenc << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
 
-               os << "\n#\n"
-                  << "# TEX SECTION #######################################\n"
-                  << "#\n\n";
-
-       case RC_FONT_ENCODING:
+       case RC_FORCE_PAINT_SINGLE_CHAR:
                if (ignore_system_lyxrc ||
-                   fontenc != system_lyxrc.fontenc) {
-                       os << "\\font_encoding \"" << fontenc << "\"\n";
+                   force_paint_single_char != system_lyxrc.force_paint_single_char) {
+                       os << "\\force_paint_single_char \"" << force_paint_single_char << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
@@ -1925,7 +2219,102 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_NUMLASTFILES:
+       case RC_MOUSE_WHEEL_SPEED:
+               if (ignore_system_lyxrc ||
+                   mouse_wheel_speed != system_lyxrc.mouse_wheel_speed) {
+                       os << "\\mouse_wheel_speed " << mouse_wheel_speed << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_INLINE_DELAY:
+               if (ignore_system_lyxrc ||
+                   completion_inline_delay != system_lyxrc.completion_inline_delay) {
+                       os << "\\completion_inline_delay " << completion_inline_delay << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_INLINE_MATH:
+               if (ignore_system_lyxrc ||
+                   completion_inline_math != system_lyxrc.completion_inline_math) {
+                       os << "\\completion_inline_math "
+                               << convert<string>(completion_inline_math) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_INLINE_TEXT:
+               if (ignore_system_lyxrc ||
+                   completion_inline_text != system_lyxrc.completion_inline_text) {
+                       os << "\\completion_inline_text "
+                               << convert<string>(completion_inline_text) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_INLINE_DOTS:
+               if (ignore_system_lyxrc ||
+                   completion_inline_dots != system_lyxrc.completion_inline_dots) {
+                       os << "\\completion_inline_dots "
+                               << convert<string>(completion_inline_dots) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_AUTOCORRECTION_MATH:
+               if (ignore_system_lyxrc ||
+                   autocorrection_math != system_lyxrc.autocorrection_math) {
+                       os << "\\autocorrection_math "
+                               << convert<string>(autocorrection_math) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_POPUP_DELAY:
+               if (ignore_system_lyxrc ||
+                   completion_popup_delay != system_lyxrc.completion_popup_delay) {
+                       os << "\\completion_popup_delay " << completion_popup_delay << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_POPUP_MATH:
+               if (ignore_system_lyxrc ||
+                   completion_popup_math != system_lyxrc.completion_popup_math) {
+                       os << "\\completion_popup_math "
+                               << convert<string>(completion_popup_math) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_POPUP_TEXT:
+               if (ignore_system_lyxrc ||
+                   completion_popup_text != system_lyxrc.completion_popup_text) {
+                       os << "\\completion_popup_text "
+                               << convert<string>(completion_popup_text) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_CURSOR_TEXT:
+               if (ignore_system_lyxrc ||
+                   completion_cursor_text != system_lyxrc.completion_cursor_text) {
+                       os << "\\completion_cursor_text "
+                          << convert<string>(completion_cursor_text) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_POPUP_AFTER_COMPLETE:
+               if (ignore_system_lyxrc ||
+                   completion_popup_after_complete
+                   != system_lyxrc.completion_popup_after_complete) {
+                       os << "\\completion_popup_after_complete "
+                               << convert<string>(completion_popup_after_complete) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_COMPLETION_MINLENGTH:
+               if (ignore_system_lyxrc ||
+                       completion_minlength != system_lyxrc.completion_minlength) {
+                       os << "\\completion_minlength " << convert<string>(completion_minlength)
+                       << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+                       
+               case RC_NUMLASTFILES:
                if (ignore_system_lyxrc ||
                    num_lastfiles != system_lyxrc.num_lastfiles) {
                        os << "\\num_lastfiles " << num_lastfiles << '\n';
@@ -1964,10 +2353,22 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_USETEMPDIR:
+       case RC_THESAURUSDIRPATH:
+               if (ignore_system_lyxrc ||
+                   thesaurusdir_path != system_lyxrc.thesaurusdir_path) {
+                       string const path = os::external_path(thesaurusdir_path);
+                       os << "\\thesaurusdir_path \"" << path << "\"\n";
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_HUNSPELLDIR_PATH:
+               if (ignore_system_lyxrc ||
+                   hunspelldir_path != system_lyxrc.hunspelldir_path) {
+                       string const path = os::external_path(hunspelldir_path);
+                       os << "\\hunspelldir_path \"" << path << "\"\n";
+               }
                if (tag != RC_LAST)
                        break;
-               // Ignore it
        case RC_PLAINTEXT_LINELEN:
                if (ignore_system_lyxrc ||
                    plaintext_linelen != system_lyxrc.plaintext_linelen) {
@@ -1982,6 +2383,13 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
+       case RC_SAVE_COMPRESSED:
+               if (ignore_system_lyxrc ||
+                   save_compressed != system_lyxrc.save_compressed) {
+                       os << "\\save_compressed " << convert<string>(save_compressed) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
        case RC_BACKUPDIR_PATH:
                if (ignore_system_lyxrc ||
                    backupdir_path != system_lyxrc.backupdir_path) {
@@ -1995,108 +2403,117 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                   << "# PLAIN TEXT EXPORT SECTION ##############################\n"
                   << "#\n\n";
 
-       case RC_PLAINTEXT_ROFF_COMMAND:
+               os << "\n#\n"
+                  << "# SPELLCHECKER SECTION ##############################\n"
+                  << "#\n\n";
+
+       case RC_ACCEPT_COMPOUND:
                if (ignore_system_lyxrc ||
-                   plaintext_roff_command != system_lyxrc.plaintext_roff_command) {
-                       os << "\\plaintext_roff_command \"" << plaintext_roff_command
-                          << "\"\n";
+                   spellchecker_accept_compound != system_lyxrc.spellchecker_accept_compound) {
+                       os << "\\accept_compound " << convert<string>(spellchecker_accept_compound)
+                          << '\n';
                }
                if (tag != RC_LAST)
                        break;
-
-               os << "\n#\n"
-                  << "# SPELLCHECKER SECTION ##############################\n"
-                  << "#\n\n";
-       case RC_USE_SPELL_LIB:
+       case RC_ALT_LANG:
                if (ignore_system_lyxrc ||
-                   use_spell_lib != system_lyxrc.use_spell_lib) {
-                       os << "\\use_spell_lib " << convert<string>(use_spell_lib) << '\n';
+                   spellchecker_alt_lang != system_lyxrc.spellchecker_alt_lang) {
+                       os << "\\alternate_language \"" << spellchecker_alt_lang
+                          << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
-       case RC_SPELL_COMMAND:
+       case RC_ESC_CHARS:
                if (ignore_system_lyxrc ||
-                   isp_command != system_lyxrc.isp_command) {
-                       os << "\\spell_command \"" << isp_command << "\"\n";
+                   spellchecker_esc_chars != system_lyxrc.spellchecker_esc_chars) {
+                       os << "\\escape_chars \"" << spellchecker_esc_chars << "\"\n";
                }
                if (tag != RC_LAST)
                        break;
-       case RC_ACCEPT_COMPOUND:
+       case RC_USE_SYSTEM_COLORS:
                if (ignore_system_lyxrc ||
-                   isp_accept_compound != system_lyxrc.isp_accept_compound) {
-                       os << "\\accept_compound " << convert<string>(isp_accept_compound)
+                   use_system_colors != system_lyxrc.use_system_colors) {
+                       os << "\\use_system_colors "
+                          << convert<string>(use_system_colors)
                           << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_USE_ALT_LANG:
+       case RC_USE_TOOLTIP:
                if (ignore_system_lyxrc ||
-                   isp_use_alt_lang != system_lyxrc.isp_use_alt_lang) {
-                       os << "\\use_alt_language " << convert<string>(isp_use_alt_lang)
+                   use_tooltip != system_lyxrc.use_tooltip) {
+                       os << "\\use_tooltip "
+                          << convert<string>(use_tooltip)
                           << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_ALT_LANG:
+       case RC_USE_PIXMAP_CACHE:
                if (ignore_system_lyxrc ||
-                   isp_alt_lang != system_lyxrc.isp_alt_lang) {
-                       os << "\\alternate_language \"" << isp_alt_lang
-                          << "\"\n";
+                   use_pixmap_cache != system_lyxrc.use_pixmap_cache) {
+                       os << "\\use_pixmap_cache "
+                          << convert<string>(use_pixmap_cache)
+                          << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_USE_ESC_CHARS:
+       case RC_USE_QIMAGE:
                if (ignore_system_lyxrc ||
-                   isp_use_esc_chars != system_lyxrc.isp_use_esc_chars) {
-                       os << "\\use_escape_chars " << convert<string>(isp_use_esc_chars)
+                   use_qimage != system_lyxrc.use_qimage) {
+                       os << "\\use_qimage "
+                          << convert<string>(use_qimage)
                           << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_ESC_CHARS:
+
+               os << "\n#\n"
+                  << "# LANGUAGE SUPPORT SECTION ##########################\n"
+                  << "#\n\n";
+               if (tag != RC_LAST)
+                       break;
+
+       case RC_DEFAULT_DECIMAL_POINT:
                if (ignore_system_lyxrc ||
-                   isp_esc_chars != system_lyxrc.isp_esc_chars) {
-                       os << "\\escape_chars \"" << isp_esc_chars << "\"\n";
+                   default_decimal_point != system_lyxrc.default_decimal_point) {
+                       os << "\\default_decimal_point " << default_decimal_point << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_USE_PERS_DICT:
+
+       case RC_DEFAULT_LENGTH_UNIT:
                if (ignore_system_lyxrc ||
-                   isp_use_pers_dict != system_lyxrc.isp_use_pers_dict) {
-                       os << "\\use_personal_dictionary "
-                          << convert<string>(isp_use_pers_dict)
-                          << '\n';
+                   default_length_unit != system_lyxrc.default_length_unit) {
+                       os << "\\default_length_unit " << int(default_length_unit) << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_USE_PIXMAP_CACHE:
+
+       case RC_SPELLCHECKER:
                if (ignore_system_lyxrc ||
-                   use_pixmap_cache != system_lyxrc.use_pixmap_cache) {
-                       os << "\\use_pixmap_cache "
-                          << convert<string>(use_pixmap_cache)
-                          << '\n';
-               }
-       case RC_PERS_DICT:
-               if (isp_pers_dict != system_lyxrc.isp_pers_dict) {
-                       string const path = os::external_path(isp_pers_dict);
-                       os << "\\personal_dictionary \"" << path << "\"\n";
+                   spellchecker != system_lyxrc.spellchecker) {
+                       os << "\\spellchecker " << spellchecker << '\n';
                }
                if (tag != RC_LAST)
                        break;
-       case RC_USE_INP_ENC:
+
+       case RC_SPELLCHECK_CONTINUOUSLY:
                if (ignore_system_lyxrc ||
-                   isp_use_input_encoding
-                   != system_lyxrc.isp_use_input_encoding) {
-                       os << "\\use_input_encoding "
-                          << convert<string>(isp_use_input_encoding)
+                   spellcheck_continuously != system_lyxrc.spellcheck_continuously) {
+                       os << "\\spellcheck_continuously " << convert<string>(spellcheck_continuously)
                           << '\n';
                }
                if (tag != RC_LAST)
                        break;
 
-               os << "\n#\n"
-                  << "# LANGUAGE SUPPORT SECTION ##########################\n"
-                  << "#\n\n";
+       case RC_SPELLCHECK_NOTES:
+               if (ignore_system_lyxrc ||
+                   spellcheck_notes != system_lyxrc.spellcheck_notes) {
+                       os << "\\spellcheck_notes " << convert<string>(spellcheck_notes)
+                          << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
 
        case RC_RTL_SUPPORT:
                if (ignore_system_lyxrc ||
@@ -2105,10 +2522,25 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_LANGUAGE_PACKAGE:
+       case RC_VISUAL_CURSOR:
+               if (ignore_system_lyxrc ||
+                       visual_cursor != system_lyxrc.visual_cursor) {
+                       os << "\\visual_cursor " << convert<string>(visual_cursor) << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_CLOSE_BUFFER_WITH_LAST_VIEW:
+               if (ignore_system_lyxrc ||
+                       close_buffer_with_last_view != system_lyxrc.close_buffer_with_last_view) {
+                       os << "# When closing last view, buffer closes (yes), hides (no), or ask the user (ask)\n";
+                       os << "\\close_buffer_with_last_view " << close_buffer_with_last_view << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_LANGUAGE_CUSTOM_PACKAGE:
                if (ignore_system_lyxrc ||
-                   language_package != system_lyxrc.language_package) {
-                       os << "\\language_package \"" << language_package
+                   language_custom_package != system_lyxrc.language_custom_package) {
+                       os << "\\language_custom_package \"" << language_custom_package
                           << "\"\n";
                }
                if (tag != RC_LAST)
@@ -2123,12 +2555,24 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_LANGUAGE_USE_BABEL:
+       case RC_LANGUAGE_PACKAGE_SELECTION:
                if (ignore_system_lyxrc ||
-                   language_use_babel != system_lyxrc.language_use_babel) {
-                       os << "\\language_use_babel \""
-                          << convert<string>(language_use_babel)
-                          << "\"\n";
+                   language_package_selection != system_lyxrc.language_package_selection) {
+                       os << "\\language_package_selection ";
+                       switch (language_package_selection) {
+                       case LP_AUTO:
+                               os << "0\n";
+                               break;
+                       case LP_BABEL:
+                               os << "1\n";
+                               break;
+                       case LP_CUSTOM:
+                               os << "2\n";
+                               break;
+                       case LP_NONE:
+                               os << "3\n";
+                               break;
+                       }
                }
                if (tag != RC_LAST)
                        break;
@@ -2198,10 +2642,52 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                }
                if (tag != RC_LAST)
                        break;
-       case RC_DEFAULT_LANGUAGE:
+       case RC_GUI_LANGUAGE:
+               if (ignore_system_lyxrc ||
+                   gui_language != system_lyxrc.gui_language) {
+                       os << "\\gui_language " << gui_language << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+       case RC_EXPORT_OVERWRITE:
+               if (ignore_system_lyxrc ||
+                   export_overwrite != system_lyxrc.export_overwrite) {
+                       string status;
+                       switch (export_overwrite) {
+                       case NO_FILES:
+                               status = "ask";
+                               break;
+                       case MAIN_FILE:
+                               status = "main";
+                               break;
+                       case ALL_FILES:
+                               status = "all";
+                               break;
+                       }
+                       os << "\\export_overwrite " << status << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+
+       case RC_SCROLL_WHEEL_ZOOM:
                if (ignore_system_lyxrc ||
-                   default_language != system_lyxrc.default_language) {
-                       os << "\\default_language " << default_language << '\n';
+                       scroll_wheel_zoom != system_lyxrc.scroll_wheel_zoom) {
+                       string status;
+                       switch (scroll_wheel_zoom) {
+                       case SCROLL_WHEEL_ZOOM_OFF:
+                               status = "off";
+                               break;
+                       case SCROLL_WHEEL_ZOOM_CTRL:
+                               status = "ctrl";
+                               break;
+                       case SCROLL_WHEEL_ZOOM_SHIFT:
+                               status = "shift";
+                               break;
+                       case SCROLL_WHEEL_ZOOM_ALT:
+                               status = "alt";
+                               break;
+                       }
+                       os << "\\scroll_wheel_zoom " << status << '\n';
                }
                if (tag != RC_LAST)
                        break;
@@ -2210,33 +2696,40 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                   << "# FORMATS SECTION ##########################\n"
                   << "#\n\n";
 
-       case RC_FORMAT:
+       case RC_FILEFORMAT:
                // New/modified formats
                for (Formats::const_iterator cit = formats.begin();
                     cit != formats.end(); ++cit) {
                        Format const * format =
                                system_formats.getFormat(cit->name());
                        if (!format ||
-                           format->extension() != cit->extension() ||
+                           format->extensions() != cit->extensions() ||
                            format->prettyname() != cit->prettyname() ||
                            format->shortcut() != cit->shortcut() ||
                            format->viewer() != cit->viewer() ||
                            format->editor() != cit->editor() ||
                            format->documentFormat() != cit->documentFormat() ||
-                           format->vectorFormat() != cit->vectorFormat()) {
+                           format->vectorFormat() != cit->vectorFormat() ||
+                           format->inExportMenu() != cit->inExportMenu() ||
+                           format->mime() != cit->mime()) {
                                os << "\\format \"" << cit->name() << "\" \""
-                                  << cit->extension() << "\" \""
+                                  << cit->extensions() << "\" \""
                                   << cit->prettyname() << "\" \""
                                   << cit->shortcut() << "\" \""
-                                  << cit->viewer() << "\" \""
-                                  << cit->editor() << "\" \"";
-                               std::vector<string> flags;
+                                  << escapeCommand(cit->viewer()) << "\" \""
+                                  << escapeCommand(cit->editor()) << "\" \"";
+                               vector<string> flags;
                                if (cit->documentFormat())
                                        flags.push_back("document");
                                if (cit->vectorFormat())
                                        flags.push_back("vector");
-                               os << support::getStringFromVector(flags);
-                               os << "\"\n";
+                               if (cit->zippedNative())
+                                       flags.push_back("zipped=native");
+                               if (cit->inExportMenu())
+                                       flags.push_back("menu=export");
+
+                               os << getStringFromVector(flags);
+                               os << "\" \"" << cit->mime() << "\"\n";
                        }
                }
 
@@ -2245,7 +2738,64 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                     cit != system_formats.end(); ++cit)
                        if (!formats.getFormat(cit->name()))
                                os << "\\format \"" << cit->name()
-                                  << "\" \"\" \"\" \"\" \"\" \"\" \"\"\n";
+                                  << "\" \"\" \"\" \"\" \"\" \"\" \"\" \"\"\n";
+               if (tag != RC_LAST)
+                       break;
+       case RC_VIEWER_ALTERNATIVES: {
+               Alternatives::const_iterator it = viewer_alternatives.begin();
+               Alternatives::const_iterator const en = viewer_alternatives.end();
+               Alternatives::const_iterator const sysend =
+                               system_lyxrc.viewer_alternatives.end();
+               for (; it != en; ++it) {
+                       string const & fmt = it->first;
+                       CommandSet const & cmd = it->second;
+                       CommandSet::const_iterator sit = cmd.begin();
+                       CommandSet::const_iterator const sen = cmd.end();
+                       Alternatives::const_iterator const sysfmt = ignore_system_lyxrc ?
+                                       system_lyxrc.viewer_alternatives.begin() : // we won't use it in this case
+                                       system_lyxrc.viewer_alternatives.find(fmt);
+                       for (; sit != sen; ++sit) {
+                               string const & cmd = *sit;
+                               if (ignore_system_lyxrc
+                                   || sysfmt == sysend               // format not found
+                                        || sysfmt->second.count(cmd) == 0 // this command not found
+                                  )
+                                       os << "\\viewer_alternatives " << fmt << " \"" << escapeCommand(cmd) << "\"\n";
+                       }
+               }
+               if (tag != RC_LAST)
+                       break;
+       }
+       case RC_EDITOR_ALTERNATIVES: {
+               Alternatives::const_iterator it = editor_alternatives.begin();
+               Alternatives::const_iterator const en = editor_alternatives.end();
+               Alternatives::const_iterator const sysend =
+                               system_lyxrc.editor_alternatives.end();
+               for (; it != en; ++it) {
+                       string const & fmt = it->first;
+                       CommandSet const & cmd = it->second;
+                       CommandSet::const_iterator sit = cmd.begin();
+                       CommandSet::const_iterator const sen = cmd.end();
+                       Alternatives::const_iterator const sysfmt = ignore_system_lyxrc ?
+                                       system_lyxrc.editor_alternatives.begin() : // we won't use it in this case
+                                       system_lyxrc.editor_alternatives.find(fmt);
+                       for (; sit != sen; ++sit) {
+                               string const & cmd = *sit;
+                               if (ignore_system_lyxrc
+                                   || sysfmt == sysend               // format not found
+                                   || sysfmt->second.count(cmd) == 0 // this command not found
+                                  )
+                                       os << "\\editor_alternatives " << fmt << " \"" << escapeCommand(cmd) << "\"\n";
+                       }
+               }
+               if (tag != RC_LAST)
+                       break;
+       }
+       case RC_DEFAULT_VIEW_FORMAT:
+               if (ignore_system_lyxrc ||
+                   default_view_format != system_lyxrc.default_view_format) {
+                       os << "\\default_view_format " << default_view_format << '\n';
+               }
                if (tag != RC_LAST)
                        break;
        case RC_VIEWER:
@@ -2269,7 +2819,7 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                            converter->flags != cit->flags)
                                os << "\\converter \"" << cit->from << "\" \""
                                   << cit->to << "\" \""
-                                  << cit->command << "\" \""
+                                  << escapeCommand(cit->command) << "\" \""
                                   << cit->flags << "\"\n";
                }
 
@@ -2296,14 +2846,14 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
 
                for (; it != end; ++it) {
                        Movers::const_iterator const sysit =
-                               std::find_if(sysbegin, sysend, SameMover(*it));
+                               find_if(sysbegin, sysend, SameMover(*it));
                        if (sysit == sysend) {
-                               std::string const & fmt = it->first;
-                               std::string const & command =
+                               string const & fmt = it->first;
+                               string const & command =
                                        it->second.command();
 
                                os << "\\copier " << fmt
-                                  << " \"" << command << "\"\n";
+                                  << " \"" << escapeCommand(command) << "\"\n";
                        }
                }
                if (tag != RC_LAST)
@@ -2318,6 +2868,187 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
 }
 
 
+void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
+{
+       // Why the switch you might ask. It is a trick to ensure that all
+       // the elements in the LyXRCTags enum is handled. As you can see
+       // there are no breaks at all. So it is just a huge fall-through.
+       // The nice thing is that we will get a warning from the compiler
+       // if we forget an element.
+       LyXRC::LyXRCTags tag = LyXRC::RC_LAST;
+       switch (tag) {
+       case LyXRC::RC_LAST:
+       case LyXRC::RC_ACCEPT_COMPOUND:
+               if (lyxrc_orig.spellchecker_accept_compound != lyxrc_new.spellchecker_accept_compound)
+                       if (theSpellChecker()) theSpellChecker()->advanceChangeNumber();
+       case LyXRC::RC_ALT_LANG:
+       case LyXRC::RC_PLAINTEXT_LINELEN:
+       case LyXRC::RC_AUTOCORRECTION_MATH:
+       case LyXRC::RC_AUTOREGIONDELETE:
+       case LyXRC::RC_AUTORESET_OPTIONS:
+       case LyXRC::RC_AUTOSAVE:
+       case LyXRC::RC_AUTO_NUMBER:
+       case LyXRC::RC_BACKUPDIR_PATH:
+       case LyXRC::RC_BIBTEX_ALTERNATIVES:
+       case LyXRC::RC_BIBTEX_COMMAND:
+       case LyXRC::RC_BINDFILE:
+       case LyXRC::RC_CHECKLASTFILES:
+       case LyXRC::RC_COMPLETION_CURSOR_TEXT:
+       case LyXRC::RC_COMPLETION_INLINE_DELAY:
+       case LyXRC::RC_COMPLETION_INLINE_DOTS:
+       case LyXRC::RC_COMPLETION_INLINE_MATH:
+       case LyXRC::RC_COMPLETION_INLINE_TEXT:
+       case LyXRC::RC_COMPLETION_POPUP_AFTER_COMPLETE:
+       case LyXRC::RC_COMPLETION_POPUP_DELAY:
+       case LyXRC::RC_COMPLETION_POPUP_MATH:
+       case LyXRC::RC_COMPLETION_POPUP_TEXT:
+       case LyXRC::RC_COMPLETION_MINLENGTH:
+       case LyXRC::RC_USELASTFILEPOS:
+       case LyXRC::RC_LOADSESSION:
+       case LyXRC::RC_CHKTEX_COMMAND:
+       case LyXRC::RC_CONVERTER:
+       case LyXRC::RC_CONVERTER_CACHE_MAXAGE:
+       case LyXRC::RC_COPIER:
+       case LyXRC::RC_CURSOR_FOLLOWS_SCROLLBAR:
+       case LyXRC::RC_SCROLL_BELOW_DOCUMENT:
+       case LyXRC::RC_DATE_INSERT_FORMAT:
+       case LyXRC::RC_GUI_LANGUAGE:
+       case LyXRC::RC_DEFAULT_VIEW_FORMAT:
+       case LyXRC::RC_DEFFILE:
+       case LyXRC::RC_DIALOGS_ICONIFY_WITH_MAIN:
+       case LyXRC::RC_DISPLAY_GRAPHICS:
+       case LyXRC::RC_DOCUMENTPATH:
+               if (lyxrc_orig.document_path != lyxrc_new.document_path) {
+                       FileName path(lyxrc_new.document_path);
+                       if (path.exists() && path.isDirectory())
+                               package().document_dir() = FileName(lyxrc.document_path);
+               }
+       case LyXRC::RC_EDITOR_ALTERNATIVES:
+       case LyXRC::RC_ESC_CHARS:
+       case LyXRC::RC_EXAMPLEPATH:
+       case LyXRC::RC_FONT_ENCODING:
+       case LyXRC::RC_FORCE_PAINT_SINGLE_CHAR:
+       case LyXRC::RC_FILEFORMAT:
+       case LyXRC::RC_GROUP_LAYOUTS:
+       case LyXRC::RC_HUNSPELLDIR_PATH:
+       case LyXRC::RC_ICON_SET:
+       case LyXRC::RC_INDEX_ALTERNATIVES:
+       case LyXRC::RC_INDEX_COMMAND:
+       case LyXRC::RC_JBIBTEX_COMMAND:
+       case LyXRC::RC_JINDEX_COMMAND:
+       case LyXRC::RC_NOMENCL_COMMAND:
+       case LyXRC::RC_INPUT:
+       case LyXRC::RC_KBMAP:
+       case LyXRC::RC_KBMAP_PRIMARY:
+       case LyXRC::RC_KBMAP_SECONDARY:
+       case LyXRC::RC_LANGUAGE_AUTO_BEGIN:
+       case LyXRC::RC_LANGUAGE_AUTO_END:
+       case LyXRC::RC_LANGUAGE_COMMAND_BEGIN:
+       case LyXRC::RC_LANGUAGE_COMMAND_END:
+       case LyXRC::RC_LANGUAGE_COMMAND_LOCAL:
+       case LyXRC::RC_LANGUAGE_GLOBAL_OPTIONS:
+       case LyXRC::RC_LANGUAGE_CUSTOM_PACKAGE:
+       case LyXRC::RC_LANGUAGE_PACKAGE_SELECTION:
+       case LyXRC::RC_LYXRCFORMAT:
+       case LyXRC::RC_MAC_DONTSWAP_CTRL_META:
+       case LyXRC::RC_MAC_LIKE_WORD_MOVEMENT:
+       case LyXRC::RC_MACRO_EDIT_STYLE:
+       case LyXRC::RC_MAKE_BACKUP:
+       case LyXRC::RC_MARK_FOREIGN_LANGUAGE:
+       case LyXRC::RC_MOUSE_WHEEL_SPEED:
+       case LyXRC::RC_NUMLASTFILES:
+       case LyXRC::RC_PARAGRAPH_MARKERS:
+       case LyXRC::RC_PATH_PREFIX:
+               if (lyxrc_orig.path_prefix != lyxrc_new.path_prefix) {
+                       prependEnvPath("PATH", lyxrc_new.path_prefix);
+               }
+       case LyXRC::RC_PREVIEW:
+       case LyXRC::RC_PREVIEW_HASHED_LABELS:
+       case LyXRC::RC_PREVIEW_SCALE_FACTOR:
+       case LyXRC::RC_PRINTCOLLCOPIESFLAG:
+       case LyXRC::RC_PRINTCOPIESFLAG:
+       case LyXRC::RC_PRINTER:
+       case LyXRC::RC_PRINTEVENPAGEFLAG:
+       case LyXRC::RC_PRINTEXSTRAOPTIONS:
+       case LyXRC::RC_PRINTFILEEXTENSION:
+       case LyXRC::RC_PRINTLANDSCAPEFLAG:
+       case LyXRC::RC_PRINTODDPAGEFLAG:
+       case LyXRC::RC_PRINTPAGERANGEFLAG:
+       case LyXRC::RC_PRINTPAPERDIMENSIONFLAG:
+       case LyXRC::RC_PRINTPAPERFLAG:
+       case LyXRC::RC_PRINTREVERSEFLAG:
+       case LyXRC::RC_PRINTSPOOL_COMMAND:
+       case LyXRC::RC_PRINTSPOOL_PRINTERPREFIX:
+       case LyXRC::RC_PRINTTOFILE:
+       case LyXRC::RC_PRINTTOPRINTER:
+       case LyXRC::RC_PRINT_ADAPTOUTPUT:
+       case LyXRC::RC_PRINT_COMMAND:
+       case LyXRC::RC_RTL_SUPPORT:
+       case LyXRC::RC_SAVE_COMPRESSED:
+       case LyXRC::RC_SCREEN_DPI:
+       case LyXRC::RC_SCREEN_FONT_ROMAN:
+       case LyXRC::RC_SCREEN_FONT_ROMAN_FOUNDRY:
+       case LyXRC::RC_SCREEN_FONT_SANS:
+       case LyXRC::RC_SCREEN_FONT_SANS_FOUNDRY:
+       case LyXRC::RC_SCREEN_FONT_SCALABLE:
+       case LyXRC::RC_SCREEN_FONT_SIZES:
+       case LyXRC::RC_SCREEN_FONT_TYPEWRITER:
+       case LyXRC::RC_SCREEN_FONT_TYPEWRITER_FOUNDRY:
+       case LyXRC::RC_GEOMETRY_SESSION:
+       case LyXRC::RC_SCREEN_ZOOM:
+       case LyXRC::RC_SERVERPIPE:
+       case LyXRC::RC_SET_COLOR:
+       case LyXRC::RC_SHOW_BANNER:
+       case LyXRC::RC_OPEN_BUFFERS_IN_TABS:
+       case LyXRC::RC_SPELLCHECKER:
+               if (lyxrc_orig.spellchecker != lyxrc_new.spellchecker)
+                       setSpellChecker();
+       case LyXRC::RC_SPELLCHECK_CONTINUOUSLY:
+       case LyXRC::RC_SPELLCHECK_NOTES:
+       case LyXRC::RC_SPLITINDEX_COMMAND:
+       case LyXRC::RC_TEMPDIRPATH:
+       case LyXRC::RC_TEMPLATEPATH:
+       case LyXRC::RC_TEX_ALLOWS_SPACES:
+       case LyXRC::RC_TEX_EXPECTS_WINDOWS_PATHS:
+               if (lyxrc_orig.windows_style_tex_paths != lyxrc_new.windows_style_tex_paths) {
+                       os::windows_style_tex_paths(lyxrc_new.windows_style_tex_paths);
+               }
+       case LyXRC::RC_TEXINPUTS_PREFIX:
+       case LyXRC::RC_THESAURUSDIRPATH:
+       case LyXRC::RC_UIFILE:
+       case LyXRC::RC_USER_EMAIL:
+       case LyXRC::RC_USER_NAME:
+       case LyXRC::RC_USE_CONVERTER_CACHE:
+       case LyXRC::RC_USE_SYSTEM_COLORS:
+       case LyXRC::RC_USE_TOOLTIP:
+       case LyXRC::RC_USE_PIXMAP_CACHE:
+       case LyXRC::RC_USE_QIMAGE:
+       case LyXRC::RC_VIEWDVI_PAPEROPTION:
+       case LyXRC::RC_SINGLE_CLOSE_TAB_BUTTON:
+       case LyXRC::RC_SINGLE_INSTANCE:
+       case LyXRC::RC_SORT_LAYOUTS:
+       case LyXRC::RC_FULL_SCREEN_LIMIT:
+       case LyXRC::RC_FULL_SCREEN_SCROLLBAR:
+       case LyXRC::RC_FULL_SCREEN_MENUBAR:
+       case LyXRC::RC_FULL_SCREEN_TABBAR:
+       case LyXRC::RC_FULL_SCREEN_TOOLBARS:
+       case LyXRC::RC_FULL_SCREEN_WIDTH:
+       case LyXRC::RC_VISUAL_CURSOR:
+       case LyXRC::RC_CLOSE_BUFFER_WITH_LAST_VIEW:
+       case LyXRC::RC_VIEWER:
+       case LyXRC::RC_VIEWER_ALTERNATIVES:
+       case LyXRC::RC_FORWARD_SEARCH_DVI:
+       case LyXRC::RC_FORWARD_SEARCH_PDF:
+       case LyXRC::RC_EXPORT_OVERWRITE:
+       case LyXRC::RC_DEFAULT_DECIMAL_POINT:
+       case LyXRC::RC_DEFAULT_LENGTH_UNIT:
+       case LyXRC::RC_SCROLL_WHEEL_ZOOM:
+       case LyXRC::RC_CURSOR_WIDTH:
+               break;
+       }
+}
+
+
 #if 0
 string const LyXRC::getDescription(LyXRCTags tag)
 {
@@ -2329,14 +3060,9 @@ string const LyXRC::getDescription(LyXRCTags tag)
                break;
 
        case RC_ALT_LANG:
-       case RC_USE_ALT_LANG:
                str = _("Specify an alternate language. The default is to use the language of the document.");
                break;
 
-       case RC_PLAINTEXT_ROFF_COMMAND:
-               str = _("Use to define an external program to render tables in plain text output. E.g. \"groff -t -Tlatin1 $$FName\" where $$FName is the input file. If \"\" is specified, an internal routine is used.");
-               break;
-
        case RC_PLAINTEXT_LINELEN:
                str = _("The maximum line length of exported plain text/LaTeX/SGML files. If set to 0, paragraphs are output in a single line; if the line length is > 0, paragraphs are separated by a blank line.");
                break;
@@ -2364,6 +3090,10 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("Define the options of bibtex (cf. man bibtex) or select an alternative compiler (e.g. mlbibtex or bibulus).");
                break;
 
+       case RC_JBIBTEX_COMMAND:
+               str = _("Define the options of the bibtex program for PLaTeX (Japanese LaTeX).");
+               break;
+
        case RC_BINDFILE:
                str = _("Keybindings file. Can either specify an absolute path, or LyX will look in its global and local bind/ directories.");
                break;
@@ -2386,10 +3116,24 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("LyX normally doesn't update the cursor position if you move the scrollbar. Set to true if you'd prefer to always have the cursor on screen.");
                break;
 
-       case RC_CUSTOM_EXPORT_COMMAND:
+       case RC_CURSOR_WIDTH:
+               str = _("Configure the width of the text cursor. Automatic zoom-controlled cursor width used when set to 0.");
+               break;
+
+       case RC_SCROLL_BELOW_DOCUMENT:
+               str = _("LyX normally doesn't allow the user to scroll further than the bottom of the document. Set to true if you prefer to scroll the bottom of the document to the top of the screen");
+               break;
+
+       case RC_MAC_DONTSWAP_CTRL_META:
+               str = _("Make Apple key act as Meta and Control key as Ctrl.");
+               break;
+
+       case RC_MAC_LIKE_WORD_MOVEMENT:
+               str = _("Use the Mac OS X conventions for the word-level cursor movement");
                break;
 
-       case RC_CUSTOM_EXPORT_FORMAT:
+       case RC_SHOW_MACRO_LABEL:
+               str = _("Show a small box around a Math Macro with the macro name when the cursor is inside.");
                break;
 
        case RC_DATE_INSERT_FORMAT:
@@ -2401,12 +3145,8 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("Command definition file. Can either specify an absolute path, or LyX will look in its global and local commands/ directories.");
                break;
 
-       case RC_DEFAULT_LANGUAGE:
-               str = _("New documents will be assigned this language.");
-               break;
-
-       case RC_DEFAULT_PAPERSIZE:
-               str = _("Specify the default paper size.");
+       case RC_DEFAULT_VIEW_FORMAT:
+               str = _("The default format used with LFUN_BUFFER_[VIEW|UPDATE].");
                break;
 
        case RC_DIALOGS_ICONIFY_WITH_MAIN:
@@ -2422,7 +3162,6 @@ string const LyXRC::getDescription(LyXRCTags tag)
                break;
 
        case RC_ESC_CHARS:
-       case RC_USE_ESC_CHARS:
                str = _("Specify additional chars that can be part of a word.");
                break;
 
@@ -2434,13 +3173,25 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("The font encoding used for the LaTeX2e fontenc package. T1 is highly recommended for non-English languages.");
                break;
 
-       case RC_FORMAT:
+       case RC_FORCE_PAINT_SINGLE_CHAR:
+               str = _("Disable any kerning and ligatures for text drawing on screen.");
+               break;
+
+       case RC_FILEFORMAT:
                break;
 
        case RC_INDEX_COMMAND:
                str = _("Define the options of makeindex (cf. man makeindex) or select an alternative compiler. E.g., using xindy/make-rules, the command string would be \"makeindex.sh -m $$lang\".");
                break;
 
+       case RC_JINDEX_COMMAND:
+               str = _("Define the options of the index program for PLaTeX (Japanese LaTeX).");
+               break;
+
+       case RC_NOMENCL_COMMAND:
+               str = _("Define the options of makeindex (cf. man makeindex) to be used for nomenclatures. This might differ from the index processing options.");
+               break;
+
        case RC_INPUT:
                break;
 
@@ -2450,10 +3201,6 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("Use this to set the correct mapping file for your keyboard. You'll need this if you for instance want to type German documents on an American keyboard.");
                break;
 
-       case RC_LABEL_INIT_LENGTH:
-               str = _("Maximum number of words in the initialization string for a new label");
-               break;
-
        case RC_LANGUAGE_AUTO_BEGIN:
                str = _("Select if a language switching command is needed at the beginning of the document.");
                break;
@@ -2478,11 +3225,11 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("De-select if you don't want the language(s) used as an argument to \\documentclass.");
                break;
 
-       case RC_LANGUAGE_PACKAGE:
+       case RC_LANGUAGE_CUSTOM_PACKAGE:
                str = _("The LaTeX command for loading the language package. E.g. \"\\usepackage{babel}\", \"\\usepackage{omega}\".");
                break;
 
-       case RC_LANGUAGE_USE_BABEL:
+       case RC_LANGUAGE_PACKAGE_SELECTION:
                str = _("De-select if you don't want babel to be used when the language of the document is the default language.");
                break;
 
@@ -2502,6 +3249,51 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("Select to control the highlighting of words with a language foreign to that of the document.");
                break;
 
+       case RC_MOUSE_WHEEL_SPEED:
+               str = bformat(_("The scrolling speed of the mouse wheel."),
+                     maxlastfiles);
+               break;
+
+       case RC_COMPLETION_POPUP_DELAY:
+               str = _("The completion popup delay.");
+               break;
+
+       case RC_COMPLETION_POPUP_MATH:
+               str = _("Select to display the completion popup in math mode.");
+               break;
+
+       case RC_COMPLETION_POPUP_TEXT:
+               str = _("Select to display the completion popup in text mode.");
+               break;
+
+       case RC_COMPLETION_POPUP_AFTER_COMPLETE:
+               str = _("Show the completion popup without delay after non-unique completion attempt.");
+               break;
+
+       case RC_COMPLETION_POPUP_TEXT:
+               str = _("Show a small triangle on the cursor to indicate that a completion is available.");
+               break;
+
+       case RC_COMPLETION_POPUP_DELAY:
+               str = _("The inline completion delay.");
+               break;
+
+       case RC_COMPLETION_INLINE_MATH:
+               str = _("Select to display the inline completion in math mode.");
+               break;
+
+       case RC_COMPLETION_INLINE_TEXT:
+               str = _("Select to display the inline completion in text mode.");
+               break;
+
+       case RC_COMPLETION_INLINE_DOTS:
+               str = _("Use \"...\" to shorten long completions.");
+               break;
+
+       case RC_AUTOCORRECTION_MATH:
+               str = _("Allow TeXMacs shorthand, like => converting to \Rightarrow.");
+               break;
+
        case RC_NUMLASTFILES:
                str = bformat(_("Maximal number of lastfiles. Up to %1$d can appear in the file menu."),
                        maxlastfiles);
@@ -2509,15 +3301,10 @@ string const LyXRC::getDescription(LyXRCTags tag)
 
        case RC_PATH_PREFIX:
                str = _("Specify those directories which should be "
-                        "prepended to the PATH environment variable. "
+                        "prepended to the PATH environment variable.\n"
                         "Use the OS native format.");
                break;
 
-       case RC_PERS_DICT:
-       case RC_USE_PERS_DICT:
-               str = _("Specify an alternate personal dictionary file. E.g. \".ispell_english\".");
-               break;
-
        case RC_PREVIEW:
                str = _("Shows a typeset preview of things such as math");
                break;
@@ -2606,6 +3393,14 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("Select to enable support of right-to-left languages (e.g. Hebrew, Arabic).");
                break;
 
+       case RC_VISUAL_CURSOR:
+               str = _("Select to have visual bidi cursor movement, unselect for logical movement.");
+               break;
+
+       case RC_CLOSE_BUFFER_WITH_LAST_VIEW:
+               str = _("Specify whether, closing the last view of an open document, LyX should close the document (yes), hide it (no), or ask the user (ask).");
+               break;
+
        case RC_SCREEN_DPI:
                str = _("DPI (dots per inch) of your monitor is auto-detected by LyX. If that goes wrong, override the setting here.");
                break;
@@ -2649,14 +3444,14 @@ string const LyXRC::getDescription(LyXRCTags tag)
                str = _("De-select if you don't want the startup banner.");
                break;
 
-       case RC_SPELL_COMMAND:
-               str = _("What command runs the spellchecker?");
-               break;
-
        case RC_TEMPDIRPATH:
                str = _("LyX will place its temporary directories in this path. They will be deleted when you quit LyX.");
                break;
 
+       case RC_THESAURUSDIRPATH:
+               str = _("This is the place where the files of the thesaurus library reside.");
+               break;
+
        case RC_TEMPLATEPATH:
                str = _("The path that LyX will set when offering to choose a template. An empty value selects the directory LyX was started from.");
                break;
@@ -2667,6 +3462,13 @@ string const LyXRC::getDescription(LyXRCTags tag)
        case RC_TEX_EXPECTS_WINDOWS_PATHS:
                break;
 
+       case RC_TEXINPUTS_PREFIX:
+               str = _("Specify those directories which should be "
+                        "prepended to the TEXINPUTS environment variable.\n"
+                        "A '.' represents the current document directory. "
+                        "Use the OS native format.");
+               break;
+
        case RC_UIFILE:
                str = _("The UI (user interface) file. Can either specify an absolute path, or LyX will look in its global and local ui/ directories.");
                break;
@@ -2677,20 +3479,18 @@ string const LyXRC::getDescription(LyXRCTags tag)
        case RC_USER_NAME:
                break;
 
-       case RC_USETEMPDIR:
+       case RC_USE_USE_SYSTEM_COLORS:
+               str = _("Enable use the system colors for some things like main window background and selection.");
                break;
 
-       case RC_USE_INP_ENC:
-               str = _("Specify whether to pass the -T input encoding option to ispell. Enable this if you cannot check the spelling of words containing accented letters. This may not work with all dictionaries.");
+       case RC_USE_TOOLTIP:
+               str = _("Enable the automatic appearance of tool tips in the work area.");
                break;
 
        case RC_USE_PIXMAP_CACHE:
                str = _("Enable the pixmap cache that might improve performance on Mac and Windows.");
                break;
 
-       case RC_USE_SPELL_LIB:
-               break;
-
        case RC_VIEWDVI_PAPEROPTION:
                _("Specify the paper command to DVI viewer (leave empty or use \"-paper\")");
                break;