X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathNest.cpp;h=d4759a0c0f16fdd345cd19fbf9b313efe0c8af05;hb=c2229d388b622a65029d0566f5eca53b43d92528;hp=abaeec903c6c882661ee21f1f9b6a0a2d65c62a5;hpb=9e1db65932b895778525c48d524adfad2ae37739;p=lyx.git diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index abaeec903c..d4759a0c0f 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -358,8 +358,14 @@ void InsetMathNest::normalize(NormalStream & os) const 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) { @@ -539,7 +545,8 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) 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 @@ -779,8 +786,12 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) 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; @@ -790,8 +801,12 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) 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; @@ -898,7 +913,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) if (cmd.argument().empty()) { // do superscript if LyX handles // deadkeys - cur.recordUndoSelection(); + cur.recordUndoInset(); script(cur, true, grabAndEraseSelection(cur)); } break; @@ -1295,6 +1310,24 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) return; } + case LFUN_PHANTOM_INSERT: { + docstring const & arg = cmd.argument(); + docstring newarg; + if (arg == "Phantom") + newarg = from_ascii("\\phantom"); + else if (arg == "HPhantom") + newarg = from_ascii("\\hphantom"); + else if (arg == "VPhantom") + newarg = from_ascii("\\vphantom"); + if (newarg.empty()) + LYXERR0("Unknown phantom type " + newarg); + else { + FuncRequest const newfunc(LFUN_MATH_INSERT, newarg); + lyx::dispatch(newfunc); + } + break; + } + default: InsetMath::doDispatch(cur, cmd); break; @@ -1646,10 +1679,10 @@ void InsetMathNest::lfunMouseRelease(Cursor & cur, FuncRequest & cmd) 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; @@ -1801,7 +1834,13 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) // but suppress direct insertion of two spaces in a row // the still allows typing 'a' 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 @@ -1856,10 +1895,12 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) 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; } @@ -1868,10 +1909,16 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) 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 {