21
$\begingroup$

The return key does not work as expected in an InputField, how can I overcome this?

$\endgroup$
20
$\begingroup$

Ah, figured it out:

Panel @ DynamicModule[{input = ""}, 
  Column[{TextCell["Enter your text here:"], 
    EventHandler[
     InputField[Dynamic[input], String, ContinuousAction -> True, 
      FieldSize -> {40, 7}], 
     "ReturnKeyDown" :> 
      FrontEndExecute[{NotebookWrite[InputNotebook[], "\n", After]}]
     ], Dynamic@InputForm[input]}]]
$\endgroup$
  • $\begingroup$ On a related note: I wonder if that could also be used to intercept "Shift-return" - but I doubt it... $\endgroup$ – Jens Jun 5 '12 at 17:53
  • $\begingroup$ This doesn't appear to work in version 7. $\endgroup$ – Mr.Wizard Jun 6 '12 at 1:10
  • $\begingroup$ This solves a long standing question of mine, so thanks! I made an edit for it to handle Shift-Return: EventHandler[ InputField[Dynamic[demo2], String, FieldHint -> "Quarter 1 Turnover", Alignment -> {Left, Center}], {{"MenuCommand", "HandleShiftReturn"} :> FrontEndExecute[{NotebookWrite[InputNotebook[], "\n", After]}], "ReturnKeyDown" :> FrontEndExecute[{NotebookWrite[InputNotebook[], "\n", After]}]}] $\endgroup$ – Charlie Joey Hadley Feb 20 '13 at 16:44
11
$\begingroup$

Here is a widget which I constructed some time ago for my purposes. This is an InputField as well, but it operates on boxes, and as a bonus, the standard syntax highlighting works inside it:

ClearAll[codeInputField];
Attributes[codeInputField] = {HoldFirst}; 
Options[codeInputField] = {
   BaseStyle -> {FontSize -> 14, FontWeight -> Plain, FontFamily -> "Courier"},
   FieldSize -> {20, {2, Infinity}},
   ImageSize -> Automatic, 
   KeyEventActions -> Automatic,
   EnterPressedCustomFunction :> Automatic
};

codeInputField[startingCode_, opts : OptionsPattern[]] :=
  With[{bs = OptionValue[BaseStyle], fsize = OptionValue[FieldSize], 
    acts = OptionValue[KeyEventActions],
    EnterPressedF = OptionValue[EnterPressedCustomFunction], 
    ims = OptionValue[ImageSize]},
   Module[{nb, enterPressed},
     With[{actions = 
       Sequence @@ 
        If[acts === Automatic,
          {},
          Replace[acts, 
           (s_ -> f_) :> (s :> f[Hold[startingCode], Hold[enterPressed], s, nb]),
           {1}]
        ],
        enterF  = If[EnterPressedF === Automatic, Hold, EnterPressedF]
      },
     EventHandler[
       InputField[
          Dynamic[
             startingCode, 
             (nb = InputNotebook[]; startingCode = #) &
          ],
          Boxes, 
          FieldSize -> fsize, ContinuousAction -> True, 
          BaseStyle -> bs, ImageSize -> ims
       ],
       {"ReturnKeyDown" :>
          (
              enterPressed = True;
              enterF[Hold[startingCode], nb];
              FrontEndExecute[NotebookWrite[InputNotebook[], "\n"]];
              If[! ValueQ[nb], nb = InputNotebook[]];
              SetOptions[NotebookSelection[nb], ShowSelection -> True]; 
          ),
          actions
       },
       PassEventsDown -> True
  ]]]];

Here is an example of use:

code = MakeBoxes[Plot[Sin[x], {x, 0, 4 Pi}]];
Dynamic[code]
 RowBox[{"Plot","[",RowBox[{RowBox[{"Sin","[","x","]"}],",",RowBox[{" 
     {",RowBox[{"x",",","0",",",RowBox[{"4"," ","\[Pi]"}]}],"}"}]}],"]"}]

The above dynamic is to monitor the code variable. Now, the input field:

codeInputField[code]

enter image description here

The highlighting is enabled after "Enter" is pressed the first time. You can edit the code to see the highlighting at work and how the code variable is updated.

I also coded an interactive REPL-style cell based on this, which can evaluate code inside it. If there is an interest in it, I could expand to include that as well.

$\endgroup$
  • $\begingroup$ @Mr.Wizard I just checked, and it works for me, M7.0, Win7 64 bit. What exactly isn't working for you? $\endgroup$ – Leonid Shifrin Jun 6 '12 at 8:56
  • $\begingroup$ The first time I tried it Mathematica crashed. This time it worked. Still if I press numeric-keypad Return in the input field it crashes. $\endgroup$ – Mr.Wizard Jun 6 '12 at 9:24
  • $\begingroup$ @Mr.Wizard Interesting. Numeric-keypad Return does not crash it for me, but creates a new cell, instead of just do a carriage return. $\endgroup$ – Leonid Shifrin Jun 6 '12 at 9:44
11
$\begingroup$

Perhaps something like this?

text = "";
EventHandler[
 InputField[Dynamic@text, String, ContinuousAction -> True],
 {"ReturnKeyDown" :> Paste["\n"]}
 ]
$\endgroup$
  • $\begingroup$ Cool!.. Tks I'll wait to accept just to follow the protocols. :) $\endgroup$ – Murta Feb 23 '14 at 16:12
5
$\begingroup$

This dialog box version was put together some time ago for Mathematica 7 :-

text = "";
DialogInput[{TextCell["Try to type a text with linebreaks :-)"], 
  InputField[Dynamic[text], String, FieldSize -> {30, 6}], 
  DefaultButton[DialogReturn[text]]}, 
 NotebookEventActions -> {"ReturnKeyDown" :> 
    FrontEndExecute[NotebookWrite[InputNotebook[], "\n"]]}]

enter image description here

$\endgroup$
4
$\begingroup$

It appears that an undocumented InputFieldBoxOptions -> {"ReturnEntersInput" -> False} does this:

InputField[
  Dynamic[x], String
, BaseStyle -> InputFieldBoxOptions -> {"ReturnEntersInput" -> False}
]

It does not help with numpad Enter which can accidentally evaluate the cell. But that is the case with other answers too so the full answer is:

EventHandler[
  InputField[Dynamic[x], String
  , BaseStyle -> InputFieldBoxOptions -> {"ReturnEntersInput" -> False}
  ]
, {"MenuCommand", "EvaluateCells"} :> Paste["\n"]
]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.