+DocIterator Text::macrocontextPosition() const
+{
+ return macrocontext_position_;
+}
+
+
+void Text::setMacrocontextPosition(DocIterator const & pos)
+{
+ macrocontext_position_ = pos;
+}
+
+
+docstring Text::previousWord(CursorSlice const & sl) const
+{
+ CursorSlice from = sl;
+ CursorSlice to = sl;
+ getWord(from, to, PREVIOUS_WORD);
+ if (sl == from || to == from)
+ return docstring();
+
+ Paragraph const & par = sl.paragraph();
+ return par.asString(from.pos(), to.pos(), false);
+}
+
+
+bool Text::completionSupported(Cursor const & cur) const
+{
+ Paragraph const & par = cur.paragraph();
+ return cur.pos() > 0
+ && (cur.pos() >= par.size() || !par.isLetter(cur.pos()))
+ && par.isLetter(cur.pos() - 1);
+}
+
+
+CompletionList const * Text::createCompletionList(Cursor const & cur) const
+{
+ return new TextCompletionList(cur);
+}
+
+
+bool Text::insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/)
+{
+ BOOST_ASSERT(cur.bv().cursor() == cur);
+ cur.insert(s);
+ cur.bv().cursor() = cur;
+ if (!(cur.disp_.update() & Update::Force))
+ cur.updateFlags(cur.disp_.update() | Update::SinglePar);
+ return true;
+}
+
+
+docstring Text::completionPrefix(Cursor const & cur) const
+{
+ return previousWord(cur.top());
+}
+