diff --git a/IPython/html/static/notebook/js/actions.js b/IPython/html/static/notebook/js/actions.js
index 828b724e7..40816144e 100644
--- a/IPython/html/static/notebook/js/actions.js
+++ b/IPython/html/static/notebook/js/actions.js
@@ -79,7 +79,6 @@ define(function(require){
             }
         },
         'select-previous-cell' : {
-            help: 'select cell above',
             help_index : 'da',
             handler : function (env) {
                 var index = env.notebook.get_selected_index();
@@ -90,7 +89,6 @@ define(function(require){
             }
         },
         'select-next-cell' : {
-            help: 'select cell below',
             help_index : 'db',
             handler : function (env) {
                 var index = env.notebook.get_selected_index();
@@ -119,14 +117,12 @@ define(function(require){
             }
         },
         'paste-cell-before' : {
-            help: 'paste cell above',
             help_index : 'eg',
             handler : function (env) {
                 env.notebook.paste_cell_above();
             }
         },
         'paste-cell-after' : {
-            help: 'paste cell below',
             icon: 'fa-paste',
             help_index : 'eh',
             handler : function (env) {
@@ -134,7 +130,6 @@ define(function(require){
             }
         },
         'insert-cell-before' : {
-            help: 'insert cell above',
             help_index : 'ec',
             handler : function (env) {
                 env.notebook.insert_cell_above();
@@ -143,7 +138,6 @@ define(function(require){
             }
         },
         'insert-cell-after' : {
-            help: 'insert cell below',
             icon : 'fa-plus',
             help_index : 'ed',
             handler : function (env) {
@@ -257,7 +251,6 @@ define(function(require){
             }
         },
         'delete-cell': {
-            help: 'delete selected cell',
             help_index : 'ej',
             handler : function (env) {
                 env.notebook.delete_cell();
diff --git a/IPython/html/static/notebook/js/quickhelp.js b/IPython/html/static/notebook/js/quickhelp.js
index 36402139f..bceaa2db1 100644
--- a/IPython/html/static/notebook/js/quickhelp.js
+++ b/IPython/html/static/notebook/js/quickhelp.js
@@ -38,8 +38,8 @@ define([
             { shortcut: "Cmd-Down",   help:"go to cell end"  },
             { shortcut: "Alt-Left",   help:"go one word left"  },
             { shortcut: "Alt-Right",  help:"go one word right"  },
-            { shortcut: "Alt-Backspace",      help:"delete word before"  },
-            { shortcut: "Alt-Delete",         help:"delete word after"  },
+            { shortcut: "Alt-Backspace",      help:"del word before"  },
+            { shortcut: "Alt-Delete",         help:"del word after"  },
         ];
     } else {
         // PC specific
@@ -50,8 +50,8 @@ define([
             { shortcut: "Ctrl-Down",  help:"go to cell end"  },
             { shortcut: "Ctrl-Left",  help:"go one word left"  },
             { shortcut: "Ctrl-Right", help:"go one word right"  },
-            { shortcut: "Ctrl-Backspace", help:"delete word before"  },
-            { shortcut: "Ctrl-Delete",    help:"delete word after"  },
+            { shortcut: "Ctrl-Backspace", help:"del word before"  },
+            { shortcut: "Ctrl-Delete",    help:"del word after"  },
         ];
     }
 
diff --git a/IPython/html/static/widgets/js/widget.js b/IPython/html/static/widgets/js/widget.js
index e5f758dd3..073186716 100644
--- a/IPython/html/static/widgets/js/widget.js
+++ b/IPython/html/static/widgets/js/widget.js
@@ -155,9 +155,8 @@ define(["widgets/js/manager",
                     this.trigger('msg:custom', msg.content.data.content);
                     break;
                 case 'display':
-                    this.state_change = this.state_change.then(function() {
-                        that.widget_manager.display_view(msg, that);
-                    }).catch(utils.reject('Could not process display view msg', true));
+                    this.widget_manager.display_view(msg, this)
+                        .catch(utils.reject('Could not process display view msg', true));
                     break;
             }
         },
diff --git a/IPython/utils/tokenutil.py b/IPython/utils/tokenutil.py
index 48cc82c2e..f0040bfd8 100644
--- a/IPython/utils/tokenutil.py
+++ b/IPython/utils/tokenutil.py
@@ -58,6 +58,9 @@ def token_at_cursor(cell, cursor_pos=0):
     
     Used for introspection.
     
+    Function calls are prioritized, so the token for the callable will be returned
+    if the cursor is anywhere inside the call.
+    
     Parameters
     ----------
     
@@ -70,6 +73,7 @@ def token_at_cursor(cell, cursor_pos=0):
     names = []
     tokens = []
     offset = 0
+    call_names = []
     for tup in generate_tokens(StringIO(cell).readline):
         
         tok = Token(*tup)
@@ -93,6 +97,11 @@ def token_at_cursor(cell, cursor_pos=0):
             if tok.text == '=' and names:
                 # don't inspect the lhs of an assignment
                 names.pop(-1)
+            if tok.text == '(' and names:
+                # if we are inside a function call, inspect the function
+                call_names.append(names[-1])
+            elif tok.text == ')' and call_names:
+                call_names.pop(-1)
         
         if offset + end_col > cursor_pos:
             # we found the cursor, stop reading
@@ -102,7 +111,9 @@ def token_at_cursor(cell, cursor_pos=0):
         if tok.token == tokenize2.NEWLINE:
             offset += len(tok.line)
     
-    if names:
+    if call_names:
+        return call_names[-1]
+    elif names:
         return names[-1]
     else:
         return ''
diff --git a/examples/Notebook/Notebook Basics.ipynb b/examples/Notebook/Notebook Basics.ipynb
index ae67fab91..ce5c43338 100644
--- a/examples/Notebook/Notebook Basics.ipynb
+++ b/examples/Notebook/Notebook Basics.ipynb
@@ -226,7 +226,7 @@
     "1. Basic navigation: `enter`, `shift-enter`, `up/k`, `down/j`\n",
     "2. Saving the notebook: `s`\n",
     "2. Cell types: `y`, `m`, `1-6`, `t`\n",
-    "3. Cell creation: `a`, `b`\n",
+    "3. Cell creation and movement: `a`, `b`, `ctrl+k`, `ctrl+j`\n",
     "4. Cell editing: `x`, `c`, `v`, `d`, `z`, `shift+=`\n",
     "5. Kernel operations: `i`, `.`"
    ]

Inspect requests inside a function call should be smarter about what they inspect.
Previously, `func(a, b, <shift-tab>` would give information on `func`, now it gives information on `b`, which is not especially helpful.

This is because we removed logic from the frontend to make it more language agnostic, and we have not yet reimplemented that on the frontend. For 3.1, we should make it at least as smart as 2.x was. The quicky and dirty approach would be a regex; the proper way is tokenising the code.

Ping @mwaskom who brought this up on the mailing list.
diff --git a/IPython/utils/tests/test_tokenutil.py b/IPython/utils/tests/test_tokenutil.py
index be9cb578a..ff3efc75c 100644
--- a/IPython/utils/tests/test_tokenutil.py
+++ b/IPython/utils/tests/test_tokenutil.py
@@ -48,13 +48,28 @@ def test_multiline():
     start = cell.index(expected) + 1
     for i in range(start, start + len(expected)):
         expect_token(expected, cell, i)
-    expected = 'there'
+    expected = 'hello'
     start = cell.index(expected) + 1
     for i in range(start, start + len(expected)):
         expect_token(expected, cell, i)
 
+def test_nested_call():
+    cell = "foo(bar(a=5), b=10)"
+    expected = 'foo'
+    start = cell.index('bar') + 1
+    for i in range(start, start + 3):
+        expect_token(expected, cell, i)
+    expected = 'bar'
+    start = cell.index('a=')
+    for i in range(start, start + 3):
+        expect_token(expected, cell, i)
+    expected = 'foo'
+    start = cell.index(')') + 1
+    for i in range(start, len(cell)-1):
+        expect_token(expected, cell, i)
+
 def test_attrs():
-    cell = "foo(a=obj.attr.subattr)"
+    cell = "a = obj.attr.subattr"
     expected = 'obj'
     idx = cell.find('obj') + 1
     for i in range(idx, idx + 3):

pip install -e .[all]
parse_log_pytest
pytest
mock sphinx pandoc pytest
apt-get update apt-get install -y gcc
3.7
docs/source/install/install.rst
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs @ file:///croot/attrs_1668696182826/work
Babel==2.14.0
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
docutils==0.19
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
idna==3.10
imagesize==1.4.1
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
importlib-resources==5.12.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
-e git+https://github.com/ipython/ipython.git@92333e1084ea0d6ff91b55434555e741d2274dc7#egg=ipython
Jinja2==3.1.6
jsonschema==4.17.3
MarkupSafe==2.1.5
mistune==3.0.2
mock==5.2.0
nose==1.3.7
numpydoc==1.5.0
packaging @ file:///croot/packaging_1671697413597/work
pandoc==2.4
pkgutil_resolve_name==1.3.10
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
plumbum==1.8.3
ply==3.11
ptyprocess==0.7.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
Pygments==2.17.2
pyrsistent==0.19.3
pytest==7.1.2
pytz==2025.2
pyzmq==26.2.1
requests==2.31.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
terminado==0.17.1
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
tornado==6.2
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
urllib3==2.0.7
zipp @ file:///croot/zipp_1672387121353/work

name: ipython
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - babel==2.14.0
      - charset-normalizer==3.4.1
      - docutils==0.19
      - idna==3.10
      - imagesize==1.4.1
      - importlib-resources==5.12.0
      - jinja2==3.1.6
      - jsonschema==4.17.3
      - markupsafe==2.1.5
      - mistune==3.0.2
      - mock==5.2.0
      - nose==1.3.7
      - numpydoc==1.5.0
      - pandoc==2.4
      - pkgutil-resolve-name==1.3.10
      - plumbum==1.8.3
      - ply==3.11
      - ptyprocess==0.7.0
      - pygments==2.17.2
      - pyrsistent==0.19.3
      - pytz==2025.2
      - pyzmq==26.2.1
      - requests==2.31.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - terminado==0.17.1
      - tornado==6.2
      - urllib3==2.0.7
prefix: /opt/conda/envs/ipython

IPython/utils/tests/test_tokenutil.py::test_nested_call
IPython/utils/tests/test_tokenutil.py::test_simple IPython/utils/tests/test_tokenutil.py::test_function IPython/utils/tests/test_tokenutil.py::test_multiline IPython/utils/tests/test_tokenutil.py::test_attrs IPython/utils/tests/test_tokenutil.py::test_line_at_cursor
IPython/html/static/notebook/js/quickhelp.js examples/Notebook/Notebook IPython/html/static/notebook/js/actions.js examples/Notebook/Notebook Basics.ipynb IPython/utils/tokenutil.py IPython/html/static/widgets/js/widget.js
IPython/html/static/notebook/js/quickhelp.js IPython/html/static/notebook/js/actions.js sics.ipynb examples/Notebook/Notebook Basics.ipynb IPython/utils/tokenutil.py IPython/html/static/widgets/js/widget.js