aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/input.cpp16
-rw-r--r--tests/bind.expect11
-rw-r--r--tests/bind.expect.out1
3 files changed, 27 insertions, 1 deletions
diff --git a/src/input.cpp b/src/input.cpp
index bc64889e..c2499d1a 100644
--- a/src/input.cpp
+++ b/src/input.cpp
@@ -42,6 +42,7 @@
#include "output.h"
#include <vector>
#include <algorithm>
+#include <deque>
#define DEFAULT_TERM L"ansi"
#define MAX_INPUT_FUNCTION_ARGS 20
@@ -538,10 +539,23 @@ wchar_t input_function_pop_arg()
void input_function_push_args(int code)
{
int arity = input_function_arity(code);
+ std::deque<wchar_t> skipped;
+
for (int i = 0; i < arity; i++)
{
- input_function_push_arg(input_common_readch(0));
+ wchar_t arg;
+
+ // skip and queue up any function codes
+ while(((arg = input_common_readch(0)) >= R_MIN) && (arg <= R_MAX))
+ {
+ skipped.push_front(arg);
+ }
+
+ input_function_push_arg(arg);
}
+
+ // push the function codes back into the input stream
+ std::for_each(skipped.begin(), skipped.end(), input_common_next_ch);
}
/**
diff --git a/tests/bind.expect b/tests/bind.expect
index 25270955..42cd3409 100644
--- a/tests/bind.expect
+++ b/tests/bind.expect
@@ -37,6 +37,17 @@ expect_prompt -re {\r\nTAXT\r\n} {
puts stderr "Couldn't find expected output 'TAXT'"
}
+# 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_line "\033ddiecho TEXT\033hhtTrN"
+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'"
+}
+
# still in insert mode, switch back to regular key bindings
send_line -h "set -g fish_key_bindings fish_default_key_bindings"
expect_prompt
diff --git a/tests/bind.expect.out b/tests/bind.expect.out
index 7f883abd..5777546d 100644
--- a/tests/bind.expect.out
+++ b/tests/bind.expect.out
@@ -1,4 +1,5 @@
success
success
replace success
+t-binding success
success