mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-30 14:24:35 +08:00
e2ed561264
After 'x' is used to delete a character at the end of a line the cursor should be repositioned at the last character, i.e. repeatedly pressing 'x' in normal mode should delete the entire string.
222 lines
6.6 KiB
Plaintext
222 lines
6.6 KiB
Plaintext
# vim: set filetype=expect:
|
|
spawn $fish
|
|
expect_prompt
|
|
|
|
# Fish should start in default-mode (i.e., emacs) bindings. The default escape
|
|
# timeout is 300ms.
|
|
|
|
# Verify the emacs transpose word (\et) behavior using various delays,
|
|
# including none, after the escape character.
|
|
|
|
# Start by testing with no delay. This should transpose the words.
|
|
send "echo abc def"
|
|
send "\033t\r"
|
|
expect_prompt -re {\r\ndef abc\r\n} {
|
|
puts "emacs transpose words, default timeout: no delay"
|
|
} unmatched {
|
|
puts stderr "emacs transpose words fail, default timeout: no delay"
|
|
}
|
|
|
|
# Now test with a delay > 0 and < the escape timeout. This should transpose
|
|
# the words.
|
|
send "echo ghi jkl"
|
|
send "\033"
|
|
sleep 0.250
|
|
send "t\r"
|
|
expect_prompt -re {\r\njkl ghi\r\n} {
|
|
puts "emacs transpose words, default timeout: short delay"
|
|
} unmatched {
|
|
puts stderr "emacs transpose words fail, default timeout: short delay"
|
|
}
|
|
|
|
# Now test with a delay > the escape timeout. The transposition should not
|
|
# occur and the "t" should become part of the text that is echoed.
|
|
send "echo mno pqr"
|
|
send "\033"
|
|
sleep 0.400
|
|
send "t\r"
|
|
expect_prompt -re {\r\nmno pqrt\r\n} {
|
|
puts "emacs transpose words, default timeout: long delay"
|
|
} unmatched {
|
|
puts stderr "emacs transpose words fail, default timeout: long delay"
|
|
}
|
|
|
|
# Test vi key bindings.
|
|
# This should leave vi mode in the insert state.
|
|
send "set -g fish_key_bindings fish_vi_key_bindings\r"
|
|
expect_prompt
|
|
|
|
# These vi tests assume the fish_vi_key_bindings default escape timeout of
|
|
# 10ms is in effect; not the 300ms timeout for the default-mode.
|
|
#
|
|
|
|
# Go through a prompt cycle to let fish catch up, it may be slow due to ASAN
|
|
send "echo success: default escape timeout\r"
|
|
expect_prompt -re {\r\nsuccess: default escape timeout\r\n} {
|
|
puts "prime vi mode, default timeout"
|
|
} unmatched {
|
|
puts stderr "prime vi mode, default timeout"
|
|
}
|
|
|
|
# Verify the default timeout has been set to the expected value.
|
|
send "echo fish_escape_delay_ms=\$fish_escape_delay_ms\r"
|
|
expect_prompt -re {\r\nfish_escape_delay_ms=100\r\n} {
|
|
puts "vi-mode default timeout set correctly"
|
|
} unmatched {
|
|
puts stderr "vi-mode default timeout not set correctly"
|
|
}
|
|
|
|
send "echo fail: default escape timeout"
|
|
send "\033"
|
|
# Delay needed to allow fish to transition to vi "normal" mode. The delay is
|
|
# longer than strictly necessary to let fish catch up as it may be slow due to
|
|
# ASAN.
|
|
sleep 0.150
|
|
send "ddi"
|
|
send "echo success: default escape timeout\r"
|
|
expect_prompt -re {\r\nsuccess: default escape timeout\r\n} {
|
|
puts "vi replace line, default timeout: long delay"
|
|
} unmatched {
|
|
puts stderr "vi replace line, default timeout: long delay"
|
|
}
|
|
|
|
# Test replacing a single character.
|
|
send "echo TEXT"
|
|
send "\033"
|
|
# Delay needed to allow fish to transition to vi "normal" mode.
|
|
sleep 0.150
|
|
send "hhrAi\r"
|
|
expect_prompt -re {\r\nTAXT\r\n} {
|
|
puts "vi mode replace char, default timeout: long delay"
|
|
} unmatched {
|
|
puts stderr "vi mode replace char, default timeout: long delay"
|
|
}
|
|
|
|
# Test deleting characters with 'x'.
|
|
send "echo MORE-TEXT"
|
|
send "\033"
|
|
# Delay needed to allow fish to transition to vi "normal" mode.
|
|
sleep 0.150
|
|
send "xxxxx\r"
|
|
expect_prompt -re {\r\nMORE\r\n} {
|
|
puts "vi mode delete char, default timeout: long delay"
|
|
} unmatched {
|
|
puts stderr "vi mode delete char, default timeout: long delay"
|
|
}
|
|
|
|
# Verify that changing the escape timeout has an effect.
|
|
send "set -g fish_escape_delay_ms 200\r"
|
|
expect_prompt
|
|
|
|
send "echo fail: lengthened escape timeout"
|
|
send "\033"
|
|
sleep 0.250
|
|
send "ddi"
|
|
send "echo success: lengthened escape timeout\r"
|
|
expect_prompt -re {\r\nsuccess: lengthened escape timeout\r\n} {
|
|
puts "vi replace line, 100ms timeout: long delay"
|
|
} unmatched {
|
|
puts stderr "vi replace line, 100ms timeout: long delay"
|
|
}
|
|
|
|
# Verify that we don't switch to vi normal mode if we don't wait long enough
|
|
# after sending escape.
|
|
send "echo fail: no normal mode"
|
|
send "\033"
|
|
sleep 0.100
|
|
send "ddi"
|
|
send "inserted\r"
|
|
expect_prompt -re {\r\nfail: no normal modediinserted\r\n} {
|
|
puts "vi replace line, 100ms timeout: short delay"
|
|
} unmatched {
|
|
puts stderr "vi replace line, 100ms timeout: short delay"
|
|
}
|
|
|
|
# Test 't' binding that contains non-zero arity function (forward-jump) followed
|
|
# by another function (and) https://github.com/fish-shell/fish-shell/issues/2357
|
|
send "\033"
|
|
sleep 0.250
|
|
send "ddiecho TEXT\033"
|
|
sleep 0.250
|
|
send "hhtTrN\r"
|
|
expect_prompt -re {\r\nTENT\r\n} {
|
|
puts "t-binding success"
|
|
} -nounmatched -re {\r\nfail} {
|
|
puts stderr "t-binding fail"
|
|
} unmatched {
|
|
puts stderr "Couldn't find expected output 'TENT'"
|
|
}
|
|
|
|
# Switch back to regular (emacs mode) key bindings.
|
|
send "set -g fish_key_bindings fish_default_key_bindings\r"
|
|
expect_prompt
|
|
|
|
# Verify the custom escape timeout of 200ms set earlier is still in effect.
|
|
send "echo fish_escape_delay_ms=\$fish_escape_delay_ms\r"
|
|
expect_prompt -re {\r\nfish_escape_delay_ms=200\r\n} {
|
|
puts "default-mode custom timeout set correctly"
|
|
} unmatched {
|
|
puts stderr "default-mode custom timeout not set correctly"
|
|
}
|
|
|
|
# Reset it to 100ms.
|
|
send "set -g fish_escape_delay_ms 100\r"
|
|
expect_prompt
|
|
|
|
# Verify the emacs transpose word (\et) behavior using various delays,
|
|
# including none, after the escape character.
|
|
|
|
# Start by testing with no delay. This should transpose the words.
|
|
send "echo abc def"
|
|
send "\033"
|
|
send "t\r"
|
|
expect_prompt -re {\r\ndef abc\r\n} {
|
|
puts "emacs transpose words, 100ms timeout: no delay"
|
|
} unmatched {
|
|
puts stderr "emacs transpose words fail, 100ms timeout: no delay"
|
|
}
|
|
|
|
|
|
# Same test as above but with a slight delay less than the escape timeout.
|
|
send "echo ghi jkl"
|
|
send "\033"
|
|
sleep 0.080
|
|
send "t\r"
|
|
expect_prompt -re {\r\njkl ghi\r\n} {
|
|
puts "emacs transpose words, 100ms timeout: short delay"
|
|
} unmatched {
|
|
puts stderr "emacs transpose words fail, 100ms timeout: short delay"
|
|
}
|
|
|
|
# Now test with a delay > the escape timeout. The transposition should not
|
|
# occur and the "t" should become part of the text that is echoed.
|
|
send "echo mno pqr"
|
|
send "\033"
|
|
sleep 0.250
|
|
send "t\r"
|
|
expect_prompt -re {\r\nmno pqrt\r\n} {
|
|
puts "emacs transpose words, 100ms timeout: long delay"
|
|
} unmatched {
|
|
puts stderr "emacs transpose words fail, 100ms timeout: long delay"
|
|
}
|
|
|
|
# Verify special characters, such as \cV, are not intercepted by the kernel
|
|
# tty driver. Rather, they can be bound and handled by fish.
|
|
send "bind \\cV 'echo ctrl-v seen'\r"
|
|
expect_prompt
|
|
send "\026\r"
|
|
expect_prompt -re {ctrl-v seen} {
|
|
puts "ctrl-v seen"
|
|
} unmatched {
|
|
puts stderr "ctrl-v not seen"
|
|
}
|
|
|
|
send "bind \\cO 'echo ctrl-o seen'\r"
|
|
expect_prompt
|
|
send "\017\r"
|
|
expect_prompt -re {ctrl-o seen} {
|
|
puts "ctrl-o seen"
|
|
} unmatched {
|
|
puts stderr "ctrl-o not seen"
|
|
}
|