22
$\begingroup$

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

$\endgroup$
3
21
$\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$
4
  • $\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$ Feb 20 '13 at 16:44
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2 at 8:37
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$
7
  • $\begingroup$ @Mr.Wizard I just checked, and it works for me, M7.0, Win7 64 bit. What exactly isn't working for you? $\endgroup$ 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$ Jun 6 '12 at 9:44
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2 at 8:37
  • 1
    $\begingroup$ @M.R. Can't tell. I find the design of the cloud (as little as I know about it) very different from what I'd like it to be or what I'd have done if I was tasked to design it. May be there were good reasons to do it the way it was done, that I simply don't understand. $\endgroup$ Jan 2 at 21:11
11
$\begingroup$

Perhaps something like this?

text = "";
EventHandler[
 InputField[Dynamic@text, String, ContinuousAction -> True],
 {"ReturnKeyDown" :> Paste["\n"]}
 ]
$\endgroup$
3
  • $\begingroup$ Cool!.. Tks I'll wait to accept just to follow the protocols. :) $\endgroup$
    – Murta
    Feb 23 '14 at 16:12
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2 at 8:37
  • $\begingroup$ @M.R. Maybe tell it to WRI? I'm not sure there's a real Front End in the Cloud. I told a developer in passing about some glitch a year ago at the 2019 tech conf, and they put me in contact with the lead developer right away. He seemed to realize there were some issues, but they seemed to want to make it work. $\endgroup$
    – Michael E2
    Jan 2 at 13:56
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$
1
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2 at 8:37
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$
2
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2 at 8:38
  • $\begingroup$ @M.R. not surprised :( $\endgroup$
    – Kuba
    Jan 2 at 8:48

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.