+ case LFUN_INSET_EDIT: {
+ cur.push(*this);
+ text().selectAll(cur);
+ string const format =
+ cur.buffer()->params().documentClass().outputFormat();
+ string const ext = theFormats().extension(format);
+ tempfile_.reset(new support::TempFile("ert_editXXXXXX." + ext));
+ support::FileName const tempfilename = tempfile_->name();
+ string const name = tempfilename.toFilesystemEncoding();
+ ofdocstream os(name.c_str());
+ os << cur.selectionAsString(false);
+ os.close();
+ // Since we lock the inset while the external file is edited,
+ // we need to move the cursor outside and clear any selection inside
+ cur.clearSelection();
+ cur.pop();
+ cur.leaveInset(*this);
+ theFormats().edit(buffer(), tempfilename, format);
+ break;
+ }
+ case LFUN_INSET_END_EDIT: {
+ support::FileName const tempfilename = tempfile_->name();
+ docstring const s = tempfilename.fileContents("UTF-8");
+ cur.recordUndoInset(this);
+ cur.push(*this);
+ text().selectAll(cur);
+ cap::replaceSelection(cur);
+ cur.text()->insertStringAsLines(cur, s, cur.current_font);
+ // FIXME (gb) it crashes without this
+ cur.fixIfBroken();
+ tempfile_.reset();
+ cur.pop();
+ break;
+ }
+