Attached is a more polished patch, with the additional ability to
display all rc entries using names such as "lyxrc:bind_file".

This improves the documentation and visibility of lyx shortcuts, which
are, to normal lyx users, more important than the customization of
shortcuts.

Jose?
Bo
Index: development/scons/scons_manifest.py
===================================================================
--- development/scons/scons_manifest.py	(revision 20850)
+++ development/scons/scons_manifest.py	(working copy)
@@ -1036,6 +1036,7 @@
     InsetHFill.h
     InsetInclude.h
     InsetIndex.h
+    InsetInfo.h
     InsetLabel.h
     InsetLine.h
     InsetListings.h
@@ -1091,6 +1092,7 @@
     InsetHFill.cpp
     InsetInclude.cpp
     InsetIndex.cpp
+    InsetInfo.cpp
     InsetLabel.cpp
     InsetLine.cpp
     InsetListings.cpp
@@ -2055,6 +2057,7 @@
     Intro.lyx
     LaTeXConfig.lyx.in
     Reference.lyx
+    Shortcuts.lyx
     Tutorial.lyx
     UserGuide.lyx
 ''')
Index: development/FORMAT
===================================================================
--- development/FORMAT	(revision 20850)
+++ development/FORMAT	(working copy)
@@ -1,6 +1,9 @@
 LyX file-format changes
 -----------------------
 
+2007-10-07 Bo Peng <[EMAIL PROTECTED]>
+	* Format incremented to 292: Add InsetInfo.
+
 2007-10-04 Uwe Stöhr Uwe Stöhr <[EMAIL PROTECTED]>
 	* Format incremented to 291: Support for Vietnamese.
 
Index: src/LyXAction.cpp
===================================================================
--- src/LyXAction.cpp	(revision 20850)
+++ src/LyXAction.cpp	(working copy)
@@ -376,6 +376,7 @@
 		{ LFUN_LAYOUT_MODULES_CLEAR, "layout-modules-clear", Noop },
 		{ LFUN_LAYOUT_MODULE_ADD, "layout-module-add", Noop },
 		{ LFUN_LAYOUT_RELOAD, "layout-reload", Noop },
+		{ LFUN_INFO_INSERT, "info-insert", Noop },
 
 		{ LFUN_NOACTION, "", Noop }
 	};
Index: src/insets/Inset.cpp
===================================================================
--- src/insets/Inset.cpp	(revision 20850)
+++ src/insets/Inset.cpp	(working copy)
@@ -103,6 +103,7 @@
 		InsetName("vspace", Inset::VSPACE_CODE),
 		InsetName("mathmacroarg", Inset::MATHMACROARG_CODE),
 		InsetName("listings", Inset::LISTINGS_CODE),
+		InsetName("info", Inset::INFO_CODE),
 	};
 
 	std::size_t const insetnames_size =
Index: src/insets/Inset.h
===================================================================
--- src/insets/Inset.h	(revision 20850)
+++ src/insets/Inset.h	(working copy)
@@ -367,7 +367,9 @@
 		///
 		PAGEBREAK_CODE,
 		///
-		LISTINGS_CODE
+		LISTINGS_CODE,
+		///
+		INFO_CODE,
 	};
 
 	/** returns the Code corresponding to the \c name.
Index: src/insets/InsetInfo.cpp
===================================================================
--- src/insets/InsetInfo.cpp	(revision 0)
+++ src/insets/InsetInfo.cpp	(revision 0)
@@ -0,0 +1,150 @@
+/**
+ * \file InsetInfo.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Bo Peng
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+#include <config.h>
+
+#include "InsetInfo.h"
+
+#include "gettext.h"
+#include "Lexer.h"
+#include "MetricsInfo.h"
+#include "BufferView.h"
+
+// for shortcut:blah
+#include "KeyMap.h"
+#include "LyXAction.h"
+#include "FuncRequest.h"
+// for lyxrc:blah
+#include "LyXRC.h"
+#include <sstream>
+
+#include "support/lstrings.h"
+
+#include "debug.h"
+
+namespace lyx {
+
+using std::string;
+using std::ostream;
+using std::ostringstream;
+
+using support::prefixIs;
+using support::trim;
+using support::rtrim;
+
+InsetInfo::InsetInfo(string const & name) 
+	: name_(name),
+	  mouse_hover_(false)
+{
+	info_ = getInfo();
+	button_.update(info_, false);
+}
+
+
+void InsetInfo::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+	button_.metrics(mi, dim);
+}
+
+
+void InsetInfo::draw(PainterInfo & pi, int x, int y) const
+{
+	button_.draw(pi, x, y); 
+	if (mouse_hover_)
+		pi.base.bv->message(from_utf8("Info: " + name_));
+}
+
+
+void InsetInfo::read(Buffer const & buf, Lexer & lex)
+{
+	lex.next();
+	setInfo(lex.getString());
+	lex.next();
+	if (lex.getString() != "\\end_inset") {
+		lex.printError("Missing \\end_inset at this point");
+	}
+}
+
+
+void InsetInfo::write(Buffer const & buf, std::ostream & os) const
+{
+	os << "Info \"" << name_ << '"';
+}
+
+
+int InsetInfo::plaintext(Buffer const & buf, odocstream & os,
+			    OutputParams const &) const
+{
+	os << info_;
+	return info_.size();
+}
+
+
+int InsetInfo::latex(Buffer const & buf, odocstream & os,
+		     OutputParams const & runparams_in) const
+{
+	os << info_;
+	return info_.size();
+}
+
+
+void InsetInfo::setInfo(string const & name)
+{
+	name_ = name;
+	info_ = getInfo();
+	button_.update(info_, false);
+}
+
+/*
+This function interpret name_ and return its associated name.
+Currently, the supported names are:
+
+shortcut:font-bold          (the same as in the bind file)
+lyxrc:rc_entries
+
+I am not sure if it is a good idea to add 
+
+buffer:buffer_params
+
+The problem is that those are not 'stable' information.
+*/
+docstring InsetInfo::getInfo() const
+{
+	if (prefixIs(name_, "shortcut:")) {
+		string cmd = name_.substr(9);
+		FuncRequest func = lyxaction.lookupFunc(cmd);
+		if (func.action == LFUN_UNKNOWN_ACTION)
+			return docstring();
+		return theTopLevelKeymap().printbindings(func);
+	} else if (prefixIs(name_, "lyxrc:")) {
+		string rc = name_.substr(6);
+		if (rc.empty())
+			return docstring();
+		ostringstream oss;
+		lyxrc.write(oss, true, rc);
+		string result = oss.str();
+		// remove leading \\name
+		result = result.substr(rc.size() + 2);
+		// remove \n and ""
+		result = rtrim(result, "\n");
+		result = trim(result, "\"");
+		return from_utf8(result);
+	} else
+		return from_utf8("Unknown Info: " + name_);
+}
+
+
+bool InsetInfo::setMouseHover(bool mouse_hover)
+{
+	mouse_hover_ = mouse_hover;
+	return true;
+}
+
+
+} // namespace lyx
Index: src/insets/InsetInfo.h
===================================================================
--- src/insets/InsetInfo.h	(revision 0)
+++ src/insets/InsetInfo.h	(revision 0)
@@ -0,0 +1,72 @@
+// -*- C++ -*-
+/**
+ * \file InsetInfo.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Bo Peng
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef INSET_INFO_H
+#define INSET_INFO_H
+
+#include "Inset.h"
+#include "RenderButton.h"
+#include "gettext.h"
+#include "Cursor.h"
+
+namespace lyx {
+
+class LaTeXFeatures;
+
+/** Used to insert index labels
+  */
+class InsetInfo : public Inset {
+public:
+	///
+	InsetInfo(std::string const & info = std::string());
+	///
+	void metrics(MetricsInfo & mi, Dimension & dim) const;
+	///
+	Dimension const dimension(BufferView const &) const { return button_.dimension(); }
+	///
+	void draw(PainterInfo & pi, int x, int y) const;
+	///
+	void write(Buffer const & buf, std::ostream & os) const;
+	///
+	void read(Buffer const &, Lexer & lex);
+	///
+	Inset::Code lyxCode() const { return Inset::INFO_CODE; }
+	///
+	int plaintext(Buffer const & buf, odocstream & os,
+			    OutputParams const &) const;
+	///
+	int latex(Buffer const & buf, odocstream & os,
+				OutputParams const & runparams_in) const;
+	///
+	void setInfo(std::string const & info);
+	///
+	bool setMouseHover(bool mouse_hover);
+
+private:
+	///
+	docstring getInfo() const;
+	///
+	virtual Inset * clone() const { return new InsetInfo(*this); }
+	///
+	std::string name_;
+	///
+	docstring info_;
+	///
+	bool mouse_hover_;
+	///
+	mutable RenderButton button_;	
+};
+
+
+
+} // namespace lyx
+
+#endif
Index: src/BufferView.cpp
===================================================================
--- src/BufferView.cpp	(revision 20850)
+++ src/BufferView.cpp	(working copy)
@@ -783,6 +783,7 @@
 		break;
 	case LFUN_FONT_STATE:
 	case LFUN_LABEL_INSERT:
+	case LFUN_INFO_INSERT:
 	case LFUN_PARAGRAPH_GOTO:
 	// FIXME handle non-trivially
 	case LFUN_OUTLINE_UP:
Index: src/LyXRC.h
===================================================================
--- src/LyXRC.h	(revision 20850)
+++ src/LyXRC.h	(working copy)
@@ -160,9 +160,10 @@
 	///
 	void write(support::FileName const & filename,
 		   bool ignore_system_lyxrc) const;
-	///
+	/// write rc. If a specific tag is given, only output that one.
 	void write(std::ostream & os,
-		   bool ignore_system_lyxrc) const;
+		   bool ignore_system_lyxrc, 
+		   std::string const & tag = std::string()) const;
 	///
 	void print() const;
 	// FIXME unused (was used for xforms. Do we still need this?)
Index: src/KeyMap.cpp
===================================================================
--- src/KeyMap.cpp	(revision 20850)
+++ src/KeyMap.cpp	(working copy)
@@ -278,9 +278,15 @@
 {
 	odocstringstream res;
 	Bindings bindings = findbindings(func);
-	for (Bindings::const_iterator cit = bindings.begin();
-	     cit != bindings.end() ; ++cit)
-		res << '[' << cit->print(true) << ']';
+	if (bindings.empty())
+		return docstring();
+	Bindings::const_iterator cit = bindings.begin();
+	Bindings::const_iterator cit_end = bindings.end();
+	// prin the first item
+	res << cit->print(true);
+	// more than one shortcuts?
+	for (++cit; cit != cit_end; ++cit)
+		res << ", " << cit->print(true);
 	return res.str();
 }
 
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 20850)
+++ src/Makefile.am	(working copy)
@@ -523,6 +523,8 @@
 	insets/InsetInclude.h \
 	insets/InsetIndex.cpp \
 	insets/InsetIndex.h \
+	insets/InsetInfo.cpp \
+	insets/InsetInfo.h \
 	insets/InsetLabel.cpp \
 	insets/InsetLabel.h \
 	insets/InsetLine.cpp \
Index: src/factory.cpp
===================================================================
--- src/factory.cpp	(revision 20850)
+++ src/factory.cpp	(working copy)
@@ -38,6 +38,7 @@
 #include "insets/InsetHFill.h"
 #include "insets/InsetInclude.h"
 #include "insets/InsetIndex.h"
+#include "insets/InsetInfo.h"
 #include "insets/InsetNomencl.h"
 #include "insets/InsetLabel.h"
 #include "insets/InsetLine.h"
@@ -221,6 +222,8 @@
 		case LFUN_ENVIRONMENT_INSERT:
 			return new InsetEnvironment(params, cmd.argument());
 
+		case LFUN_INFO_INSERT:
+			return new InsetInfo(to_utf8(cmd.argument()));
 #if 0
 		case LFUN_LIST_INSERT:
 			return new InsetList;
@@ -497,6 +500,8 @@
 			inset.reset(new InsetIndex(buf.params()));
 		} else if (tmptok == "FloatList") {
 			inset.reset(new InsetFloatList);
+		} else if (tmptok == "Info") {
+			inset.reset(new InsetInfo());
 		} else {
 			lyxerr << "unknown Inset type '" << tmptok
 			       << "'" << std::endl;
Index: src/Text3.cpp
===================================================================
--- src/Text3.cpp	(revision 20850)
+++ src/Text3.cpp	(working copy)
@@ -57,6 +57,7 @@
 #include "insets/InsetQuotes.h"
 #include "insets/InsetSpecialChar.h"
 #include "insets/InsetText.h"
+#include "insets/InsetInfo.h"
 
 #include "support/lstrings.h"
 #include "support/lyxlib.h"
@@ -1095,7 +1096,21 @@
 		break;
 	}
 
-
+	case LFUN_INFO_INSERT: {
+		if (!cur.selection())
+			break;
+		Inset * inset = createInset(&cur.bv(), cmd);
+		if (!inset)
+			break;
+		// use selected text as info to avoid a separate UI
+		docstring ds = cur.selectionAsString(false);
+		cutSelection(cur, true, false);
+		insertInset(cur, inset);
+		static_cast<InsetInfo *>(inset)->setInfo(to_utf8(ds));
+		cur.posRight();
+		updateLabels(bv->buffer());
+		break;
+	}
 #if 0
 	case LFUN_LIST_INSERT:
 	case LFUN_THEOREM_INSERT:
@@ -1688,6 +1703,9 @@
 	case LFUN_LABEL_INSERT:
 		code = Inset::LABEL_CODE;
 		break;
+	case LFUN_INFO_INSERT:
+		code = Inset::INFO_CODE;
+		break;
 	case LFUN_OPTIONAL_INSERT:
 		code = Inset::OPTARG_CODE;
 		enable = numberOfOptArgs(cur.paragraph())
Index: src/lfuns.h
===================================================================
--- src/lfuns.h	(revision 20850)
+++ src/lfuns.h	(working copy)
@@ -402,8 +402,9 @@
 	LFUN_LAYOUT_MODULES_CLEAR,       // rgh, 20070825
 	LFUN_LAYOUT_MODULE_ADD,          // rgh, 20070825
 	LFUN_LAYOUT_RELOAD,              // rgh, 20070903
-	LFUN_MASTER_BUFFER_VIEW,	 // Tommaso, 20070920
-	LFUN_MASTER_BUFFER_UPDATE,	 // Tommaso, 20070920
+	LFUN_MASTER_BUFFER_VIEW,         // Tommaso, 20070920
+	LFUN_MASTER_BUFFER_UPDATE,       // Tommaso, 20070920
+	LFUN_INFO_INSERT,                // bpeng, 20071007
 
 	LFUN_LASTACTION                  // end of the table
 };
Index: src/LyXRC.cpp
===================================================================
--- src/LyXRC.cpp	(revision 20850)
+++ src/LyXRC.cpp	(working copy)
@@ -1210,27 +1210,37 @@
 };
 
 
-void LyXRC::write(ostream & os, bool ignore_system_lyxrc) const
+void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) const
 {
-	os << "### This file is part of\n"
-	   << "### ========================================================\n"
-	   << "###          LyX, The Document Processor\n"
-	   << "###\n"
-	   << "###          Copyright 1995 Matthias Ettrich\n"
-	   << "###          Copyright 1995-2001 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";
+	LyXRCTags tag = RC_LAST;
+	
+	if (name.empty())
+		tag = RC_LAST;
+	else {
+		for (size_t i = 0; i < lyxrcCount; ++i)
+			if ("\\" + name == lyxrcTags[i].tag)
+				tag = static_cast<LyXRCTags>(lyxrcTags[i].code);
+	}
 
+	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-2001 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";
+
 	// 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.
-	LyXRCTags tag = RC_LAST;
 	switch (tag) {
 	case RC_LAST:
 	case RC_INPUT:
@@ -1241,13 +1251,15 @@
 			string const path = os::external_path(bind_file);
 			os << "\\bind_file \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
+
 		//
 		// Misc Section
 		//
 		os << "\n#\n"
 		   << "# MISC SECTION ######################################\n"
 		   << "#\n\n";
-
 		// bind files are not done here.
 
 	case RC_PATH_PREFIX:
@@ -1255,13 +1267,16 @@
 		    path_prefix != system_lyxrc.path_prefix) {
 			os << "\\path_prefix \"" << path_prefix << "\"\n";
 		}
-
+		if (tag != RC_LAST)
+			break;
 	case RC_UIFILE:
 		if (ignore_system_lyxrc ||
 		    ui_file != system_lyxrc.ui_file) {
 			string const path = os::external_path(ui_file);
 			os << "\\ui_file \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_AUTOREGIONDELETE:
 		if (ignore_system_lyxrc ||
 		    auto_region_delete != system_lyxrc.auto_region_delete) {
@@ -1270,6 +1285,8 @@
 			   << "\\auto_region_delete " << convert<string>(auto_region_delete)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_AUTORESET_OPTIONS:
 		if (ignore_system_lyxrc ||
 		    auto_reset_options != system_lyxrc.auto_reset_options) {
@@ -1279,12 +1296,16 @@
 			   << convert<string>(auto_reset_options)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_AUTOSAVE:
 		if (ignore_system_lyxrc ||
 		    autosave != system_lyxrc.autosave) {
 			os << "# The time interval between auto-saves in seconds.\n"
 			   << "\\autosave " << autosave << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_DISPLAY_GRAPHICS:
 		if (ignore_system_lyxrc ||
 		    display_graphics != system_lyxrc.display_graphics) {
@@ -1294,6 +1315,8 @@
 			   << graphics::displayTranslator().find(display_graphics)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_VIEWDVI_PAPEROPTION:
 		if (ignore_system_lyxrc ||
@@ -1304,6 +1327,8 @@
 			   << "\\view_dvi_paper_option \""
 			   << view_dvi_paper_option << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_DEFAULT_PAPERSIZE:
 		if (ignore_system_lyxrc ||
 		    default_papersize != system_lyxrc.default_papersize) {
@@ -1332,79 +1357,109 @@
 			}
 			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";
 		}
+		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";
 		}
+		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";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_TEX_EXPECTS_WINDOWS_PATHS:
 		if (ignore_system_lyxrc ||
 		    windows_style_tex_paths != system_lyxrc.windows_style_tex_paths) {
 			os << "\\tex_expects_windows_paths "
 			   << convert<string>(windows_style_tex_paths) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_TEX_ALLOWS_SPACES:
 		if (tex_allows_spaces != system_lyxrc.tex_allows_spaces) {
 			os << "\\tex_allows_spaces "
 			   << convert<string>(tex_allows_spaces) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_KBMAP:
 		if (ignore_system_lyxrc ||
 		    use_kbmap != system_lyxrc.use_kbmap) {
 			os << "\\kbmap " << convert<string>(use_kbmap) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_KBMAP_PRIMARY:
 		if (ignore_system_lyxrc ||
 		    primary_kbmap != system_lyxrc.primary_kbmap) {
 			string const path = os::external_path(primary_kbmap);
 			os << "\\kbmap_primary \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_KBMAP_SECONDARY:
 		if (ignore_system_lyxrc ||
 		    secondary_kbmap != system_lyxrc.secondary_kbmap) {
 			string const path = os::external_path(secondary_kbmap);
 			os << "\\kbmap_secondary \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SERVERPIPE:
 		if (ignore_system_lyxrc ||
 		    lyxpipes != system_lyxrc.lyxpipes) {
 			string const path = os::external_path(lyxpipes);
 			os << "\\serverpipe \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_DATE_INSERT_FORMAT:
 		if (ignore_system_lyxrc ||
 		    date_insert_format != system_lyxrc.date_insert_format) {
 			os << "\\date_insert_format \"" << date_insert_format
 			   << "\"\n";
 		}
+		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";
+		if (tag != RC_LAST)
+			break;
 
 	case RC_USER_EMAIL:
 		os << "\\user_email \"" << user_email << "\"\n";
+		if (tag != RC_LAST)
+			break;
 
 	case RC_SHOW_BANNER:
 		if (ignore_system_lyxrc ||
 		    show_banner != system_lyxrc.show_banner) {
 			os << "\\show_banner " << convert<string>(show_banner) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_PREVIEW:
 		if (ignore_system_lyxrc ||
@@ -1423,6 +1478,8 @@
 			}
 			os << "\\preview " << status << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_PREVIEW_HASHED_LABELS:
 		if (ignore_system_lyxrc ||
@@ -1431,6 +1488,8 @@
 			os << "\\preview_hashed_labels "
 			   << convert<string>(preview_hashed_labels) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_PREVIEW_SCALE_FACTOR:
 		if (ignore_system_lyxrc ||
@@ -1438,6 +1497,8 @@
 			os << "\\preview_scale_factor "
 			   << preview_scale_factor << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_USE_CONVERTER_CACHE:
 		if (ignore_system_lyxrc ||
@@ -1445,6 +1506,8 @@
 			os << "\\use_converter_cache "
 			   << convert<string>(use_converter_cache) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_CONVERTER_CACHE_MAXAGE:
 		if (ignore_system_lyxrc ||
@@ -1452,6 +1515,8 @@
 			os << "\\converter_cache_maxage "
 			   << converter_cache_maxage << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# SCREEN & FONTS SECTION ############################\n"
@@ -1462,29 +1527,39 @@
 		    dpi != system_lyxrc.dpi) {
 			os << "\\screen_dpi " << dpi << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_ZOOM:
 		if (ignore_system_lyxrc ||
 		    zoom != system_lyxrc.zoom) {
 			os << "\\screen_zoom " << zoom << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_GEOMETRY_HEIGHT:
 		if (ignore_system_lyxrc ||
 		    geometry_height != system_lyxrc.geometry_height) {
 			os << "\\screen_geometry_height " << geometry_height
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_GEOMETRY_WIDTH:
 		if (ignore_system_lyxrc ||
 		    geometry_width != system_lyxrc.geometry_width) {
 			os << "\\screen_geometry_width " << geometry_width
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_GEOMETRY_XYSAVED:
 		if (ignore_system_lyxrc ||
 		    geometry_xysaved != system_lyxrc.geometry_xysaved) {
 			os << "\\screen_geometry_xysaved " << convert<string>(geometry_xysaved)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_CURSOR_FOLLOWS_SCROLLBAR:
 		if (ignore_system_lyxrc ||
 		    cursor_follows_scrollbar
@@ -1492,6 +1567,8 @@
 			os << "\\cursor_follows_scrollbar "
 			   << convert<string>(cursor_follows_scrollbar) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_DIALOGS_ICONIFY_WITH_MAIN:
 		if (ignore_system_lyxrc ||
 		    dialogs_iconify_with_main
@@ -1499,42 +1576,56 @@
 			os << "\\dialogs_iconify_with_main "
 			  <<  convert<string>(dialogs_iconify_with_main) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_ROMAN:
 		if (ignore_system_lyxrc ||
 		    roman_font_name != system_lyxrc.roman_font_name) {
 			os << "\\screen_font_roman \"" << roman_font_name
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_ROMAN_FOUNDRY:
 		if (ignore_system_lyxrc ||
 		    roman_font_foundry != system_lyxrc.roman_font_foundry) {
 			os << "\\screen_font_roman_foundry \"" << roman_font_foundry
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_SANS:
 		if (ignore_system_lyxrc ||
 		    sans_font_name != system_lyxrc.sans_font_name) {
 			os << "\\screen_font_sans \"" << sans_font_name
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_SANS_FOUNDRY:
 		if (ignore_system_lyxrc ||
 		    sans_font_foundry != system_lyxrc.sans_font_foundry) {
 			os << "\\screen_font_sans_foundry \"" << sans_font_foundry
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_TYPEWRITER:
 		if (ignore_system_lyxrc ||
 		    typewriter_font_name != system_lyxrc.typewriter_font_name) {
 			os << "\\screen_font_typewriter \""
 			   << typewriter_font_name << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_TYPEWRITER_FOUNDRY:
 		if (ignore_system_lyxrc ||
 		    typewriter_font_foundry != system_lyxrc.typewriter_font_foundry) {
 			os << "\\screen_font_typewriter_foundry \""
 			   << typewriter_font_foundry << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 
 	case RC_SCREEN_FONT_SCALABLE:
 		if (ignore_system_lyxrc ||
@@ -1543,6 +1634,8 @@
 			   << convert<string>(use_scalable_fonts)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SCREEN_FONT_SIZES:
 		if (ignore_system_lyxrc ||
 		    font_sizes[Font::SIZE_TINY]
@@ -1580,6 +1673,8 @@
 			   << ' ' << font_sizes[Font::SIZE_HUGER]
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# COLOR SECTION ###################################\n"
@@ -1597,6 +1692,8 @@
 				   << col << "\"\n";
 			}
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# PRINTER SECTION ###################################\n"
@@ -1607,6 +1704,8 @@
 		    printer != system_lyxrc.printer) {
 			os << "\\printer \"" << printer << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINT_ADAPTOUTPUT:
 		if (ignore_system_lyxrc ||
 		    print_adapt_output != system_lyxrc.print_adapt_output) {
@@ -1614,23 +1713,31 @@
 			   << convert<string>(print_adapt_output)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINT_COMMAND:
 		if (ignore_system_lyxrc ||
 		    print_command != system_lyxrc.print_command) {
 			os << "\\print_command \"" << print_command << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTEXSTRAOPTIONS:
 		if (ignore_system_lyxrc ||
 		    print_extra_options != system_lyxrc.print_extra_options) {
 			os << "\\print_extra_options \"" << print_extra_options
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTSPOOL_COMMAND:
 		if (ignore_system_lyxrc ||
 		    print_spool_command != system_lyxrc.print_spool_command) {
 			os << "\\print_spool_command \"" << print_spool_command
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTSPOOL_PRINTERPREFIX:
 		if (ignore_system_lyxrc ||
 		    print_spool_printerprefix
@@ -1638,42 +1745,56 @@
 			os << "\\print_spool_printerprefix \""
 			   << print_spool_printerprefix << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTEVENPAGEFLAG:
 		if (ignore_system_lyxrc ||
 		    print_evenpage_flag != system_lyxrc.print_evenpage_flag) {
 			os << "\\print_evenpage_flag \"" << print_evenpage_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTODDPAGEFLAG:
 		if (ignore_system_lyxrc ||
 		    print_oddpage_flag != system_lyxrc.print_oddpage_flag) {
 			os << "\\print_oddpage_flag \"" << print_oddpage_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTREVERSEFLAG:
 		if (ignore_system_lyxrc ||
 		    print_reverse_flag != system_lyxrc.print_reverse_flag) {
 			os << "\\print_reverse_flag \"" << print_reverse_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTLANDSCAPEFLAG:
 		if (ignore_system_lyxrc ||
 		    print_landscape_flag != system_lyxrc.print_landscape_flag) {
 			os << "\\print_landscape_flag \"" << print_landscape_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTPAGERANGEFLAG:
 		if (ignore_system_lyxrc ||
 		    print_pagerange_flag != system_lyxrc.print_pagerange_flag) {
 			os << "\\print_pagerange_flag \"" << print_pagerange_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTCOPIESFLAG:
 		if (ignore_system_lyxrc ||
 		    print_copies_flag != system_lyxrc.print_copies_flag) {
 			os << "\\print_copies_flag \"" << print_copies_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTCOLLCOPIESFLAG:
 		if (ignore_system_lyxrc ||
 		    print_collcopies_flag
@@ -1682,12 +1803,16 @@
 			   << print_collcopies_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTPAPERFLAG:
 		if (ignore_system_lyxrc ||
 		    print_paper_flag != system_lyxrc.print_paper_flag) {
 			os << "\\print_paper_flag \"" << print_paper_flag
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTPAPERDIMENSIONFLAG:
 		if (ignore_system_lyxrc ||
 		    print_paper_dimension_flag
@@ -1695,18 +1820,24 @@
 			os << "\\print_paper_dimension_flag \""
 			   << print_paper_dimension_flag << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTTOPRINTER:
 		if (ignore_system_lyxrc ||
 		    print_to_printer != system_lyxrc.print_to_printer) {
 			os << "\\print_to_printer \"" << print_to_printer
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTTOFILE:
 		if (ignore_system_lyxrc ||
 		    print_to_file != system_lyxrc.print_to_file) {
 			string const path = os::external_path(print_to_file);
 			os << "\\print_to_file \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_PRINTFILEEXTENSION:
 		if (ignore_system_lyxrc ||
 		    print_file_extension != system_lyxrc.print_file_extension) {
@@ -1714,6 +1845,8 @@
 			   << print_file_extension
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# EXPORT SECTION ####################################\n"
@@ -1727,6 +1860,8 @@
 			   << custom_export_command
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_CUSTOM_EXPORT_FORMAT:
 		if (ignore_system_lyxrc ||
 		    custom_export_format
@@ -1734,6 +1869,8 @@
 			os << "\\custom_export_format \"" << custom_export_format
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# TEX SECTION #######################################\n"
@@ -1744,6 +1881,8 @@
 		    fontenc != system_lyxrc.fontenc) {
 			os << "\\font_encoding \"" << fontenc << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# FILE SECTION ######################################\n"
@@ -1755,59 +1894,81 @@
 			string const path = os::external_path(document_path);
 			os << "\\document_path \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_USELASTFILEPOS:
 		if (ignore_system_lyxrc ||
 		    use_lastfilepos != system_lyxrc.use_lastfilepos) {
 			os << "\\use_lastfilepos " << convert<string>(use_lastfilepos)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LOADSESSION:
 		if (ignore_system_lyxrc ||
 		    load_session != system_lyxrc.load_session) {
 			os << "\\load_session " << convert<string>(load_session)
 			   << "\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';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_CHECKLASTFILES:
 		if (ignore_system_lyxrc ||
 		    check_lastfiles != system_lyxrc.check_lastfiles) {
 			os << "\\check_lastfiles " << convert<string>(check_lastfiles)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_TEMPLATEPATH:
 		if (ignore_system_lyxrc ||
 		    template_path != system_lyxrc.template_path) {
 			string const path = os::external_path(template_path);
 			os << "\\template_path \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_TEMPDIRPATH:
 		if (ignore_system_lyxrc ||
 		    tempdir_path != system_lyxrc.tempdir_path) {
 			string const path = os::external_path(tempdir_path);
 			os << "\\tempdir_path \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_USETEMPDIR:
+		if (tag != RC_LAST)
+			break;
 		// Ignore it
 	case RC_PLAINTEXT_LINELEN:
 		if (ignore_system_lyxrc ||
 		    plaintext_linelen != system_lyxrc.plaintext_linelen) {
 			os << "\\plaintext_linelen " << plaintext_linelen << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_MAKE_BACKUP:
 		if (ignore_system_lyxrc ||
 		    make_backup != system_lyxrc.make_backup) {
 			os << "\\make_backup " << convert<string>(make_backup) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_BACKUPDIR_PATH:
 		if (ignore_system_lyxrc ||
 		    backupdir_path != system_lyxrc.backupdir_path) {
 			string const path = os::external_path(backupdir_path);
 			os << "\\backupdir_path \"" << path << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# PLAIN TEXT EXPORT SECTION ##############################\n"
@@ -1819,6 +1980,8 @@
 			os << "\\plaintext_roff_command \"" << plaintext_roff_command
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# SPELLCHECKER SECTION ##############################\n"
@@ -1828,40 +1991,54 @@
 		    use_spell_lib != system_lyxrc.use_spell_lib) {
 			os << "\\use_spell_lib " << convert<string>(use_spell_lib) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_SPELL_COMMAND:
 		if (ignore_system_lyxrc ||
 		    isp_command != system_lyxrc.isp_command) {
 			os << "\\spell_command \"" << isp_command << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_ACCEPT_COMPOUND:
 		if (ignore_system_lyxrc ||
 		    isp_accept_compound != system_lyxrc.isp_accept_compound) {
 			os << "\\accept_compound " << convert<string>(isp_accept_compound)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_USE_ALT_LANG:
 		if (ignore_system_lyxrc ||
 		    isp_use_alt_lang != system_lyxrc.isp_use_alt_lang) {
 			os << "\\use_alt_language " << convert<string>(isp_use_alt_lang)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_ALT_LANG:
 		if (ignore_system_lyxrc ||
 		    isp_alt_lang != system_lyxrc.isp_alt_lang) {
 			os << "\\alternate_language \"" << isp_alt_lang
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_USE_ESC_CHARS:
 		if (ignore_system_lyxrc ||
 		    isp_use_esc_chars != system_lyxrc.isp_use_esc_chars) {
 			os << "\\use_escape_chars " << convert<string>(isp_use_esc_chars)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_ESC_CHARS:
 		if (ignore_system_lyxrc ||
 		    isp_esc_chars != system_lyxrc.isp_esc_chars) {
 			os << "\\escape_chars \"" << isp_esc_chars << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_USE_PERS_DICT:
 		if (ignore_system_lyxrc ||
 		    isp_use_pers_dict != system_lyxrc.isp_use_pers_dict) {
@@ -1869,11 +2046,15 @@
 			   << convert<string>(isp_use_pers_dict)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	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";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_USE_INP_ENC:
 		if (ignore_system_lyxrc ||
 		    isp_use_input_encoding
@@ -1882,6 +2063,8 @@
 			   << convert<string>(isp_use_input_encoding)
 			   << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# LANGUAGE SUPPORT SECTION ##########################\n"
@@ -1892,12 +2075,16 @@
 		    rtl_support != system_lyxrc.rtl_support) {
 			os << "\\rtl " << convert<string>(rtl_support) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_PACKAGE:
 		if (ignore_system_lyxrc ||
 		    language_package != system_lyxrc.language_package) {
 			os << "\\language_package \"" << language_package
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_GLOBAL_OPTIONS:
 		if (ignore_system_lyxrc ||
 		    language_global_options
@@ -1906,6 +2093,8 @@
 			   << convert<string>(language_global_options)
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_USE_BABEL:
 		if (ignore_system_lyxrc ||
 		    language_use_babel != system_lyxrc.language_use_babel) {
@@ -1913,6 +2102,8 @@
 			   << convert<string>(language_use_babel)
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_COMMAND_BEGIN:
 		if (ignore_system_lyxrc ||
 		    language_command_begin
@@ -1921,6 +2112,8 @@
 			   << language_command_begin
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_COMMAND_END:
 		if (ignore_system_lyxrc ||
 		    language_command_end
@@ -1928,6 +2121,8 @@
 			os << "\\language_command_end \"" << language_command_end
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_COMMAND_LOCAL:
 		if (ignore_system_lyxrc ||
 		    language_command_local
@@ -1936,18 +2131,24 @@
 			   << language_command_local
 			   << "\"\n";
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_AUTO_BEGIN:
 		if (ignore_system_lyxrc ||
 		    language_auto_begin != system_lyxrc.language_auto_begin) {
 			os << "\\language_auto_begin "
 			   << convert<string>(language_auto_begin) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_LANGUAGE_AUTO_END:
 		if (ignore_system_lyxrc ||
 		    language_auto_end != system_lyxrc.language_auto_end) {
 			os << "\\language_auto_end "
 			   << convert<string>(language_auto_end) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_MARK_FOREIGN_LANGUAGE:
 		if (ignore_system_lyxrc ||
 		    mark_foreign_language
@@ -1955,6 +2156,8 @@
 			os << "\\mark_foreign_language " <<
 				convert<string>(mark_foreign_language) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# 2nd MISC SUPPORT SECTION ##########################\n"
@@ -1965,11 +2168,15 @@
 		    auto_number != system_lyxrc.auto_number) {
 			os << "\\auto_number " << convert<string>(auto_number) << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 	case RC_DEFAULT_LANGUAGE:
 		if (ignore_system_lyxrc ||
 		    default_language != system_lyxrc.default_language) {
 			os << "\\default_language " << default_language << '\n';
 		}
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# FORMATS SECTION ##########################\n"
@@ -2011,8 +2218,12 @@
 			if (!formats.getFormat(cit->name()))
 				os << "\\format \"" << cit->name()
 				   << "\" \"\" \"\" \"\" \"\" \"\" \"\"\n";
+		if (tag != RC_LAST)
+			break;
 	case RC_VIEWER:
 		// Ignore it
+		if (tag != RC_LAST)
+			break;
 
 		os << "\n#\n"
 		   << "# CONVERTERS SECTION ##########################\n"
@@ -2040,11 +2251,14 @@
 			if (!theConverters().getConverter(cit->from, cit->to))
 				os << "\\converter \"" << cit->from
 				   << "\" \"" << cit->to << "\" \"\" \"\"\n";
+		if (tag != RC_LAST)
+			break;
 
 	case RC_COPIER:
-		os << "\n#\n"
-		   << "# COPIERS SECTION ##########################\n"
-		   << "#\n\n";
+		if (tag == RC_LAST)
+			os << "\n#\n"
+			   << "# COPIERS SECTION ##########################\n"
+			   << "#\n\n";
 
 		// Look for new movers
 		Movers::const_iterator const sysbegin = theSystemMovers().begin();
@@ -2064,6 +2278,8 @@
 				   << " \"" << command << "\"\n";
 			}
 		}
+		if (tag != RC_LAST)
+			break;
 
 		// We don't actually delete SpecialisedMover(s) from the
 		// map, just clear their 'command', so there's no need
Index: lib/lyx2lyx/LyX.py
===================================================================
--- lib/lyx2lyx/LyX.py	(revision 20850)
+++ lib/lyx2lyx/LyX.py	(working copy)
@@ -80,7 +80,7 @@
                    ("1_3",     [221], minor_versions("1.3" , 7)),
                    ("1_4", range(222,246), minor_versions("1.4" , 5)),
                    ("1_5", range(246,277), minor_versions("1.5" , 1)),
-                   ("1_6", range(277,292), minor_versions("1.6" , 0))] # Uwe Stöhr, Vietnamese
+                   ("1_6", range(277,293), minor_versions("1.6" , 0))] # Uwe Stöhr, Vietnamese
 
 
 def formats_list():
Index: lib/lyx2lyx/lyx_1_6.py
===================================================================
--- lib/lyx2lyx/lyx_1_6.py	(revision 20850)
+++ lib/lyx2lyx/lyx_1_6.py	(working copy)
@@ -420,6 +420,20 @@
         j = j + 1
 
 
+def revert_inset_info(document):
+    'Replace info inset with its content'
+    i = 0
+    while 1:
+        i = find_token(document.body, '\\begin_inset Info', i)
+        if i == -1:
+            return
+        info = document.body[i][17:].strip().strip('"')
+        if not document.body[i + 1].startswith('\\end_inset'):
+            # should not happen
+            document.warning("Malformed LyX document: Could not find end of Info inset.")
+        document.body[i : (i + 2)] = info
+
+
 ##
 # Conversion hub
 #
@@ -439,10 +453,12 @@
            [288, [convert_inset_command]],
            [289, [convert_latexcommand_index]],
            [290, []],
-           [291, []]
+           [291, []],
+           [292, []]
           ]
 
-revert =  [[290, [revert_vietnamese]],
+revert =  [[291, [revert_inset_info]],
+           [290, [revert_vietnamese]],
            [289, [revert_wraptable]],
            [288, [revert_latexcommand_index]],
            [287, [revert_inset_command]],
Index: lib/bind/cua.bind
===================================================================
--- lib/bind/cua.bind	(revision 20850)
+++ lib/bind/cua.bind	(working copy)
@@ -89,6 +89,7 @@
 \bind "M-S-Left"		"depth-decrement"
 \bind "C-S-L"			"ligature-break-insert"
 \bind "C-l"			"ert-insert"		# 'l' for LaTeX
+\bind "C-S-I"			"info-insert"
 
 #bind "F1"			"help"			# Not yet implemented!
 #bind "C-F1"			"help-context"		# Not yet implemented!
Index: lib/ui/stdmenus.inc
===================================================================
--- lib/ui/stdmenus.inc	(revision 20850)
+++ lib/ui/stdmenus.inc	(working copy)
@@ -488,6 +488,7 @@
 		Item "User's Guide|U" "help-open UserGuide"
 		Item "Extended Features|E" "help-open Extended"
 		Item "Embedded Objects|m" "help-open EmbeddedObjects" 
+		Item "Shortcuts|s" "help-open Shortcuts" 
 		Item "Customization|C" "help-open Customization"
 		Item "FAQ|F" "help-open FAQ"
 		Item "Table of Contents|a" "help-open TOC"

Reply via email to