22
$\begingroup$

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

$\endgroup$
3

5 Answers 5

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, 2012 at 17:53
  • $\begingroup$ This doesn't appear to work in version 7. $\endgroup$
    – Mr.Wizard
    Jun 6, 2012 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, 2013 at 16:44
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2, 2021 at 8:37
12
$\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, 2014 at 16:12
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2, 2021 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, 2021 at 13:56
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, 2012 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, 2012 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, 2012 at 9:44
  • $\begingroup$ Doesn't work in the cloud. $\endgroup$
    – M.R.
    Jan 2, 2021 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, 2021 at 21:11
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, 2021 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, 2021 at 8:38
  • $\begingroup$ @M.R. not surprised :( $\endgroup$
    – Kuba
    Jan 2, 2021 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.