CLASS is as in add_cmd.
    VAR_TYPE is the kind of thing we are setting.
    VAR is address of the variable being controlled by this command.
+   SET_SETTING_FUNC is a pointer to an optional function callback used to set
+   the setting value.
+   GET_SETTING_FUNC is a pointer to an optional function callback used to get
+   the setting value.
    DOC is the documentation string.  */
 
 static struct cmd_list_element *
 /* Add element named NAME to both the command SET_LIST and SHOW_LIST.
    CLASS is as in add_cmd.  VAR_TYPE is the kind of thing we are
    setting.  VAR is address of the variable being controlled by this
-   command.  SET_FUNC and SHOW_FUNC are the callback functions (if
-   non-NULL).  SET_DOC, SHOW_DOC and HELP_DOC are the documentation
-   strings.
+   command.  If nullptr is given as VAR, then both SET_SETTING_FUNC and
+   GET_SETTING_FUNC must be provided. SET_SETTING_FUNC and GET_SETTING_FUNC are
+   callbacks used to access and modify the underlying property, whatever its
+   storage is.  SET_FUNC and SHOW_FUNC are the callback functions (if non-NULL).
+   SET_DOC, SHOW_DOC and HELP_DOC are the documentation strings.
 
    Return the newly created set and show commands.  */
 
                      var_types var_type, T *var,
                      const char *set_doc, const char *show_doc,
                      const char *help_doc,
+                     setting_setter_ftype<T> set_setting_func,
+                     setting_getter_ftype<T> get_setting_func,
                      cmd_func_ftype *set_func,
                      show_value_ftype *show_func,
                      struct cmd_list_element **set_list,
                      struct cmd_list_element **show_list)
 {
   auto erased_args
-    = setting::erase_args (var_type, var);
+    = setting::erase_args (var_type, var,
+                          set_setting_func, get_setting_func);
 
   return add_setshow_cmd_full_erased (name,
                                      theclass,
   set_show_commands commands
     =  add_setshow_cmd_full<const char *> (name, theclass, var_enum, var,
                                           set_doc, show_doc, help_doc,
-                                          set_func, show_func,
-                                          set_list, show_list);
+                                          nullptr, nullptr, set_func,
+                                          show_func, set_list, show_list);
   commands.set->enums = enumlist;
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_enum_cmd (const char *name, command_class theclass,
+                     const char *const *enumlist, const char *set_doc,
+                     const char *show_doc, const char *help_doc,
+                     setting_setter_ftype<const char *> set_func,
+                     setting_getter_ftype<const char *> get_func,
+                     show_value_ftype *show_func,
+                     cmd_list_element **set_list,
+                     cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<const char *> (name, theclass, var_enum,
+                                                 nullptr, set_doc, show_doc,
+                                                 help_doc, set_func, get_func,
+                                                 nullptr, show_func, set_list,
+                                                 show_list);
+
+  cmds.set->enums = enumlist;
+
+  return cmds;
+}
+
 /* See cli-decode.h.  */
 const char * const auto_boolean_enums[] = { "on", "off", "auto", NULL };
 
                              struct cmd_list_element **show_list)
 {
   set_show_commands commands
-    = add_setshow_cmd_full<enum auto_boolean> (name, theclass,
-                                              var_auto_boolean,var,
-                                              set_doc, show_doc, help_doc,
-                                              set_func, show_func,
-                                              set_list, show_list);
+    = add_setshow_cmd_full<enum auto_boolean> (name, theclass, var_auto_boolean,
+                                              var, set_doc, show_doc, help_doc,
+                                              nullptr, nullptr, set_func,
+                                              show_func, set_list, show_list);
 
   commands.set->enums = auto_boolean_enums;
 
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_auto_boolean_cmd (const char *name, command_class theclass,
+                             const char *set_doc, const char *show_doc,
+                             const char *help_doc,
+                             setting_setter_ftype<enum auto_boolean> set_func,
+                             setting_getter_ftype<enum auto_boolean> get_func,
+                             show_value_ftype *show_func,
+                             cmd_list_element **set_list,
+                             cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<enum auto_boolean> (name, theclass,
+                                                      var_auto_boolean,
+                                                      nullptr, set_doc,
+                                                      show_doc, help_doc,
+                                                      set_func, get_func,
+                                                      nullptr, show_func,
+                                                      set_list, show_list);
+
+  cmds.set->enums = auto_boolean_enums;
+
+  return cmds;
+}
+
 /* See cli-decode.h.  */
 const char * const boolean_enums[] = { "on", "off", NULL };
 
   set_show_commands commands
     = add_setshow_cmd_full<bool> (name, theclass, var_boolean, var,
                                  set_doc, show_doc, help_doc,
-                                 set_func, show_func,
+                                 nullptr, nullptr, set_func, show_func,
                                  set_list, show_list);
 
   commands.set->enums = boolean_enums;
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_boolean_cmd (const char *name, command_class theclass,
+                        const char *set_doc, const char *show_doc,
+                        const char *help_doc,
+                        setting_setter_ftype<bool> set_func,
+                        setting_getter_ftype<bool> get_func,
+                        show_value_ftype *show_func,
+                        cmd_list_element **set_list,
+                        cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<bool> (name, theclass, var_boolean, nullptr,
+                                         set_doc, show_doc, help_doc,
+                                         set_func, get_func, nullptr,
+                                         show_func, set_list, show_list);
+
+  cmds.set->enums = boolean_enums;
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  */
 
   set_show_commands commands
     = add_setshow_cmd_full<std::string> (name, theclass, var_filename, var,
                                         set_doc, show_doc, help_doc,
-                                        set_func, show_func,
-                                        set_list, show_list);
+                                        nullptr, nullptr, set_func,
+                                        show_func, set_list, show_list);
 
   set_cmd_completer (commands.set, filename_completer);
 
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_filename_cmd (const char *name, command_class theclass,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                         setting_setter_ftype<std::string> set_func,
+                         setting_getter_ftype<std::string> get_func,
+                         show_value_ftype *show_func,
+                         cmd_list_element **set_list,
+                         cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<std::string> (name, theclass, var_filename,
+                                                nullptr, set_doc, show_doc,
+                                                help_doc, set_func, get_func,
+                                                nullptr, show_func, set_list,
+                                                show_list);
+
+  set_cmd_completer (cmds.set, filename_completer);
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  */
 
 {
   set_show_commands commands
     = add_setshow_cmd_full<std::string> (name, theclass, var_string, var,
-                                        set_doc, show_doc, help_doc,
-                                        set_func, show_func,
-                                        set_list, show_list);
+                                       set_doc, show_doc, help_doc,
+                                       nullptr, nullptr, set_func,
+                                       show_func, set_list, show_list);
 
   /* Disable the default symbol completer.  */
   set_cmd_completer (commands.set, nullptr);
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_string_cmd (const char *name, command_class theclass,
+                       const char *set_doc, const char *show_doc,
+                       const char *help_doc,
+                       setting_setter_ftype<std::string> set_func,
+                       setting_getter_ftype<std::string> get_func,
+                       show_value_ftype *show_func,
+                       cmd_list_element **set_list,
+                       cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<std::string> (name, theclass, var_string,
+                                                nullptr, set_doc, show_doc,
+                                                help_doc, set_func, get_func,
+                                                nullptr, show_func, set_list,
+                                                show_list);
+
+  /* Disable the default symbol completer.  */
+  set_cmd_completer (cmds.set, nullptr);
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  */
 
   set_show_commands commands
     = add_setshow_cmd_full<std::string> (name, theclass, var_string_noescape,
                                         var, set_doc, show_doc, help_doc,
-                                        set_func, show_func, set_list,
-                                        show_list);
+                                        nullptr, nullptr, set_func, show_func,
+                                        set_list, show_list);
 
   /* Disable the default symbol completer.  */
   set_cmd_completer (commands.set, nullptr);
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_string_noescape_cmd (const char *name, command_class theclass,
+                                const char *set_doc, const char *show_doc,
+                                const char *help_doc,
+                                setting_setter_ftype<std::string> set_func,
+                                setting_getter_ftype<std::string> get_func,
+                                show_value_ftype *show_func,
+                                cmd_list_element **set_list,
+                                cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<std::string> (name, theclass,
+                                                var_string_noescape, nullptr,
+                                                set_doc, show_doc, help_doc,
+                                                set_func, get_func,
+                                                nullptr, show_func, set_list,
+                                                show_list);
+
+  /* Disable the default symbol completer.  */
+  set_cmd_completer (cmds.set, nullptr);
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  */
 
   set_show_commands commands
     = add_setshow_cmd_full<std::string> (name, theclass, var_optional_filename,
                                         var, set_doc, show_doc, help_doc,
-                                        set_func, show_func, set_list,
-                                        show_list);
+                                        nullptr, nullptr, set_func, show_func,
+                                        set_list, show_list);
 
   set_cmd_completer (commands.set, filename_completer);
 
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_optional_filename_cmd (const char *name, command_class theclass,
+                                  const char *set_doc, const char *show_doc,
+                                  const char *help_doc,
+                                  setting_setter_ftype<std::string> set_func,
+                                  setting_getter_ftype<std::string> get_func,
+                                  show_value_ftype *show_func,
+                                  cmd_list_element **set_list,
+                                  cmd_list_element **show_list)
+{
+  auto cmds =
+    add_setshow_cmd_full<std::string> (name, theclass, var_optional_filename,
+                                      nullptr, set_doc, show_doc, help_doc,
+                                      set_func, get_func, nullptr, show_func,
+                                      set_list,show_list);
+
+  set_cmd_completer (cmds.set, filename_completer);
+
+  return cmds;
+}
+
 /* Completes on literal "unlimited".  Used by integer commands that
    support a special "unlimited" value.  */
 
                         struct cmd_list_element **show_list)
 {
   set_show_commands commands
-    = add_setshow_cmd_full<int> (name, theclass, var_integer, var, set_doc,
-                                show_doc, help_doc, set_func, show_func,
-                                set_list, show_list);
+    = add_setshow_cmd_full<int> (name, theclass, var_integer, var,
+                                set_doc, show_doc, help_doc,
+                                nullptr, nullptr, set_func,
+                                show_func, set_list, show_list);
 
   set_cmd_completer (commands.set, integer_unlimited_completer);
 
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_integer_cmd (const char *name, command_class theclass,
+                        const char *set_doc, const char *show_doc,
+                        const char *help_doc,
+                        setting_setter_ftype<int> set_func,
+                        setting_getter_ftype<int> get_func,
+                        show_value_ftype *show_func,
+                        cmd_list_element **set_list,
+                        cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
+                                        set_doc, show_doc, help_doc, set_func,
+                                        get_func, nullptr, show_func, set_list,
+                                        show_list);
+
+  set_cmd_completer (cmds.set, integer_unlimited_completer);
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  CLASS is as in
    add_cmd.  VAR is address of the variable which will contain the
   set_show_commands commands
     = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger, var,
                                          set_doc, show_doc, help_doc,
-                                         set_func, show_func,
-                                         set_list, show_list);
+                                         nullptr, nullptr, set_func,
+                                         show_func, set_list, show_list);
 
   set_cmd_completer (commands.set, integer_unlimited_completer);
 
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_uinteger_cmd (const char *name, command_class theclass,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                         setting_setter_ftype<unsigned int> set_func,
+                         setting_getter_ftype<unsigned int> get_func,
+                         show_value_ftype *show_func,
+                         cmd_list_element **set_list,
+                         cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
+                                                 nullptr, set_doc, show_doc,
+                                                 help_doc, set_func, get_func,
+                                                 nullptr, show_func, set_list,
+                                                 show_list);
+
+  set_cmd_completer (cmds.set, integer_unlimited_completer);
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  CLASS is as in
    add_cmd.  VAR is address of the variable which will contain the
 {
   return add_setshow_cmd_full<int> (name, theclass, var_zinteger, var,
                                    set_doc, show_doc, help_doc,
-                                   set_func, show_func,
-                                   set_list, show_list);
+                                   nullptr, nullptr, set_func,
+                                   show_func, set_list, show_list);
+}
+
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_zinteger_cmd (const char *name, command_class theclass,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                         setting_setter_ftype<int> set_func,
+                         setting_getter_ftype<int> get_func,
+                         show_value_ftype *show_func,
+                         cmd_list_element **set_list,
+                         cmd_list_element **show_list)
+{
+  return add_setshow_cmd_full<int> (name, theclass, var_zinteger, nullptr,
+                                   set_doc, show_doc, help_doc, set_func,
+                                   get_func, nullptr, show_func, set_list,
+                                   show_list);
 }
 
 set_show_commands
 {
   set_show_commands commands
     = add_setshow_cmd_full<int> (name, theclass, var_zuinteger_unlimited, var,
-                                set_doc, show_doc, help_doc, set_func,
-                                show_func, set_list, show_list);
+                                set_doc, show_doc, help_doc, nullptr,
+                                nullptr, set_func, show_func, set_list,
+                                show_list);
 
   set_cmd_completer (commands.set, integer_unlimited_completer);
 
   return commands;
 }
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_zuinteger_unlimited_cmd (const char *name, command_class theclass,
+                                    const char *set_doc, const char *show_doc,
+                                    const char *help_doc,
+                                    setting_setter_ftype<int> set_func,
+                                    setting_getter_ftype<int> get_func,
+                                    show_value_ftype *show_func,
+                                    cmd_list_element **set_list,
+                                    cmd_list_element **show_list)
+{
+  auto cmds
+    = add_setshow_cmd_full<int> (name, theclass, var_zuinteger_unlimited,
+                                nullptr, set_doc, show_doc, help_doc, set_func,
+                                get_func, nullptr, show_func, set_list,
+                                show_list);
+
+  set_cmd_completer (cmds.set, integer_unlimited_completer);
+
+  return cmds;
+}
+
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  CLASS is as in
    add_cmd.  VAR is address of the variable which will contain the
 {
   return add_setshow_cmd_full<unsigned int> (name, theclass, var_zuinteger,
                                             var, set_doc, show_doc, help_doc,
-                                            set_func, show_func, set_list,
+                                            nullptr, nullptr, set_func,
+                                            show_func, set_list, show_list);
+}
+
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_zuinteger_cmd (const char *name, command_class theclass,
+                          const char *set_doc, const char *show_doc,
+                          const char *help_doc,
+                          setting_setter_ftype<unsigned int> set_func,
+                          setting_getter_ftype<unsigned int> get_func,
+                          show_value_ftype *show_func,
+                          cmd_list_element **set_list,
+                          cmd_list_element **show_list)
+{
+  return add_setshow_cmd_full<unsigned int> (name, theclass, var_zuinteger,
+                                            nullptr, set_doc, show_doc,
+                                            help_doc, set_func, get_func,
+                                            nullptr, show_func, set_list,
                                             show_list);
 }
 
 
   return t == var_enum;
 }
 
+/* Function signature for a callback used to get a value from a setting.  */
+
+template<typename T>
+using setting_getter_ftype = const T &(*) ();
+
+/* Function signature for a callback used to set a value to a setting.  */
+
+template<typename T>
+using setting_setter_ftype = void (*) (const T &);
+
+/* Generic/type-erased function pointer.  */
+
+using erased_func = void (*) ();
+
 /* Interface for getting and setting a setting's value.
 
    The underlying data can be of any VAR_TYPES type.  */
   struct erased_args
   {
     void *var;
+    erased_func setter;
+    erased_func getter;
   };
 
   template<typename T>
-  static erased_args erase_args (var_types var_type, T *var)
+  static erased_args erase_args (var_types var_type,
+                                T *var,
+                                setting_setter_ftype<T> set_setting_func,
+                                setting_getter_ftype<T> get_setting_func)
   {
     gdb_assert (var_type_uses<T> (var_type));
-
-    return {var};
+  /* The getter and the setter must be both provided or both omitted.  */
+    gdb_assert
+      ((set_setting_func == nullptr) == (get_setting_func == nullptr));
+
+  /* The caller must provide a pointer to a variable or get/set functions, but
+     not both.  */
+    gdb_assert ((set_setting_func == nullptr) != (var == nullptr));
+
+    return {
+       var,
+       reinterpret_cast<erased_func> (set_setting_func),
+       reinterpret_cast<erased_func> (get_setting_func)
+    };
   }
 
   /* Create a setting backed by pre-validated type-erased args.
      (see VAR_TYPE_USES).  */
   setting (var_types var_type, const erased_args &args)
     : m_var_type (var_type),
-      m_var (args.var)
+      m_var (args.var),
+      m_getter (args.getter),
+      m_setter (args.setter)
   {
   }
 
-  /* Access the type of the current setting.  */
-  var_types type () const
+  /* Create a setting backed by setter and getter functions.
+
+     Type T must match the var type VAR_TYPE (see VAR_TYPE_USES).  */
+  template<typename T>
+  setting (var_types var_type,
+          setting_setter_ftype<T> setter,
+          setting_getter_ftype<T> getter)
+    : m_var_type (var_type)
   {
-    return m_var_type;
+    gdb_assert (var_type_uses<T> (var_type));
+
+    /* Getters and setters are cast to and from the arbitrary `void (*) ()`
+       function pointer type.  Make sure that the two types are really of the
+       same size.  */
+    gdb_static_assert (sizeof (m_getter) == sizeof (getter));
+    gdb_static_assert (sizeof (m_setter) == sizeof (setter));
+
+    m_getter = reinterpret_cast<erased_func> (getter);
+    m_setter = reinterpret_cast<erased_func> (setter);
   }
 
+  /* Access the type of the current setting.  */
+  var_types type () const
+  { return m_var_type; }
+
   /* Return the current value.
 
      The template parameter T is the type of the variable used to store the
     gdb_assert (var_type_uses<T> (m_var_type));
     gdb_assert (m_var != nullptr);
 
-    return *static_cast<const T *> (m_var);
+    if (m_var == nullptr)
+      {
+       gdb_assert (m_getter != nullptr);
+       auto getter = reinterpret_cast<setting_getter_ftype<T>> (m_getter);
+       return getter ();
+      }
+    else
+      return *static_cast<const T *> (m_var);
   }
 
   /* Sets the value of the setting to V.
 
-     The template parameter T indicates the type of the variable used to
-     store the setting.
+     If we have a user-provided setter, use it to set the setting.  Otherwise
+     copy the value V to the internally referenced buffer.
+
+     The template parameter T indicates the type of the variable used to store
+     the setting.
 
      The var_type of the setting must match T.  */
   template<typename T>
        this instantiation.  */
     gdb_assert (var_type_uses<T> (m_var_type));
 
-    *static_cast<T *> (m_var) = v;
+    if (m_var == nullptr)
+      {
+       gdb_assert (m_setter != nullptr);
+       auto setter = reinterpret_cast<setting_setter_ftype<T>> (m_setter);
+       setter (v);
+      }
+    else
+      *static_cast<T *> (m_var) = v;
   }
 
 private:
-  /* The type of the variable M_VAR is pointing to.  */
+  /* The type of the variable M_VAR is pointing to, or that M_GETTER / M_SETTER
+     get or set.  */
   var_types m_var_type;
 
-  /* Pointer to the enclosed variable.  The type of the variable is encoded
-     in M_VAR_TYPE.  */
-  void *m_var;
+  /* Pointer to the enclosed variable
+
+     Either M_VAR is non-nullptr, or both M_GETTER and M_SETTER are
+     non-nullptr.  */
+  void *m_var = nullptr;
+
+  /* Pointer to a user provided getter.  */
+  erased_func m_getter = nullptr;
+
+  /* Pointer to a user provided setter.  */
+  erased_func m_setter = nullptr;
 };
 
 /* This structure records one command'd definition.  */
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_enum_cmd
+  (const char *name, command_class theclass, const char *const *enumlist,
+   const char *set_doc, const char *show_doc,
+   const char *help_doc, setting_setter_ftype<const char *> set_func,
+   setting_getter_ftype<const char *> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_auto_boolean_cmd
   (const char *name, command_class theclass, auto_boolean *var,
    const char *set_doc, const char *show_doc, const char *help_doc,
    cmd_func_ftype *set_func, show_value_ftype *show_func,
    cmd_list_element **set_list, cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_auto_boolean_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<enum auto_boolean> set_func,
+   setting_getter_ftype<enum auto_boolean> get_func,
+   show_value_ftype *show_func, cmd_list_element **set_list,
+   cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_boolean_cmd
   (const char *name, command_class theclass, bool *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_boolean_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<bool> set_func,
+   setting_getter_ftype<bool> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_filename_cmd
   (const char *name, command_class theclass, std::string *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_filename_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<std::string> set_func,
+   setting_getter_ftype<std::string> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_string_cmd
   (const char *name, command_class theclass, std::string *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_string_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<std::string> set_func,
+   setting_getter_ftype<std::string> get_func,
+   show_value_ftype *show_func, cmd_list_element **set_list,
+   cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_string_noescape_cmd
   (const char *name, command_class theclass, std::string *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_string_noescape_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<std::string> set_func,
+   setting_getter_ftype<std::string> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_optional_filename_cmd
   (const char *name, command_class theclass, std::string *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_optional_filename_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<std::string> set_func,
+   setting_getter_ftype<std::string> get_func,
+   show_value_ftype *show_func, cmd_list_element **set_list,
+   cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_integer_cmd
   (const char *name, command_class theclass, int *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_integer_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<int> set_func,
+   setting_getter_ftype<int> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_uinteger_cmd
   (const char *name, command_class theclass, unsigned int *var,
    const char *set_doc, const char *show_doc, const char *help_doc,
    cmd_func_ftype *set_func, show_value_ftype *show_func,
    cmd_list_element **set_list, cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_uinteger_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<unsigned int> set_func,
+   setting_getter_ftype<unsigned int> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_zinteger_cmd
   (const char *name, command_class theclass, int *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_zinteger_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<int> set_func,
+   setting_getter_ftype<int> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_zuinteger_cmd
   (const char *name, command_class theclass, unsigned int *var,
    const char *set_doc, const char *show_doc, const char *help_doc,
    cmd_func_ftype *set_func, show_value_ftype *show_func,
    cmd_list_element **set_list, cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_zuinteger_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<unsigned int> set_func,
+   setting_getter_ftype<unsigned int> get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_zuinteger_unlimited_cmd
   (const char *name, command_class theclass, int *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
    cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_zuinteger_unlimited_cmd
+  (const char *name, command_class theclass, const char *set_doc,
+   const char *show_doc, const char *help_doc,
+   setting_setter_ftype<int> set_func, setting_getter_ftype<int> get_func,
+   show_value_ftype *show_func, cmd_list_element **set_list,
+   cmd_list_element **show_list);
+
 /* Do a "show" command for each thing on a command list.  */
 
 extern void cmd_show_list (struct cmd_list_element *, int);