xref: /openbsd/regress/bin/ksh/edit/emacs.sh (revision f45a9042)
182270653Santon#!/bin/sh
282270653Santon#
3*f45a9042Sjasper# $OpenBSD: emacs.sh,v 1.15 2021/09/02 07:14:15 jasper Exp $
45ed25df9Santon#
582270653Santon# Copyright (c) 2017 Anton Lindqvist <anton@openbsd.org>
637f3e371Sschwarze# Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
782270653Santon#
882270653Santon# Permission to use, copy, modify, and distribute this software for any
982270653Santon# purpose with or without fee is hereby granted, provided that the above
1082270653Santon# copyright notice and this permission notice appear in all copies.
1182270653Santon#
1282270653Santon# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1382270653Santon# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1482270653Santon# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1582270653Santon# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1682270653Santon# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1782270653Santon# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1882270653Santon# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1982270653Santon
2082270653Santon. "${1:-.}/subr.sh"
2182270653Santon
22f8e6ffd8SantonKSH=$2
23f8e6ffd8Santon
2482270653SantonEDITOR=
25997ea89aSantonENV=
2682270653SantonHISTFILE=
2782270653SantonMAIL=
28c0603667SantonPS1=' # '
2982270653SantonVISUAL=emacs
30*f45a9042Sjasperexport EDITOR ENV HISTFILE MAIL PS1 VISUAL
3182270653Santon
326908c6b3Sschwarze# The function testseq() sets up a pseudo terminal and feeds its first
336908c6b3Sschwarze# argument to a shell on standard input.  It then checks that output
346908c6b3Sschwarze# from the shell to the pseudo terminal agrees with the second argument.
356908c6b3Sschwarze
3682270653Santon# auto-insert
37c0603667Santontestseq "abc" " # abc"
3837f3e371Sschwarze
3937f3e371Sschwarze# insertion of valid UTF-8
40c0603667Santontestseq "z\0002\0302\0200" " # z\b\0302\0200z\b"
41c0603667Santontestseq "z\0002\0337\0277" " # z\b\0337\0277z\b"
42c0603667Santontestseq "z\0002\0340\0240\0200" " # z\b\0340\0240\0200z\b"
43c0603667Santontestseq "z\0002\0354\0277\0277" " # z\b\0354\0277\0277z\b"
44c0603667Santontestseq "z\0002\0355\0200\0200" " # z\b\0355\0200\0200z\b"
45c0603667Santontestseq "z\0002\0355\0237\0277" " # z\b\0355\0237\0277z\b"
46c0603667Santontestseq "z\0002\0356\0200\0200" " # z\b\0356\0200\0200z\b"
47c0603667Santontestseq "z\0002\0357\0277\0277" " # z\b\0357\0277\0277z\b"
4806284b46Sschwarzetestseq "z\0002\0360\0220\0200\0200" " # z\b\0360\0220\0200\0200z\b"
4906284b46Sschwarzetestseq "z\0002\0360\0277\0277\0277" " # z\b\0360\0277\0277\0277z\b"
5006284b46Sschwarzetestseq "z\0002\0361\0200\0200\0200" " # z\b\0361\0200\0200\0200z\b"
5106284b46Sschwarzetestseq "z\0002\0363\0277\0277\0277" " # z\b\0363\0277\0277\0277z\b"
52c0603667Santontestseq "z\0002\0364\0200\0200\0200" " # z\b\0364\0200\0200\0200z\b"
53c0603667Santontestseq "z\0002\0364\0217\0277\0277" " # z\b\0364\0217\0277\0277z\b"
5437f3e371Sschwarze
5537f3e371Sschwarze# insertion of incomplete UTF-8
56c0603667Santontestseq "z\0002\0302\0006" " # z\b\0302z\bz"
57c0603667Santontestseq "z\0002\0377\0006" " # z\b\0377z\bz"
58c0603667Santontestseq "z\0002\0337\0006" " # z\b\0337z\bz"
59c0603667Santontestseq "z\0002\0340\0006" " # z\b\0340z\bz"
60c0603667Santontestseq "z\0002\0357\0006" " # z\b\0357z\bz"
61c0603667Santontestseq "z\0002\0364\0006" " # z\b\0364z\bz"
62c0603667Santontestseq "z\0002\0340\0240\0006" " # z\b\0340\0240z\bz"
63c0603667Santontestseq "z\0002\0354\0277\0006" " # z\b\0354\0277z\bz"
64c0603667Santontestseq "z\0002\0355\0200\0006" " # z\b\0355\0200z\bz"
65c0603667Santontestseq "z\0002\0355\0237\0006" " # z\b\0355\0237z\bz"
66c0603667Santontestseq "z\0002\0356\0200\0006" " # z\b\0356\0200z\bz"
67c0603667Santontestseq "z\0002\0357\0277\0006" " # z\b\0357\0277z\bz"
6806284b46Sschwarzetestseq "z\0002\0360\0220\0200\0006" " # z\b\0360\0220\0200z\bz"
6906284b46Sschwarzetestseq "z\0002\0360\0277\0277\0006" " # z\b\0360\0277\0277z\bz"
7006284b46Sschwarzetestseq "z\0002\0361\0200\0200\0006" " # z\b\0361\0200\0200z\bz"
71998a0ad9Sschwarzetestseq "z\0002\0363\0200\0200\0006" " # z\b\0363\0200\0200z\bz"
72998a0ad9Sschwarzetestseq "z\0002\0363\0277\0277\0006" " # z\b\0363\0277\0277z\bz"
73c0603667Santontestseq "z\0002\0364\0200\0200\0006" " # z\b\0364\0200\0200z\bz"
74c0603667Santontestseq "z\0002\0364\0217\0277\0006" " # z\b\0364\0217\0277z\bz"
7537f3e371Sschwarze
7637f3e371Sschwarze# insertion of invalid bytes
77c0603667Santontestseq "z\0002\0300\0277" " # z\b\0300z\b\b\0300\0277z\b"
78c0603667Santontestseq "z\0002\0301\0277" " # z\b\0301z\b\b\0301\0277z\b"
79c0603667Santontestseq "z\0002\0360\0217" " # z\b\0360z\b\b\0360\0217z\b"
80c0603667Santontestseq "z\0002\0365\0217" " # z\b\0365z\b\b\0365\0217z\b"
81c0603667Santontestseq "z\0002\0367\0217" " # z\b\0367z\b\b\0367\0217z\b"
82c0603667Santontestseq "z\0002\0370\0217" " # z\b\0370z\b\b\0370\0217z\b"
83c0603667Santontestseq "z\0002\0377\0217" " # z\b\0377z\b\b\0377\0217z\b"
8437f3e371Sschwarze
8537f3e371Sschwarze# insertion of excessively long encodings
8637f3e371Sschwarzetestseq "z\0002\0340\0200\0200" \
87c0603667Santon	" # z\b\0340z\b\b\0340\0200z\b\b\0340\0200\0200z\b"
8837f3e371Sschwarzetestseq "z\0002\0340\0201\0277" \
89c0603667Santon	" # z\b\0340z\b\b\0340\0201z\b\b\0340\0201\0277z\b"
9037f3e371Sschwarzetestseq "z\0002\0340\0202\0200" \
91c0603667Santon	" # z\b\0340z\b\b\0340\0202z\b\b\0340\0202\0200z\b"
9237f3e371Sschwarzetestseq "z\0002\0340\0237\0277" \
93c0603667Santon	" # z\b\0340z\b\b\0340\0237z\b\b\0340\0237\0277z\b"
9406284b46Sschwarzetestseq "z\0002\0360\0200\0200\0200" \
9506284b46Sschwarze  " # z\b\0360z\b\b\0360\0200z\b\b\0360\0200\0200z\b\b\0360\0200\0200\0200z\b"
9606284b46Sschwarzetestseq "z\0002\0360\0217\0277\0277" \
9706284b46Sschwarze  " # z\b\0360z\b\b\0360\0217z\b\b\0360\0217\0277z\b\b\0360\0217\0277\0277z\b"
9837f3e371Sschwarze
9937f3e371Sschwarze# insertion of surrogates and execessive code points
10037f3e371Sschwarzetestseq "z\0002\0355\0240\0200" \
101c0603667Santon	" # z\b\0355z\b\b\0355\0240z\b\b\0355\0240\0200z\b"
10237f3e371Sschwarzetestseq "z\0002\0355\0277\0277" \
103c0603667Santon	" # z\b\0355z\b\b\0355\0277z\b\b\0355\0277\0277z\b"
10437f3e371Sschwarzetestseq "z\0002\0364\0220\0200\0200" \
105c0603667Santon  " # z\b\0364z\b\b\0364\0220z\b\b\0364\0220\0200z\b\b\0364\0220\0200\0200z\b"
10637f3e371Sschwarzetestseq "z\0002\0364\0277\0277\0277" \
107c0603667Santon  " # z\b\0364z\b\b\0364\0277z\b\b\0364\0277\0277z\b\b\0364\0277\0277\0277z\b"
1080a8992d0Santon
1090a8992d0Santon# insertion of unmatched meta sequence
110c0603667Santontestseq "z\0002\0033[3z" " # z\b\0007"
111aaf5d128Santon
112aaf5d128Santon# ^C, ^G: abort
113aaf5d128Santontestseq "echo 1\0003" " # echo 1\r\n # "
114aaf5d128Santontestseq "echo 1\0007" " # echo 1\r\n # "
115aaf5d128Santon
116aaf5d128Santon# ^B, Left: backward-char
117aaf5d128Santontestseq "\0002" " # \0007"
118aaf5d128Santontestseq "a\0002" " # a\0010"
119aaf5d128Santontestseq "\0303\0266\0002" " # \0303\0266\0010"
120aaf5d128Santontestseq "a\0033[D" " # a\0010"
121aaf5d128Santontestseq "a\0033OD" " # a\0010"
122aaf5d128Santon
123aaf5d128Santon# ^[b, Ctrl-Left: backward-word
124aaf5d128Santontestseq "\0033b" " # \0007"
125aaf5d128Santontestseq "a1_$\0033b" " # a1_$\0010\0010\0010\0010"
126aaf5d128Santontestseq "a1 \0303\0266\0033b\0033b" " # a1 \0303\0266\0010\0010\0010\0010"
127aaf5d128Santontestseq "a1_$\0033[1;5D" " # a1_$\0010\0010\0010\0010"
128aaf5d128Santon
129aaf5d128Santon# ^[<: beginning-of-history
130aaf5d128Santontestseq "\0033<" " # \0007"
131aaf5d128Santontestseq ": 1\n: 2\n\0033<" " # : 1\r\r\n # : 2\r\r\n # \r # : 1 \0010"
132aaf5d128Santon
133aaf5d128Santon# ^A, Home, Ctrl-Down: beginning-of-line
134aaf5d128Santontestseq "\0001" " # "
135aaf5d128Santontestseq "aa\0001" " # aa\0010\0010"
136aaf5d128Santontestseq "\0303\0266\0001" " # \0303\0266\0010"
137aaf5d128Santontestseq "aa\0033[H" " # aa\0010\0010"
138aaf5d128Santontestseq "aa\0033OH" " # aa\0010\0010"
139aaf5d128Santontestseq "aa\0033[1~" " # aa\0010\0010"
140aaf5d128Santontestseq "aa\0033[1;5B" " # aa\0010\0010"
141aaf5d128Santon
142aaf5d128Santon# [n] ^[C, ^[c: capitalize-word
143aaf5d128Santontestseq "\0033C\0033c" " # \0007\0007"
144aaf5d128Santontestseq "ab cd\0001\0033C" " # ab cd\0010\0010\0010\0010\0010Ab"
145aaf5d128Santontestseq "ab\0001\00332\0033C" " # ab\0010\0010Ab"
146aaf5d128Santontestseq "ab cd\0001\00332\0033C" " # ab cd\0010\0010\0010\0010\0010Ab Cd"
147aaf5d128Santontestseq "1a\0001\0033C" " # 1a\0010\00101a"
148aaf5d128Santontestseq "\0026\0002\0001\0033C" " # ^B\0010\0010^B"
149aaf5d128Santontestseq "\0303\0266b\0001\0033C" " # \0303\0266b\0010\0010\0303\0266b"
150aaf5d128Santon
151aaf5d128Santon# ^[#: comment
152aaf5d128Santontestseq "\0033#" " # \r #  \0010\r\r\n # "
153aaf5d128Santontestseq "a\0033#" " # a\r # #a \0010\0010\0010\r\r\n # "
154aaf5d128Santon
155aaf5d128Santon# XXX ^[^[: complete
156aaf5d128Santon# XXX ^X^[: complete-command
157aaf5d128Santon# XXX ^[^X: complete-file
158aaf5d128Santon# XXX ^I, ^[=: complete-list
159aaf5d128Santon
160aaf5d128Santon# [n] ERASE, ^?, ^H: delete-char-backward
161aaf5d128Santontestseq "\0177\0010" " # \0007\0007"
162aaf5d128Santontestseq "ab\00332\0177" " # ab\0010\0010  \0010\0010"
163aaf5d128Santontestseq "a\00332\0177" " # a\0010 \0010"
164aaf5d128Santontestseq "\0303\0266\0177" " # \0303\0266\0010 \0010"
165aaf5d128Santon
166aaf5d128Santon# [n] Delete: delete-char-forward
167aaf5d128Santontestseq "\0033[3~" " # \0007"
168aaf5d128Santontestseq "a\0033[3~" " # a\0007"
169aaf5d128Santontestseq "a\0001\0033[3~" " # a\0010 \0010"
170aaf5d128Santontestseq "ab\0001\00332\0033[3~" " # ab\0010\0010  \0010\0010"
171aaf5d128Santontestseq "a\0001\00332\0033[3~" " # a\0010 \0010"
172aaf5d128Santontestseq "\0303\0266\0001\0033[3~" " # \0303\0266\0010 \0010"
173aaf5d128Santon
174aaf5d128Santon# [n] ^[ERASE, ^[^?, ^[^H, ^[h: delete-word-backward
175aaf5d128Santontestseq "\0033\0177\033\0010\0033h" " # \0007\0007\0007"
176aaf5d128Santontestseq "ab\0033\0177" " # ab\0010\0010  \0010\0010"
177aaf5d128Santontestseq "ab cd\00332\0033\0177" \
178aaf5d128Santon	" # ab cd\0010\0010\0010\0010\0010     \0010\0010\0010\0010\0010"
179aaf5d128Santontestseq "ab\00332\0033\0177" " # ab\0010\0010  \0010\0010"
180aaf5d128Santontestseq "ab \0303\0266\0033\0177" " # ab \0303\0266\0010 \0010"
181aaf5d128Santon
182aaf5d128Santon# [n] ^[d: delete-word-forward
183aaf5d128Santontestseq "\0033d" " # \0007"
184aaf5d128Santontestseq "ab\0001\0033d" " # ab\0010\0010  \0010\0010"
185aaf5d128Santontestseq "ab cd\0001\00332\0033d" \
186aaf5d128Santon	" # ab cd\0010\0010\0010\0010\0010     \0010\0010\0010\0010\0010"
187aaf5d128Santontestseq "ab\0001\00332\0033d" " # ab\0010\0010  \0010\0010"
188aaf5d128Santon
189aaf5d128Santon# [n] ^N, ^XB, Down: down-history
190aaf5d128Santon# [n] ^P, ^XA, Up: up-history
191aaf5d128Santontestseq "\0016\0030B\0020\0030A" " # \0007\0007\0007\0007"
192aaf5d128Santontestseq ": 1\n\0020\0016" " # : 1\r\r\n # \r # : 1 \0010\0007"
193aaf5d128Santontestseq ": 1\n: 2\n\0020\0020\0016" \
194aaf5d128Santon	" # : 1\r\r\n # : 2\r\r\n # \r # : 2 \0010\r # : 1 \0010\r # : 2 \0010"
195aaf5d128Santontestseq ": 1\n: 2\n\0033[A\0033[A\0033[B" \
196aaf5d128Santon	" # : 1\r\r\n # : 2\r\r\n # \r # : 2 \0010\r # : 1 \0010\r # : 2 \0010"
197aaf5d128Santontestseq ": 1\n: 2\n\0033OA\0033OA\0033OB" \
198aaf5d128Santon	" # : 1\r\r\n # : 2\r\r\n # \r # : 2 \0010\r # : 1 \0010\r # : 2 \0010"
199aaf5d128Santon
200aaf5d128Santon# [n] ^[L, ^[l: downcase-word
201aaf5d128Santontestseq "\0033L\0033l" " # \0007\0007"
202aaf5d128Santontestseq "AB\0001\0033L" " # AB\0010\0010ab"
203aaf5d128Santontestseq "AB CD\0001\00332\0033L" " # AB CD\0010\0010\0010\0010\0010ab cd"
204aaf5d128Santontestseq "AB\0001\00332\0033L" " # AB\0010\0010ab"
205aaf5d128Santontestseq "1A\0001\0033L" " # 1A\0010\00101a"
206aaf5d128Santontestseq "\0026\0002A\0001\0033L" " # ^BA\0010\0010\0010^Ba"
207aaf5d128Santontestseq "\0303\0266A\0001\0033L" " # \0303\0266A\0010\0010\0303\0266a"
208aaf5d128Santon
209aaf5d128Santon# ^[>: end-of-history
210aaf5d128Santontestseq "\0033>" " # \0007"
211aaf5d128Santontestseq ": 1\n\0033>" " # : 1\r\r\n # \r # : 1 \0010"
212aaf5d128Santon
213aaf5d128Santon# ^E, End, Ctrl-Up: end-of-line
214aaf5d128Santontestseq "\0005" " # "
215aaf5d128Santontestseq "abc\0001\0005" " # abc\0010\0010\0010abc"
216aaf5d128Santontestseq "\0303\0266\0001\0005" " # \0303\0266\0010\0303\0266"
217aaf5d128Santontestseq "abc\0001\0033[F" " # abc\0010\0010\0010abc"
218aaf5d128Santontestseq "abc\0001\0033OF" " # abc\0010\0010\0010abc"
219aaf5d128Santontestseq "abc\0001\0033[4~" " # abc\0010\0010\0010abc"
220aaf5d128Santontestseq "abc\0001\0033[1;5A" " # abc\0010\0010\0010abc"
221aaf5d128Santon
222aaf5d128Santon# ^_: eot
223aaf5d128Santontestseq "\0037" " # ^D\r\r"
224aaf5d128Santon
225aaf5d128Santon# [n] ^D: eot-or-delete
226aaf5d128Santontestseq "\0004" " # ^D\r\r"
227aaf5d128Santon
228aaf5d128Santon# ^X^X: exchange-point-and-mark
229aaf5d128Santon# ^[space: set-mark-command
230aaf5d128Santontestseq "\0030\0030" " # \0007"
231aaf5d128Santontestseq "abc\0033 \0001\0030\0030" " # abc\0010\0010\0010abc"
232aaf5d128Santontestseq "\0303\0266\0033 \0001\0030\0030" " # \0303\0266\0010\0303\0266"
233aaf5d128Santon
234aaf5d128Santon# XXX ^[*: expand-file
235aaf5d128Santon
236aaf5d128Santon# [n] ^F, ^XC, Right: forward-char
237aaf5d128Santontestseq "\0006\0030C" " # \0007\0007"
238aaf5d128Santontestseq "abc\0001\0006" " # abc\0010\0010\0010a"
239aaf5d128Santontestseq "abc\0001\00332\0006" " # abc\0010\0010\0010ab"
240aaf5d128Santontestseq "a\0001\00332\0006" " # a\0010a"
241aaf5d128Santontestseq "\0303\0266\0001\0006" " # \0303\0266\0010\0303\0266"
242aaf5d128Santontestseq "abc\0001\0033[C" " # abc\0010\0010\0010a"
243aaf5d128Santontestseq "abc\0001\0033OC" " # abc\0010\0010\0010a"
244aaf5d128Santon
245aaf5d128Santon# [n] ^[f, Ctrl-Right: forward-word
246aaf5d128Santontestseq "\0033f" " # \0007"
247aaf5d128Santontestseq "ab\0001\0033f" " # ab\0010\0010ab"
248aaf5d128Santontestseq "ab cd\0001\00332\0033f" " # ab cd\0010\0010\0010\0010\0010ab cd"
249aaf5d128Santontestseq "ab\0001\00332\0033f" " # ab\0010\0010ab"
250aaf5d128Santontestseq "\0303\0266\0001\0033f" " # \0303\0266\0010\0303\0266"
251aaf5d128Santontestseq "ab\0001\0033[1;5C" " # ab\0010\0010ab"
252aaf5d128Santon
253aaf5d128Santon# [n] ^[g: goto-history
254aaf5d128Santontestseq "\0033g" " # \0007"
255aaf5d128Santontestseq ": 1\n\0033g" " # : 1\r\r\n # \r # : 1 \0010"
256aaf5d128Santontestseq ": 1\n: 2\n\00332\0033g" " # : 1\r\r\n # : 2\r\r\n # \r # : 2 \0010"
257aaf5d128Santontestseq ": 1\n\00332\0033g" " # : 1\r\r\n # \0007"
258aaf5d128Santon
259aaf5d128Santon# KILL: kill-line
260aaf5d128Santontestseq "\0025" " # \r #  \0010"
261aaf5d128Santontestseq "ab\0025" " # ab\r #    \0010\0010\0010"
262aaf5d128Santon
263aaf5d128Santon# [n] ^K: kill-to-eol
264aaf5d128Santontestseq "\0013" " # "
265aaf5d128Santontestseq "abc\0002\0002\0013" " # abc\0010\0010  \0010\0010"
266aaf5d128Santon
267aaf5d128Santon# XXX ^[?: list
268aaf5d128Santon# XXX ^X?: list-command
269aaf5d128Santon# XXX ^X^Y: list-file
270aaf5d128Santon
271aaf5d128Santon# ^J, ^M: newline
272aaf5d128Santontestseq "\0012\0015" " # \r\r\n # \r\r\n # "
273aaf5d128Santontestseq ": 1\0012" " # : 1\r\r\n # "
274aaf5d128Santontestseq ": 1\0001\0012" " # : 1\0010\0010\0010\r\r\n # "
275aaf5d128Santon
276aaf5d128Santon# ^O: newline-and-next
277aaf5d128Santontestseq "\0017" " # \r\r\n # \0007"
278aaf5d128Santontestseq ": 1\n: 2\n\0020\0020\0017" \
279aaf5d128Santon	" # : 1\r\r\n # : 2\r\r\n # \r # : 2 \0010\r # : 1 \0010\r\r\n # \r # : 2 \0010"
280aaf5d128Santon
281aaf5d128Santon# QUIT: no-op
282aaf5d128Santontestseq "\0034" " # "
283aaf5d128Santon
284aaf5d128Santon# [n] ^[., ^[_: prev-hist-word
285aaf5d128Santontestseq "\0033.\0033_" " # \0007\0007"
286aaf5d128Santontestseq ": 1\n\0033." " # : 1\r\r\n # 1"
287aaf5d128Santontestseq ": 1\n\00331\0033." " # : 1\r\r\n # :"
288aaf5d128Santontestseq ": 1\n\00333\0033." " # : 1\r\r\n # "
289aaf5d128Santon
290aaf5d128Santon# ^V, ^^: quote
291aaf5d128Santontestseq "\0026\0001" " # ^A"
292aaf5d128Santontestseq "\0036\0001" " # ^A"
293aaf5d128Santon
294aaf5d128Santon# [n] ^[^]: search-character-backward
295aaf5d128Santontestseq "\0033\0035a" " # \0007"
296aaf5d128Santontestseq "echo\0033\0035e" " # echo\0010\0010\0010\0010"
297aaf5d128Santontestseq "echo\0033\0035a" " # echo\0007"
298aaf5d128Santontestseq "eecho\00332\0033\0035e" " # eecho\0010\0010\0010\0010\0010"
299aaf5d128Santontestseq "echo\00332\0033\0035e" " # echo\0007"
300aaf5d128Santon
301aaf5d128Santon# [n] ^]: search-character-forward
302aaf5d128Santontestseq "\0035a" " # \0007"
303aaf5d128Santontestseq "echo\0001\0035o" " # echo\0010\0010\0010\0010ech"
304aaf5d128Santontestseq "echo\0001\0035a" " # echo\0010\0010\0010\0010\0007"
305aaf5d128Santontestseq "echoo\0001\00332\0035o" " # echoo\0010\0010\0010\0010\0010echo"
306aaf5d128Santon# XXX differs from search-character-backward, should ring bell
307aaf5d128Santontestseq "echo\0001\00332\0035o" " # echo\0010\0010\0010\0010ech"
308aaf5d128Santon
309aaf5d128Santon# ^R: search-history
310aaf5d128Santontestseq "\0022" " # \r\nI-search: "
311aaf5d128Santontestseq "echo\n\0022e" \
312aaf5d128Santon	" # echo\r\r\n\r\n # \r\nI-search: \r\n\r # echo \0010\0010\0010\0010"
313aaf5d128Santontestseq "echo\n\0022a" " # echo\r\r\n\r\n # \r\nI-search: \0007\r\nI-search: a"
314aaf5d128Santon
315aaf5d128Santon# ^T: transpose-chars
316aaf5d128Santontestseq "\0024" " # \0007"
317aaf5d128Santontestseq "a\0024" " # a\0007"
318aaf5d128Santontestseq "ab\0024" " # ab\0010\0010ba"
319aaf5d128Santontestseq "ab\0001\0024" " # ab\0010\0010\0007"
320aaf5d128Santon# XXX UTF-8 testseq "\0303\0266a\0024" " # \0303\0266a\0010\0010a\303\0266"
321aaf5d128Santon
322aaf5d128Santon# [n] ^[U, ^[u: upcase-word
323aaf5d128Santontestseq "\0033U\0033u" " # \0007\0007"
324aaf5d128Santontestseq "ab\0001\0033U" " # ab\0010\0010AB"
325aaf5d128Santontestseq "ab cd\0001\00332\0033U" " # ab cd\0010\0010\0010\0010\0010AB CD"
326aaf5d128Santontestseq "ab\0001\00332\0033U" " # ab\0010\0010AB"
327aaf5d128Santontestseq "1a\0001\0033U" " # 1a\0010\00101A"
328aaf5d128Santontestseq "\0026\0002a\0001\0033U" " # ^Ba\0010\0010\0010^BA"
329aaf5d128Santontestseq "\0303\0266a\0001\0033U" " # \0303\0266a\0010\0010\0303\0266A"
330aaf5d128Santon
331aaf5d128Santon# ^Y: yank
332aaf5d128Santontestseq "\0031" " # \r\nnothing to yank\r\n # "
333aaf5d128Santontestseq "abc\0027\0031" " # abc\0010\0010\0010   \0010\0010\0010abc"
334aaf5d128Santontestseq "ab/cd\0027\0001\0031" \
335aaf5d128Santon	" # ab/cd\0010\0010  \0010\0010\0010\0010\0010cdab/\0010\0010\0010"
336aaf5d128Santon
337aaf5d128Santon# ^[y: yank-pop
338aaf5d128Santontestseq "\0033y" " # \r\nyank something first\r\n # "
339aaf5d128Santontestseq "ab/cd\0027\0027\0031\0033y" \
340aaf5d128Santon	" # ab/cd\0010\0010  \0010\0010\0010\0010\0010   \0010\0010\0010ab/\0010\0010\0010   \0010\0010\0010cd"
341