+BookmarksSection::BookmarkPosList
+BookmarksSection::bookmarksInPar(FileName const & fn, int const par_id) const
+{
+ // FIXME: we do not consider the case of bottom_pit.
+ // This is probably not a problem.
+ BookmarksSection::BookmarkPosList bip;
+ for (size_t i = 1; i < bookmarks.size(); ++i)
+ if (bookmarks[i].filename == fn && bookmarks[i].top_id == par_id)
+ bip.push_back({i, bookmarks[i].top_pos});
+
+ return bip;
+}
+
+
+void BookmarksSection::adjustPosAfterPos(FileName const & fn,
+ int const par_id, pos_type pos, int offset)
+{
+ for (Bookmark & bkm : bookmarks)
+ if (bkm.filename == fn && bkm.top_id == par_id && bkm.top_pos > pos)
+ bkm.top_pos += offset;
+}
+
+
+LastCommandsSection::LastCommandsSection(unsigned int num) :
+ default_num_last_commands(30),
+ absolute_max_last_commands(100)
+{
+ setNumberOfLastCommands(num);
+}
+
+
+void LastCommandsSection::read(istream & is)
+{
+ string tmp;
+ do {
+ char c = is.peek();
+ if (c == '[')
+ break;
+ getline(is, tmp);
+ if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ')
+ continue;
+
+ lastcommands.push_back(tmp);
+ } while (is.good());
+}
+
+
+void LastCommandsSection::write(ostream & os) const
+{
+ os << '\n' << sec_lastcommands << '\n';
+ copy(lastcommands.begin(), lastcommands.end(),
+ ostream_iterator<std::string>(os, "\n"));
+}
+
+
+void LastCommandsSection::setNumberOfLastCommands(unsigned int no)
+{
+ if (0 < no && no <= absolute_max_last_commands)
+ num_lastcommands = no;
+ else {
+ LYXERR(Debug::INIT, "LyX: session: too many last commands\n"
+ << "\tdefault (=" << default_num_last_commands << ") used.");
+ num_lastcommands = default_num_last_commands;
+ }
+}
+
+
+void LastCommandsSection::add(std::string const & command)
+{
+ // remove traces of 'command' in history using the erase-remove idiom
+ // https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom
+ lastcommands.erase(remove(lastcommands.begin(), lastcommands.end(), command),
+ lastcommands.end());
+ // add it at the end of the list.
+ lastcommands.push_back(command);
+}
+
+
+void LastCommandsSection::clear()
+{
+ lastcommands.clear();
+}
+
+
+Session::Session(unsigned int num_last_files, unsigned int num_last_commands) :
+ last_files(num_last_files), last_commands(num_last_commands)