]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
de.po: update
[lyx.git] / src / Buffer.cpp
index f6773d59c93e4ebe234a219ec2cd7a5a37d369d8..294c7a1092ee5a03151f6cca1cfc81f6da28f9ec 100644 (file)
@@ -289,8 +289,6 @@ public:
        mutable BiblioInfo bibinfo_;
        /// whether the bibinfo cache is valid
        mutable bool bibinfo_cache_valid_;
-       /// whether the bibfile cache is valid
-       mutable bool bibfile_cache_valid_;
        /// Cache of timestamps of .bib files
        map<FileName, time_t> bibfile_status_;
        /// Indicates whether the bibinfo has changed since the last time
@@ -343,10 +341,8 @@ public:
                if (!cloned_buffer_ && parent_buffer && pb)
                        LYXERR0("Warning: a buffer should not have two parents!");
                parent_buffer = pb;
-               if (!cloned_buffer_ && parent_buffer) {
-                       parent_buffer->invalidateBibfileCache();
+               if (!cloned_buffer_ && parent_buffer)
                        parent_buffer->invalidateBibinfoCache();
-               }
        }
 
        /// If non zero, this buffer is a clone of existing buffer \p cloned_buffer_
@@ -432,7 +428,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_,
          file_fully_loaded(false), file_format(LYX_FORMAT), need_format_backup(false),
          ignore_parent(false),  toc_backend(owner), macro_lock(false),
          checksum_(0), wa_(0),  gui_(0), undo_(*owner), bibinfo_cache_valid_(false),
-         bibfile_cache_valid_(false), cite_labels_valid_(false), preview_error_(false),
+         cite_labels_valid_(false), preview_error_(false),
          inset(0), preview_loader_(0), cloned_buffer_(cloned_buffer),
          clone_list_(0), doing_export(false),
          tracked_changes_present_(0), externally_modified_(false), parent_buffer(0),
@@ -452,7 +448,6 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_,
        bibfiles_cache_ = cloned_buffer_->d->bibfiles_cache_;
        bibinfo_ = cloned_buffer_->d->bibinfo_;
        bibinfo_cache_valid_ = cloned_buffer_->d->bibinfo_cache_valid_;
-       bibfile_cache_valid_ = cloned_buffer_->d->bibfile_cache_valid_;
        bibfile_status_ = cloned_buffer_->d->bibfile_status_;
        cite_labels_valid_ = cloned_buffer_->d->cite_labels_valid_;
        unnamed = cloned_buffer_->d->unnamed;
@@ -504,10 +499,8 @@ Buffer::~Buffer()
                // ourselves as a child.
                d->clone_list_->erase(this);
                // loop over children
-               Impl::BufferPositionMap::iterator it = d->children_positions.begin();
-               Impl::BufferPositionMap::iterator end = d->children_positions.end();
-               for (; it != end; ++it) {
-                       Buffer * child = const_cast<Buffer *>(it->first);
+               for (auto const & p : d->children_positions) {
+                       Buffer * child = const_cast<Buffer *>(p.first);
                                if (d->clone_list_->erase(child))
                                        delete child;
                }
@@ -533,10 +526,8 @@ Buffer::~Buffer()
                d->position_to_children.clear();
        } else {
                // loop over children
-               Impl::BufferPositionMap::iterator it = d->children_positions.begin();
-               Impl::BufferPositionMap::iterator end = d->children_positions.end();
-               for (; it != end; ++it) {
-                       Buffer * child = const_cast<Buffer *>(it->first);
+               for (auto const & p : d->children_positions) {
+                       Buffer * child = const_cast<Buffer *>(p.first);
                        if (theBufferList().isLoaded(child)) {
                                if (theBufferList().isOthersChild(this, child))
                                        child->setParent(0);
@@ -614,12 +605,10 @@ void Buffer::cloneWithChildren(BufferMap & bufmap, CloneList * clones) const
        // math macro caches need to be rethought and simplified.
        // I am not sure wether we should handle Buffer cloning here or in BufferList.
        // Right now BufferList knows nothing about buffer clones.
-       Impl::PositionScopeBufferMap::iterator it = d->position_to_children.begin();
-       Impl::PositionScopeBufferMap::iterator end = d->position_to_children.end();
-       for (; it != end; ++it) {
-               DocIterator dit = it->first.clone(buffer_clone);
+       for (auto const & p : d->position_to_children) {
+               DocIterator dit = p.first.clone(buffer_clone);
                dit.setBuffer(buffer_clone);
-               Buffer * child = const_cast<Buffer *>(it->second.buffer);
+               Buffer * child = const_cast<Buffer *>(p.second.buffer);
 
                child->cloneWithChildren(bufmap, clones);
                BufferMap::iterator const bit = bufmap.find(child);
@@ -712,10 +701,8 @@ BufferParams const & Buffer::masterParams() const
 
        BufferParams & mparams = const_cast<Buffer *>(masterBuffer())->params();
        // Copy child authors to the params. We need those pointers.
-       AuthorList const & child_authors = params().authors();
-       AuthorList::Authors::const_iterator it = child_authors.begin();
-       for (; it != child_authors.end(); ++it)
-               mparams.authors().record(*it);
+       for (Author const & a : params().authors())
+               mparams.authors().record(a);
        return mparams;
 }
 
@@ -1071,10 +1058,8 @@ bool Buffer::readDocument(Lexer & lex)
        // inform parent buffer about local macros
        if (parent()) {
                Buffer const * pbuf = parent();
-               UserMacroSet::const_iterator cit = usermacros.begin();
-               UserMacroSet::const_iterator end = usermacros.end();
-               for (; cit != end; ++cit)
-                       pbuf->usermacros.insert(*cit);
+               for (auto const & m : usermacros)
+                       pbuf->usermacros.insert(m);
        }
        usermacros.clear();
        updateMacros();
@@ -1625,16 +1610,14 @@ bool Buffer::write(ostream & ofs) const
        // Important: Keep the version formatting in sync with lyx2lyx and
        //            tex2lyx (bug 7951)
        ofs << "#LyX " << lyx_version_major << "." << lyx_version_minor
-           << " created this file. For more info see http://www.lyx.org/\n"
+           << " created this file. For more info see https://www.lyx.org/\n"
            << "\\lyxformat " << LYX_FORMAT << "\n"
            << "\\begin_document\n";
 
        /// For each author, set 'used' to true if there is a change
        /// by this author in the document; otherwise set it to 'false'.
-       AuthorList::Authors::const_iterator a_it = params().authors().begin();
-       AuthorList::Authors::const_iterator a_end = params().authors().end();
-       for (; a_it != a_end; ++a_it)
-               a_it->setUsed(false);
+       for (Author const & a : params().authors())
+               a.setUsed(false);
 
        ParIterator const end = const_cast<Buffer *>(this)->par_iterator_end();
        ParIterator it = const_cast<Buffer *>(this)->par_iterator_begin();
@@ -1811,7 +1794,7 @@ void Buffer::writeLaTeXSource(otexstream & os,
        // first paragraph of the document. (Asger)
        if (output_preamble && runparams.nice) {
                os << "%% LyX " << lyx_version << " created this file.  "
-                       "For more info, see http://www.lyx.org/.\n"
+                       "For more info, see https://www.lyx.org/.\n"
                        "%% Do not edit unless you really know what "
                        "you are doing.\n";
        }
@@ -1904,7 +1887,7 @@ void Buffer::writeLaTeXSource(otexstream & os,
                // Biblatex bibliographies are loaded here
                if (params().useBiblatex()) {
                        vector<docstring> const bibfiles =
-                               prepareBibFilePaths(runparams, getBibfilesCache(), true);
+                               prepareBibFilePaths(runparams, getBibfiles(), true);
                        for (docstring const & file: bibfiles)
                                os << "\\addbibresource{" << file << "}\n";
                }
@@ -1917,10 +1900,10 @@ void Buffer::writeLaTeXSource(otexstream & os,
                        vector<string> pll = features.getPolyglossiaExclusiveLanguages();
                        if (!bll.empty()) {
                                docstring langs;
-                               for (vector<string>::const_iterator it = bll.begin(); it != bll.end(); ++it) {
+                               for (string const & sit : bll) {
                                        if (!langs.empty())
                                                langs += ", ";
-                                       langs += _(*it);
+                                       langs += _(sit);
                                }
                                blangs = bll.size() > 1 ?
                                            bformat(_("The languages %1$s are only supported by Babel."), langs)
@@ -1928,10 +1911,10 @@ void Buffer::writeLaTeXSource(otexstream & os,
                        }
                        if (!pll.empty()) {
                                docstring langs;
-                               for (vector<string>::const_iterator it = pll.begin(); it != pll.end(); ++it) {
+                               for (string const & pit : pll) {
                                        if (!langs.empty())
                                                langs += ", ";
-                                       langs += _(*it);
+                                       langs += _(pit);
                                }
                                plangs = pll.size() > 1 ?
                                            bformat(_("The languages %1$s are only supported by Polyglossia."), langs)
@@ -1971,10 +1954,8 @@ void Buffer::writeLaTeXSource(otexstream & os,
                os.lastChar('\n');
 
                // output the parent macros
-               MacroSet::iterator it = parentMacros.begin();
-               MacroSet::iterator end = parentMacros.end();
-               for (; it != end; ++it) {
-                       int num_lines = (*it)->write(os.os(), true);
+               for (auto const & mac : parentMacros) {
+                       int num_lines = mac->write(os.os(), true);
                        os.texrow().newlines(num_lines);
                }
 
@@ -2057,7 +2038,7 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname,
                        os << from_ascii(tclass.class_header());
                else if (runparams.flavor == OutputParams::XML)
                        os << "PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\" "
-                           << "\"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\"";
+                           << "\"https://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\"";
                else
                        os << " PUBLIC \"-//OASIS//DTD DocBook V4.2//EN\"";
 
@@ -2096,7 +2077,7 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname,
 
                os << "<!-- " << ((runparams.flavor == OutputParams::XML)? "XML" : "SGML")
                                << " file was created by LyX " << lyx_version
-                               << "\n  See http://www.lyx.org/ for more information -->\n";
+                               << "\n  See https://www.lyx.org/ for more information -->\n";
 
                params().documentClass().counters().reset();
 
@@ -2313,56 +2294,18 @@ void Buffer::getLabelList(vector<docstring> & list) const
 
        list.clear();
        shared_ptr<Toc> toc = d->toc_backend.toc("label");
-       Toc::const_iterator toc_it = toc->begin();
-       Toc::const_iterator end = toc->end();
-       for (; toc_it != end; ++toc_it) {
-               if (toc_it->depth() == 0)
-                       list.push_back(toc_it->str());
+       for (auto const & tocit : *toc) {
+               if (tocit.depth() == 0)
+                       list.push_back(tocit.str());
        }
 }
 
 
-void Buffer::updateBibfilesCache(UpdateScope scope) const
-{
-       // FIXME This is probably unnecssary, given where we call this.
-       // If this is a child document, use the parent's cache instead.
-       if (parent() && scope != UpdateChildOnly) {
-               masterBuffer()->updateBibfilesCache();
-               return;
-       }
-
-       d->bibfiles_cache_.clear();
-       for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
-               if (it->lyxCode() == BIBTEX_CODE) {
-                       InsetBibtex const & inset = static_cast<InsetBibtex const &>(*it);
-                       FileNamePairList const bibfiles = inset.getBibFiles();
-                       d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
-                               bibfiles.begin(),
-                               bibfiles.end());
-               } else if (it->lyxCode() == INCLUDE_CODE) {
-                       InsetInclude & inset = static_cast<InsetInclude &>(*it);
-                       Buffer const * const incbuf = inset.getChildBuffer();
-                       if (!incbuf)
-                               continue;
-                       FileNamePairList const & bibfiles =
-                                       incbuf->getBibfilesCache(UpdateChildOnly);
-                       if (!bibfiles.empty()) {
-                               d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
-                                       bibfiles.begin(),
-                                       bibfiles.end());
-                       }
-               }
-       }
-       d->bibfile_cache_valid_ = true;
-       d->bibinfo_cache_valid_ = false;
-       d->cite_labels_valid_ = false;
-}
-
-
 void Buffer::invalidateBibinfoCache() const
 {
        d->bibinfo_cache_valid_ = false;
        d->cite_labels_valid_ = false;
+       removeBiblioTempFiles();
        // also invalidate the cache for the parent buffer
        Buffer const * const pbuf = d->parent();
        if (pbuf)
@@ -2370,29 +2313,13 @@ void Buffer::invalidateBibinfoCache() const
 }
 
 
-void Buffer::invalidateBibfileCache() const
-{
-       d->bibfile_cache_valid_ = false;
-       d->bibinfo_cache_valid_ = false;
-       d->cite_labels_valid_ = false;
-       // also invalidate the cache for the parent buffer
-       Buffer const * const pbuf = d->parent();
-       if (pbuf)
-               pbuf->invalidateBibfileCache();
-}
-
-
-FileNamePairList const & Buffer::getBibfilesCache(UpdateScope scope) const
+FileNamePairList const & Buffer::getBibfiles(UpdateScope scope) const
 {
        // FIXME This is probably unnecessary, given where we call this.
-       // If this is a child document, use the master's cache instead.
+       // If this is a child document, use the master instead.
        Buffer const * const pbuf = masterBuffer();
        if (pbuf != this && scope != UpdateChildOnly)
-               return pbuf->getBibfilesCache();
-
-       if (!d->bibfile_cache_valid_)
-               this->updateBibfilesCache(scope);
-
+               return pbuf->getBibfiles();
        return d->bibfiles_cache_;
 }
 
@@ -2406,6 +2333,20 @@ BiblioInfo const & Buffer::masterBibInfo() const
 }
 
 
+void Buffer::registerBibfiles(FileNamePairList const & bf) const {
+       Buffer const * const tmp = masterBuffer();
+       if (tmp != this)
+               return tmp->registerBibfiles(bf);
+
+       for (auto const & p : bf) {
+               FileNamePairList::const_iterator temp =
+                       find(d->bibfiles_cache_.begin(), d->bibfiles_cache_.end(), p);
+               if (temp == d->bibfiles_cache_.end())
+                       d->bibfiles_cache_.push_back(p);
+       }
+}
+
+
 void Buffer::checkIfBibInfoCacheIsValid() const
 {
        // use the master's cache
@@ -2415,8 +2356,13 @@ void Buffer::checkIfBibInfoCacheIsValid() const
                return;
        }
 
+       // if we already know the cache is invalid, no need to check
+       // the timestamps
+       if (!d->bibinfo_cache_valid_)
+               return;
+
        // compare the cached timestamps with the actual ones.
-       FileNamePairList const & bibfiles_cache = getBibfilesCache();
+       FileNamePairList const & bibfiles_cache = getBibfiles();
        FileNamePairList::const_iterator ei = bibfiles_cache.begin();
        FileNamePairList::const_iterator en = bibfiles_cache.end();
        for (; ei != en; ++ ei) {
@@ -2446,15 +2392,16 @@ void Buffer::reloadBibInfoCache() const
                return;
 
        d->bibinfo_.clear();
-       collectBibKeys();
+       FileNameList checkedFiles;
+       collectBibKeys(checkedFiles);
        d->bibinfo_cache_valid_ = true;
 }
 
 
-void Buffer::collectBibKeys() const
+void Buffer::collectBibKeys(FileNameList & checkedFiles) const
 {
        for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
-               it->collectBibKeys(it);
+               it->collectBibKeys(it, checkedFiles);
 }
 
 
@@ -2649,7 +2596,8 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
        string const argument = to_utf8(func.argument());
        // We'll set this back to false if need be.
        bool dispatched = true;
-       undo().beginUndoGroup();
+       // This handles undo groups automagically
+       UndoGroupHelper ugh(this);
 
        switch (func.action()) {
        case LFUN_BUFFER_TOGGLE_READ_ONLY:
@@ -2774,18 +2722,16 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
        }
 
        case LFUN_BRANCH_ADD: {
-               docstring branch_name = func.argument();
-               if (branch_name.empty()) {
+               docstring branchnames = func.argument();
+               if (branchnames.empty()) {
                        dispatched = false;
                        break;
                }
                BranchList & branch_list = params().branchlist();
                vector<docstring> const branches =
-                       getVectorFromString(branch_name, branch_list.separator());
+                       getVectorFromString(branchnames, branch_list.separator());
                docstring msg;
-               for (vector<docstring>::const_iterator it = branches.begin();
-                    it != branches.end(); ++it) {
-                       branch_name = *it;
+               for (docstring const & branch_name : branches) {
                        Branch * branch = branch_list.find(branch_name);
                        if (branch) {
                                LYXERR0("Branch " << branch_name << " already exists.");
@@ -2901,7 +2847,6 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
        }
        dr.dispatched(dispatched);
-       undo().endUndoGroup();
 }
 
 
@@ -2929,26 +2874,24 @@ bool Buffer::isMultiLingual() const
 
 std::set<Language const *> Buffer::getLanguages() const
 {
-       std::set<Language const *> languages;
-       getLanguages(languages);
-       return languages;
+       std::set<Language const *> langs;
+       getLanguages(langs);
+       return langs;
 }
 
 
-void Buffer::getLanguages(std::set<Language const *> & languages) const
+void Buffer::getLanguages(std::set<Language const *> & langs) const
 {
        ParConstIterator end = par_iterator_end();
        // add the buffer language, even if it's not actively used
-       languages.insert(language());
+       langs.insert(language());
        // iterate over the paragraphs
        for (ParConstIterator it = par_iterator_begin(); it != end; ++it)
-               it->getLanguages(languages);
+               it->getLanguages(langs);
        // also children
        ListOfBuffers clist = getDescendents();
-       ListOfBuffers::const_iterator cit = clist.begin();
-       ListOfBuffers::const_iterator const cen = clist.end();
-       for (; cit != cen; ++cit)
-               (*cit)->getLanguages(languages);
+       for (auto const & cit : clist)
+               cit->getLanguages(langs);
 }
 
 
@@ -3082,11 +3025,8 @@ void Buffer::markDirty()
        }
        d->bak_clean = false;
 
-       DepClean::iterator it = d->dep_clean.begin();
-       DepClean::const_iterator const end = d->dep_clean.end();
-
-       for (; it != end; ++it)
-               it->second = false;
+       for (auto & depit : d->dep_clean)
+               depit.second = false;
 }
 
 
@@ -3168,10 +3108,8 @@ vector<docstring> const Buffer::prepareBibFilePaths(OutputParams const & runpara
        // check for spaces in paths
        bool found_space = false;
 
-       FileNamePairList::const_iterator it = bibfilelist.begin();
-       FileNamePairList::const_iterator en = bibfilelist.end();
-       for (; it != en; ++it) {
-               string utf8input = to_utf8(it->first);
+       for (auto const & bit : bibfilelist) {
+               string utf8input = to_utf8(bit.first);
                string database =
                        prepareFileNameForLaTeX(utf8input, ".bib", runparams.nice);
                FileName const try_in_file =
@@ -3333,10 +3271,8 @@ bool Buffer::hasChildren() const
 void Buffer::collectChildren(ListOfBuffers & clist, bool grand_children) const
 {
        // loop over children
-       Impl::BufferPositionMap::iterator it = d->children_positions.begin();
-       Impl::BufferPositionMap::iterator end = d->children_positions.end();
-       for (; it != end; ++it) {
-               Buffer * child = const_cast<Buffer *>(it->first);
+       for (auto const & p : d->children_positions) {
+               Buffer * child = const_cast<Buffer *>(p.first);
                // No duplicates
                ListOfBuffers::const_iterator bit = find(clist.begin(), clist.end(), child);
                if (bit != clist.end())
@@ -3533,17 +3469,15 @@ void Buffer::Impl::updateMacros(DocIterator & it, DocIterator & scope)
        while (it.pit() <= lastpit) {
                Paragraph & par = it.paragraph();
 
+               // FIXME Can this be done with the new-style iterators?
                // iterate over the insets of the current paragraph
-               InsetList const & insets = par.insetList();
-               InsetList::const_iterator iit = insets.begin();
-               InsetList::const_iterator end = insets.end();
-               for (; iit != end; ++iit) {
-                       it.pos() = iit->pos;
+               for (auto const & insit : par.insetList()) {
+                       it.pos() = insit.pos;
 
                        // is it a nested text inset?
-                       if (iit->inset->asInsetText()) {
+                       if (insit.inset->asInsetText()) {
                                // Inset needs its own scope?
-                               InsetText const * itext = iit->inset->asInsetText();
+                               InsetText const * itext = insit.inset->asInsetText();
                                bool newScope = itext->isMacroScope();
 
                                // scope which ends just behind the inset
@@ -3551,14 +3485,14 @@ void Buffer::Impl::updateMacros(DocIterator & it, DocIterator & scope)
                                ++insetScope.pos();
 
                                // collect macros in inset
-                               it.push_back(CursorSlice(*iit->inset));
+                               it.push_back(CursorSlice(*insit.inset));
                                updateMacros(it, newScope ? insetScope : scope);
                                it.pop_back();
                                continue;
                        }
 
-                       if (iit->inset->asInsetTabular()) {
-                               CursorSlice slice(*iit->inset);
+                       if (insit.inset->asInsetTabular()) {
+                               CursorSlice slice(*insit.inset);
                                size_t const numcells = slice.nargs();
                                for (; slice.idx() < numcells; slice.forwardIdx()) {
                                        it.push_back(slice);
@@ -3569,12 +3503,12 @@ void Buffer::Impl::updateMacros(DocIterator & it, DocIterator & scope)
                        }
 
                        // is it an external file?
-                       if (iit->inset->lyxCode() == INCLUDE_CODE) {
+                       if (insit.inset->lyxCode() == INCLUDE_CODE) {
                                // get buffer of external file
-                               InsetInclude const & inset =
-                                       static_cast<InsetInclude const &>(*iit->inset);
+                               InsetInclude const & incinset =
+                                       static_cast<InsetInclude const &>(*insit.inset);
                                macro_lock = true;
-                               Buffer * child = inset.getChildBuffer();
+                               Buffer * child = incinset.getChildBuffer();
                                macro_lock = false;
                                if (!child)
                                        continue;
@@ -3590,19 +3524,19 @@ void Buffer::Impl::updateMacros(DocIterator & it, DocIterator & scope)
                                continue;
                        }
 
-                       InsetMath * im = iit->inset->asInsetMath();
+                       InsetMath * im = insit.inset->asInsetMath();
                        if (doing_export && im)  {
                                InsetMathHull * hull = im->asHullInset();
                                if (hull)
                                        hull->recordLocation(it);
                        }
 
-                       if (iit->inset->lyxCode() != MATHMACRO_CODE)
+                       if (insit.inset->lyxCode() != MATHMACRO_CODE)
                                continue;
 
                        // get macro data
                        InsetMathMacroTemplate & macroTemplate =
-                               *iit->inset->asInsetMath()->asMacroTemplate();
+                               *insit.inset->asInsetMath()->asMacroTemplate();
                        MacroContext mc(owner_, it);
                        macroTemplate.updateToContext(mc);
 
@@ -3712,16 +3646,12 @@ void Buffer::listMacroNames(MacroNameSet & macros) const
        d->macro_lock = true;
 
        // loop over macro names
-       Impl::NamePositionScopeMacroMap::iterator nameIt = d->macros.begin();
-       Impl::NamePositionScopeMacroMap::iterator nameEnd = d->macros.end();
-       for (; nameIt != nameEnd; ++nameIt)
-               macros.insert(nameIt->first);
+       for (auto const & nameit : d->macros)
+               macros.insert(nameit.first);
 
        // loop over children
-       Impl::BufferPositionMap::iterator it = d->children_positions.begin();
-       Impl::BufferPositionMap::iterator end = d->children_positions.end();
-       for (; it != end; ++it) {
-               Buffer * child = const_cast<Buffer *>(it->first);
+       for (auto const & p : d->children_positions) {
+               Buffer * child = const_cast<Buffer *>(p.first);
                // The buffer might have been closed (see #10766).
                if (theBufferList().isLoaded(child))
                        child->listMacroNames(macros);
@@ -3746,12 +3676,9 @@ void Buffer::listParentMacros(MacroSet & macros, LaTeXFeatures & features) const
        pbuf->listMacroNames(names);
 
        // resolve macros
-       MacroNameSet::iterator it = names.begin();
-       MacroNameSet::iterator end = names.end();
-       for (; it != end; ++it) {
+       for (auto const & mit : names) {
                // defined?
-               MacroData const * data =
-               pbuf->getMacro(*it, *this, false);
+               MacroData const * data = pbuf->getMacro(mit, *this, false);
                if (data) {
                        macros.insert(data);
 
@@ -3820,20 +3747,16 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to)
        reloadBibInfoCache();
 
        // Check if the label 'from' appears more than once
-       BiblioInfo const & keys = masterBibInfo();
-       BiblioInfo::const_iterator bit  = keys.begin();
-       BiblioInfo::const_iterator bend = keys.end();
        vector<docstring> labels;
-
-       for (; bit != bend; ++bit)
-               // FIXME UNICODE
-               labels.push_back(bit->first);
+       for (auto const & bibit : masterBibInfo())
+               labels.push_back(bibit.first);
 
        if (count(labels.begin(), labels.end(), from) > 1)
                return;
 
        string const paramName = "key";
-       for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
+       InsetIterator it = inset_iterator_begin(inset());
+       for (; it; ++it) {
                if (it->lyxCode() != CITE_CODE)
                        continue;
                InsetCommand * inset = it->asInsetCommand();
@@ -4184,10 +4107,8 @@ void Buffer::setExportStatus(bool e) const
 {
        d->doing_export = e;
        ListOfBuffers clist = getDescendents();
-       ListOfBuffers::const_iterator cit = clist.begin();
-       ListOfBuffers::const_iterator const cen = clist.end();
-       for (; cit != cen; ++cit)
-               (*cit)->d->doing_export = e;
+       for (auto const & bit : clist)
+               bit->d->doing_export = e;
 }
 
 
@@ -4271,11 +4192,10 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                // Get shortest path to format
                converters.buildGraph();
                Graph::EdgePath path;
-               for (vector<string>::const_iterator it = backs.begin();
-                    it != backs.end(); ++it) {
-                       Graph::EdgePath p = converters.getPath(*it, format);
+               for (string const & sit : backs) {
+                       Graph::EdgePath p = converters.getPath(sit, format);
                        if (!p.empty() && (path.empty() || p.size() < path.size())) {
-                               backend_format = *it;
+                               backend_format = sit;
                                path = p;
                        }
                }
@@ -4290,10 +4210,8 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                        return ExportNoPathToFormat;
                }
                runparams.flavor = converters.getFlavor(path, this);
-               Graph::EdgePath::const_iterator it = path.begin();
-               Graph::EdgePath::const_iterator en = path.end();
-               for (; it != en; ++it)
-                       if (theConverters().get(*it).nice()) {
+               for (auto const & edge : path)
+                       if (theConverters().get(edge).nice()) {
                                need_nice_file = true;
                                break;
                        }
@@ -4379,20 +4297,18 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                        errors(error_type);
                // also to the children, in case of master-buffer-view
                ListOfBuffers clist = getDescendents();
-               ListOfBuffers::const_iterator cit = clist.begin();
-               ListOfBuffers::const_iterator const cen = clist.end();
-               for (; cit != cen; ++cit) {
+               for (auto const & bit : clist) {
                        if (runparams.silent)
-                               (*cit)->d->errorLists[error_type].clear();
+                               bit->d->errorLists[error_type].clear();
                        else if (d->cloned_buffer_) {
                                // Enable reverse search by copying back the
                                // texrow object to the cloned buffer.
                                // FIXME: this is not thread safe.
-                               (*cit)->d->cloned_buffer_->d->texrow = (*cit)->d->texrow;
-                               (*cit)->d->cloned_buffer_->d->errorLists[error_type] =
-                                       (*cit)->d->errorLists[error_type];
+                               bit->d->cloned_buffer_->d->texrow = bit->d->texrow;
+                               bit->d->cloned_buffer_->d->errorLists[error_type] =
+                                       bit->d->errorLists[error_type];
                        } else
-                               (*cit)->errors(error_type, true);
+                               bit->errors(error_type, true);
                }
        }
 
@@ -4402,8 +4318,8 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                // FIXME: There is a possibility of concurrent access to texrow
                // here from the main GUI thread that should be securized.
                d->cloned_buffer_->d->texrow = d->texrow;
-               string const error_type = params().bufferFormat();
-               d->cloned_buffer_->d->errorLists[error_type] = d->errorLists[error_type];
+               string const err_type = params().bufferFormat();
+               d->cloned_buffer_->d->errorLists[error_type] = d->errorLists[err_type];
        }
 
 
@@ -4426,11 +4342,13 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                                 : force_overwrite == ALL_FILES;
        CopyStatus status = use_force ? FORCE : SUCCESS;
 
-       vector<ExportedFile>::const_iterator it = files.begin();
-       vector<ExportedFile>::const_iterator const en = files.end();
-       for (; it != en && status != CANCEL; ++it) {
-               string const fmt = theFormats().getFormatFromFile(it->sourceName);
-               string fixedName = it->exportName;
+       for (ExportedFile const & exp : files) {
+               if (status == CANCEL) {
+                       message(_("Document export cancelled."));
+                       return ExportCancel;
+               }
+               string const fmt = theFormats().getFormatFromFile(exp.sourceName);
+               string fixedName = exp.exportName;
                if (!runparams.export_folder.empty()) {
                        // Relative pathnames starting with ../ will be sanitized
                        // if exporting to a different folder
@@ -4439,16 +4357,12 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                }
                FileName fixedFileName = makeAbsPath(fixedName, dest);
                fixedFileName.onlyPath().createPath();
-               status = copyFile(fmt, it->sourceName,
+               status = copyFile(fmt, exp.sourceName,
                        fixedFileName,
-                       it->exportName, status == FORCE,
+                       exp.exportName, status == FORCE,
                        runparams.export_folder.empty());
        }
 
-       if (status == CANCEL) {
-               message(_("Document export cancelled."));
-               return ExportCancel;
-       }
 
        if (tmp_result_file.exists()) {
                // Finally copy the main file
@@ -4707,10 +4621,16 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        Buffer const * const master = masterBuffer();
        DocumentClass const & textclass = master->params().documentClass();
 
+       FileNamePairList old_bibfiles;
        // do this only if we are the top-level Buffer
        if (master == this) {
                textclass.counters().reset(from_ascii("bibitem"));
                reloadBibInfoCache();
+               // we will re-read this cache as we go through, but we need
+               // to know whether it's changed to know whether we need to
+               // update the bibinfo cache.
+               old_bibfiles = d->bibfiles_cache_;
+               d->bibfiles_cache_.clear();
        }
 
        // keep the buffers to be children in this set. If the call from the
@@ -4726,7 +4646,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
                        // not updated during the updateBuffer call and TocModel::toc_ is invalid
                        // (bug 5699). The same happens if the master buffer is open in a different
                        // window. This test catches both possibilities.
-                       // See: http://marc.info/?l=lyx-devel&m=138590578911716&w=2
+                       // See: https://marc.info/?l=lyx-devel&m=138590578911716&w=2
                        // There remains a problem here: If there is another child open in yet a third
                        // window, that TOC is not updated. So some more general solution is needed at
                        // some point.
@@ -4756,14 +4676,30 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        ParIterator parit = cbuf.par_iterator_begin();
        updateBuffer(parit, utype);
 
+       // If this document has siblings, then update the TocBackend later. The
+       // reason is to ensure that later siblings are up to date when e.g. the
+       // broken or not status of references is computed. The update is called
+       // in InsetInclude::addToToc.
        if (master != this)
-               // If this document has siblings, then update the TocBackend later. The
-               // reason is to ensure that later siblings are up to date when e.g. the
-               // broken or not status of references is computed. The update is called
-               // in InsetInclude::addToToc.
                return;
 
-       d->bibinfo_cache_valid_ = true;
+       // if the bibfiles changed, the cache of bibinfo is invalid
+       sort(d->bibfiles_cache_.begin(), d->bibfiles_cache_.end());
+       // the old one should already be sorted
+       if (old_bibfiles != d->bibfiles_cache_) {
+               invalidateBibinfoCache();
+               reloadBibInfoCache();
+               // We relied upon the bibinfo cache when recalculating labels. But that
+               // cache was invalid, although we didn't find that out until now. So we
+               // have to do it all again.
+               // That said, the only thing we really need to do is update the citation
+               // labels. Nothing else will have changed. So we could create a new 
+               // UpdateType that would signal that fact, if we needed to do so.
+               parit = cbuf.par_iterator_begin();
+               updateBuffer(parit, utype);
+       }
+       else
+               d->bibinfo_cache_valid_ = true;
        d->cite_labels_valid_ = true;
        /// FIXME: Perf
        cbuf.tocBackend().update(true, utype);
@@ -4925,13 +4861,14 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
                        break;
                }
 
-               // Increase the master counter?
-               if (layout.stepmastercounter && needEnumCounterReset(it))
-                       counters.stepMaster(enumcounter, utype);
-
-               // Maybe we have to reset the enumeration counter.
-               if (!layout.resumecounter && needEnumCounterReset(it))
-                       counters.reset(enumcounter);
+               if (needEnumCounterReset(it)) {
+                       // Increase the master counter?
+                       if (layout.stepmastercounter)
+                               counters.stepMaster(enumcounter, utype);
+                       // Maybe we have to reset the enumeration counter.
+                       if (!layout.resumecounter)
+                               counters.reset(enumcounter);
+               }
                counters.step(enumcounter, utype);
 
                string const & lang = par.getParLanguage(bp)->code();
@@ -5010,7 +4947,7 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
                         * non-const. This would however be costly in
                         * terms of code duplication.
                         */
-                       const_cast<Buffer *>(this)->undo().recordUndo(CursorData(parit));
+                       CursorData(parit).recordUndo();
                        parit->params().depth(maxdepth);
                }
                maxdepth = parit->getMaxDepthAfter();
@@ -5030,11 +4967,9 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
                parit->addChangesToBuffer(*this);
 
                // now the insets
-               InsetList::const_iterator iit = parit->insetList().begin();
-               InsetList::const_iterator end = parit->insetList().end();
-               for (; iit != end; ++iit) {
-                       parit.pos() = iit->pos;
-                       iit->inset->updateBuffer(parit, utype);
+               for (auto const & insit : parit->insetList()) {
+                       parit.pos() = insit.pos;
+                       insit.inset->updateBuffer(parit, utype);
                }
        }
 }
@@ -5152,7 +5087,7 @@ int Buffer::charCount(bool with_blanks) const
 Buffer::ReadStatus Buffer::reload()
 {
        setBusy(true);
-       // c.f. bug http://www.lyx.org/trac/ticket/6587
+       // c.f. bug https://www.lyx.org/trac/ticket/6587
        removeAutosaveFile();
        // e.g., read-only status could have changed due to version control
        d->filename.refresh();
@@ -5218,11 +5153,9 @@ bool Buffer::saveAs(FileName const & fn)
 
 void Buffer::checkChildBuffers()
 {
-       Impl::BufferPositionMap::iterator it = d->children_positions.begin();
-       Impl::BufferPositionMap::iterator const en = d->children_positions.end();
-       for (; it != en; ++it) {
-               DocIterator dit = it->second;
-               Buffer * cbuf = const_cast<Buffer *>(it->first);
+       for (auto const & bit : d->children_positions) {
+               DocIterator dit = bit.second;
+               Buffer * cbuf = const_cast<Buffer *>(bit.first);
                if (!cbuf || !theBufferList().isLoaded(cbuf))
                        continue;
                Inset * inset = dit.nextInset();