diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas
index ac5cddce..7688b430 100644
--- a/src/ce_synmemo.pas
+++ b/src/ce_synmemo.pas
@@ -151,7 +151,6 @@ type
     procedure loadCache;
     class procedure cleanCache; static;
     procedure setDefaultFontSize(aValue: Integer);
-    procedure getCallTips;
     procedure DDocTimerEvent(sender: TObject);
     procedure AutoDotTimerEvent(sender: TObject);
     procedure InitHintWins;
@@ -197,8 +196,9 @@ type
     procedure saveTempFile;
     //
     procedure invertVersionAllNone;
-    procedure showCallTips;
+    procedure showCallTips(findOpenParen: boolean = true);
     procedure hideCallTips;
+    procedure decCallTipsLvl;
     procedure showDDocs;
     procedure hideDDocs;
     //
@@ -924,7 +924,7 @@ begin
     begin
       hideCallTips;
       hideDDocs;
-      showCallTips;
+      showCallTips(true);
     end;
     ecCurlyBraceClose:
       curlyBraceCloseAndIndent(self);
@@ -1026,7 +1026,7 @@ begin
   end;
 end;
 
-procedure TCESynMemo.showCallTips;
+procedure TCESynMemo.showCallTips(findOpenParen: boolean = true);
 var
   str: string;
   i: integer;
@@ -1035,7 +1035,7 @@ begin
     fCallTipStrings.Clear;
   str := LineText[1..CaretX];
   i := CaretX;
-  while true do
+  if findOpenParen then while true do
   begin
     if i = 1 then
       break;
@@ -1090,6 +1090,21 @@ begin
   fCallTipWin.Hide;
 end;
 
+procedure TCESynMemo.decCallTipsLvl;
+var
+  i: integer;
+begin
+  {$PUSH}{$HINTS OFF}{$WARNINGS OFF}
+  i := integer(pointer(fCallTipStrings.Objects[0]));
+  {$POP}
+  for i in [0..i-1] do
+    fCallTipStrings.Delete(0);
+  if fCallTipStrings.Count = 0 then
+    hideCallTips
+  else
+    showCallTips(fCallTipStrings.Text);
+end;
+
 procedure TCESynMemo.showDDocs;
 var
   str: string;
@@ -1112,11 +1127,6 @@ begin
   fDDocWin.Hide;
 end;
 
-procedure TCESynMemo.getCallTips();
-begin
-  showCallTips;
-end;
-
 procedure TCESynMemo.setDDocDelay(aValue: Integer);
 begin
   fDDocDelay:=aValue;
@@ -1428,30 +1438,37 @@ end;
 
 {$REGION user input ------------------------------------------------------------}
 procedure TCESynMemo.KeyDown(var Key: Word; Shift: TShiftState);
+var
+  i: integer;
 begin
-  if Key = VK_RETURN then
-  begin
-    if (fAutoCloseCurlyBrace in [autoCloseOnNewLineEof .. autoCloseOnNewLineLexically]) then
-    case fAutoCloseCurlyBrace of
-      autoCloseOnNewLineAlways: if (CaretX > 1) and (LineText[LogicalCaretXY.X - 1] = '{') then
-      begin
-        Key := 0;
-        curlyBraceCloseAndIndent(self);
-      end;
-      autoCloseOnNewLineEof: if (CaretX > 1) and (LineText[LogicalCaretXY.X - 1] = '{') then
-        if (CaretY = Lines.Count) and (CaretX = LineText.length+1) then
+  case Key of
+    VK_BACK: if fCallTipWin.Visible and (CaretX > 1)
+      and (LineText[LogicalCaretXY.X-1] = '(') then
+        decCallTipsLvl;
+    VK_RETURN:
+    begin
+      if (fAutoCloseCurlyBrace in [autoCloseOnNewLineEof .. autoCloseOnNewLineLexically]) then
+      case fAutoCloseCurlyBrace of
+        autoCloseOnNewLineAlways: if (CaretX > 1) and (LineText[LogicalCaretXY.X - 1] = '{') then
         begin
           Key := 0;
           curlyBraceCloseAndIndent(self);
         end;
-      autoCloseOnNewLineLexically: if LogicalCaretXY.X - 1 >= lineText.length then
-      begin
-        fLexToks.Clear;
-        lex(lines.Text, fLexToks);
-        if lexCanCloseBrace then
+        autoCloseOnNewLineEof: if (CaretX > 1) and (LineText[LogicalCaretXY.X - 1] = '{') then
+          if (CaretY = Lines.Count) and (CaretX = LineText.length+1) then
+          begin
+            Key := 0;
+            curlyBraceCloseAndIndent(self);
+          end;
+        autoCloseOnNewLineLexically: if LogicalCaretXY.X - 1 >= lineText.length then
         begin
-          Key := 0;
-          curlyBraceCloseAndIndent(self);
+          fLexToks.Clear;
+          lex(lines.Text, fLexToks);
+          if lexCanCloseBrace then
+          begin
+            Key := 0;
+            curlyBraceCloseAndIndent(self);
+          end;
         end;
       end;
     end;
@@ -1499,19 +1516,8 @@ begin
   c := Key;
   inherited;
   case c of
-    '(': getCallTips;
-    ')': if fCallTipWin.Visible then
-      begin
-        {$PUSH}{$HINTS OFF}{$WARNINGS OFF}
-        i := integer(pointer(fCallTipStrings.Objects[0]));
-        {$POP}
-        for i in [0..i-1] do
-          fCallTipStrings.Delete(0);
-        if fCallTipStrings.Count = 0 then
-          hideCallTips
-        else
-          showCallTips(fCallTipStrings.Text);
-      end;
+    '(': showCallTips(false);
+    ')': if fCallTipWin.Visible then decCallTipsLvl;
     '{':
         case fAutoCloseCurlyBrace of
           autoCloseAlways: