// arity changed or other reason to detach?
if (oldDisplayMode == MathMacro::DISPLAY_NORMAL
- && (macroInset->arity() != macroNumArgs
- || macroInset->optionals() != macroOptionals
- || newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
+ && (macroInset->arity() != macroNumArgs
+ || macroInset->optionals() != macroOptionals
+ || newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
detachMacroParameters(cur, i);
}
// Cursor in \label?
if (newDisplayMode != MathMacro::DISPLAY_UNFOLDED
- && oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) {
+ && oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) {
// put cursor in front of macro
if (cur) {
int macroSlice = cur->find(macroInset);
}
// update the display mode
+ size_t appetite = macroInset->appetite();
macroInset->setDisplayMode(newDisplayMode);
// arity changed?
if (newDisplayMode == MathMacro::DISPLAY_NORMAL
- && (macroInset->arity() != macroNumArgs
- || macroInset->optionals() != macroOptionals)) {
+ && (macroInset->arity() != macroNumArgs
+ || macroInset->optionals() != macroOptionals)) {
// is it a virgin macro which was never attached to parameters?
bool fromInitToNormalMode
= (oldDisplayMode == MathMacro::DISPLAY_INIT
- || oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT)
- && newDisplayMode == MathMacro::DISPLAY_NORMAL;
+ || oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT)
+ && newDisplayMode == MathMacro::DISPLAY_NORMAL;
// if the macro was entered interactively (i.e. not by paste or during
// loading), it should not be greedy, but the cursor should
// attach parameters
attachMacroParameters(cur, i, macroNumArgs, macroOptionals,
- fromInitToNormalMode, interactive);
+ fromInitToNormalMode, interactive, appetite);
if (cur) {
// FIXME: proper anchor handling, this removes the selection
void MathData::attachMacroParameters(Cursor * cur,
const size_type macroPos, const size_type macroNumArgs,
const int macroOptionals, const bool fromInitToNormalMode,
- const bool interactiveInit)
+ const bool interactiveInit, const size_t appetite)
{
MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro();
if (!interactiveInit) {
collectOptionalParameters(cur, macroOptionals, detachedArgs, p,
scriptToPutAround, macroPos, thisPos, thisSlice);
- collectParameters(cur, macroNumArgs, detachedArgs, p,
- scriptToPutAround, macroPos, thisPos, thisSlice);
}
+ collectParameters(cur, macroNumArgs, detachedArgs, p,
+ scriptToPutAround, macroPos, thisPos, thisSlice, appetite);
// attach arguments back to macro inset
macroInset->attachArguments(detachedArgs, macroNumArgs, macroOptionals);
void MathData::collectParameters(Cursor * cur,
const size_type numParams, vector<MathData> & params,
size_t & pos, MathAtom & scriptToPutAround,
- const pos_type macroPos, const int thisPos, const int thisSlice)
+ const pos_type macroPos, const int thisPos, const int thisSlice,
+ const size_t appetite)
{
+ size_t startSize = params.size();
+
// insert normal arguments
while (params.size() < numParams
+ && params.size() - startSize < appetite
&& pos < size()
&& !scriptToPutAround.nucleus()) {
MathAtom & cell = operator[](pos);
///
void attachMacroParameters(Cursor * cur, const size_type macroPos,
const size_type macroNumArgs, const int macroOptionals,
- const bool fromInitToNormalMode, const bool interactiveInit);
+ const bool fromInitToNormalMode, const bool interactiveInit,
+ const size_t appetite);
///
void collectOptionalParameters(Cursor * cur,
const size_type numOptionalParams, std::vector<MathData> & params,
void collectParameters(Cursor * cur,
const size_type numParams, std::vector<MathData> & params,
size_t & pos, MathAtom & scriptToPutAround,
- const pos_type macroPos, const int thisPos, const int thisSlice);
+ const pos_type macroPos, const int thisPos, const int thisSlice,
+ const size_t appetite);
};
///
MathMacro::MathMacro(docstring const & name)
: InsetMathNest(0), name_(name), displayMode_(DISPLAY_INIT),
attachedArgsNum_(0), optionals_(0), nextFoldMode_(true),
- macro_(0), needsUpdate_(false)
+ macro_(0), needsUpdate_(false), appetite_(9)
{}
}
-void MathMacro::setDisplayMode(MathMacro::DisplayMode mode)
+void MathMacro::setDisplayMode(MathMacro::DisplayMode mode, int appetite)
{
if (displayMode_ != mode) {
// transfer name if changing from or to DISPLAY_UNFOLDED
displayMode_ = mode;
needsUpdate_ = true;
}
+
+ // the interactive init mode is non-greedy by default
+ if (appetite == -1)
+ appetite_ = (mode == DISPLAY_INTERACTIVE_INIT) ? 0 : 9;
+ else
+ appetite_ = size_t(appetite);
}