fish-shell/tests/pexpects/bind_mode_events.py
Johannes Altmanninger 610338cc70 On undo after execute, restore the cursor position
Ever since 149594f974 (Initial revision, 2005-09-20), we move the
cursor to the end of the commandline just before executing it.

This is so we can move the cursor to the line below the command line,
so moving the cursor is relevant if one presses enter on say, the
first line of a multi-line commandline.

As mentioned in #10838 and others, it can be useful to restore the
cursor position when recalling commandline from history. Make undo
restore the position where enter was pressed, instead of implicitly
moving the cursor to the end. This allows to quickly correct small
mistakes in large commandlines that failed recently.

This requires a new way of moving the cursor below the command line.
Test changes include unrelated cleanup of history.py.
2024-12-21 13:10:34 +01:00

73 lines
1.7 KiB
Python

#!/usr/bin/env python3
from pexpect_helper import SpawnedProc, TO_END
import os
import sys
import signal
import platform
if "CI" in os.environ and platform.system() in ["Darwin", "FreeBSD"]:
sys.exit(127)
sp = SpawnedProc()
send, sendline, sleep, expect_prompt = sp.send, sp.sendline, sp.sleep, sp.expect_prompt
expect_prompt()
send("set -g fish_key_bindings fish_vi_key_bindings\r")
expect_prompt()
send("echo ready to go\r")
expect_prompt(TO_END + f"ready to go\r\n")
send(
"function add_change --on-variable fish_bind_mode ; set -g MODE_CHANGES $MODE_CHANGES $fish_bind_mode ; end\r"
)
expect_prompt()
sendline("echo 'Catch' 'up'")
expect_prompt("Catch up")
# normal mode
send("\033")
sleep(10 if "CI" in os.environ else 1)
# insert mode
send("i")
sleep(10 if "CI" in os.environ else 1)
# back to normal mode
send("\033")
sleep(10 if "CI" in os.environ else 1)
# insert mode again
send("i")
sleep(10 if "CI" in os.environ else 1)
send("echo mode changes: $MODE_CHANGES\r")
expect_prompt(TO_END + "mode changes: default insert default insert\r\n")
# Regression test for #8125.
# Control-C should return us to insert mode.
send("set -e MODE_CHANGES\r")
expect_prompt()
timeout = 0.15
if "CI" in os.environ:
# This doesn't work under TSan, because TSan prevents select() being
# interrupted by a signal.
import sys
print("SKIPPING the last of bind_mode_events.py")
sys.exit(0)
# Put some text on the command line and then go back to normal mode.
send("echo stuff")
sp.expect_str("echo stuff")
send("\033")
sleep(timeout)
os.kill(sp.spawn.pid, signal.SIGINT)
sleep(timeout)
# We should be back in insert mode now.
send("echo mode changes: $MODE_CHANGES\r")
expect_prompt(TO_END + "mode changes: default insert\r\n")