void InsetMathNest::latex(otexstream & os, OutputParams const & runparams) const
{
- TeXMathStream wi(os, runparams.moving_arg, true,
- runparams.dryrun ? TeXMathStream::wsDryrun : TeXMathStream::wsDefault,
+ TeXMathStream::OutputType ot;
+ if (runparams.for_search != OutputParams::NoSearch)
+ ot = TeXMathStream::wsSearchAdv;
+ else if (runparams.dryrun)
+ ot = TeXMathStream::wsDryrun;
+ else
+ ot = TeXMathStream::wsDefault;
+ TeXMathStream wi(os, runparams.moving_arg, true, ot,
runparams.encoding);
wi.strikeoutMath(runparams.inDeletedInset);
if (runparams.inulemcmd) {
size_t n = 0;
idocstringstream is(cmd.argument());
is >> n;
- topaste = cap::selection(n, buffer().params().documentClassPtr());
+ topaste = cap::selection(n, make_pair(buffer().params().documentClassPtr(),
+ buffer().params().authors()));
}
cur.niceInsert(topaste, parseflg, false);
cur.clearSelection(); // bug 393
cur.clearTargetX();
cur.macroModeClose();
if (!cur.inset().idxNext(cur)) {
- cur.idx() = firstIdx();
- cur.pos() = 0;
+ if (cur.lastidx() == 0)
+ cur.popForward();
+ else {
+ cur.idx() = firstIdx();
+ cur.pos() = 0;
+ }
}
break;
cur.clearTargetX();
cur.macroModeClose();
if (!cur.inset().idxPrev(cur)) {
- cur.idx() = lastIdx();
- cur.pos() = lyxrc.mac_like_cursor_movement ? cur.lastpos() : 0;
+ if (cur.lastidx() == 0)
+ cur.popBackward();
+ else {
+ cur.idx() = cur.lastidx();
+ cur.pos() = lyxrc.mac_like_cursor_movement ? cur.lastpos() : 0;
+ }
}
break;
if (cmd.argument().empty()) {
// do superscript if LyX handles
// deadkeys
- cur.recordUndoSelection();
+ cur.recordUndoInset();
script(cur, true, grabAndEraseSelection(cur));
}
break;
bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
{
- // try auto-correction
- if (lyxrc.autocorrection_math && cur.pos() != 0
- && math_autocorrect(cur, c))
- return true;
+ // try auto-correction
+ if (lyxrc.autocorrection_math && cur.pos() != 0 && !cur.selection()
+ && math_autocorrect(cur, c))
+ return true;
//lyxerr << "interpret 2: '" << c << "'" << endl;
docstring save_selection;
// but suppress direct insertion of two spaces in a row
// the still allows typing '<space>a<space>' and deleting the 'a', but
// it is better than nothing...
- if (cur.pos() == 0 || cur.prevAtom()->getChar() != ' ') {
+ pos_type const pos = cur.pos();
+ pos_type const lastpos = cur.lastpos();
+ if ((pos == 0 && lastpos == 0)
+ || (pos == 0 && cur.nextAtom()->getChar() != ' ')
+ || (pos == lastpos && cur.prevAtom()->getChar() != ' ')
+ || (pos > 0 && cur.prevAtom()->getChar() != ' '
+ && cur.nextAtom()->getChar() != ' ')) {
cur.insert(c);
// FIXME: we have to enable full redraw here because of the
// visual box corners that define the inset. If we know for
return true;
} else if (currentMode() != InsetMath::TEXT_MODE) {
if (c == '_') {
+ cur.recordUndoInset();
script(cur, false, save_selection);
return true;
}
if (c == '^') {
+ cur.recordUndoInset();
script(cur, true, save_selection);
return true;
}
return true;
}
if (currentMode() == InsetMath::MATH_MODE && Encodings::isUnicodeTextOnly(c)) {
- MathAtom at = createInsetMath("text", buf);
- at.nucleus()->cell(0).push_back(MathAtom(new InsetMathChar(c)));
- cur.insert(at);
- cur.posForward();
+ MathAtom const atom(new InsetMathChar(c));
+ if (cur.prevInset() && cur.prevInset()->asInsetMath()->name() == "text") {
+ // reuse existing \text inset
+ cur.prevInset()->asInsetMath()->cell(0).push_back(atom);
+ } else {
+ MathAtom at = createInsetMath("text", buf);
+ at.nucleus()->cell(0).push_back(atom);
+ cur.insert(at);
+ cur.posForward();
+ }
return true;
}
} else {