aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/files/vi/D_first.in3
-rw-r--r--tests/files/vi/D_last.in4
-rw-r--r--tests/files/vi/ascii.txt4
-rw-r--r--tests/files/vi/ascii_D_first.out4
-rw-r--r--tests/files/vi/ascii_D_last.out4
-rw-r--r--tests/files/vi/ascii_dd_first.out3
-rw-r--r--tests/files/vi/ascii_dd_last.out3
-rw-r--r--tests/files/vi/ascii_dw_first.out4
-rw-r--r--tests/files/vi/ascii_dw_last.out4
-rw-r--r--tests/files/vi/dd_first.in3
-rw-r--r--tests/files/vi/dd_last.in4
-rw-r--r--tests/files/vi/dw_first.in3
-rw-r--r--tests/files/vi/dw_last.in6
-rw-r--r--tests/vi.test72
-rw-r--r--toys/pending/vi.c20
15 files changed, 138 insertions, 3 deletions
diff --git a/tests/files/vi/D_first.in b/tests/files/vi/D_first.in
new file mode 100644
index 00000000..0e3ce347
--- /dev/null
+++ b/tests/files/vi/D_first.in
@@ -0,0 +1,3 @@
+D
+:wq
+
diff --git a/tests/files/vi/D_last.in b/tests/files/vi/D_last.in
new file mode 100644
index 00000000..355c8c4f
--- /dev/null
+++ b/tests/files/vi/D_last.in
@@ -0,0 +1,4 @@
+G
+D
+:wq
+
diff --git a/tests/files/vi/ascii.txt b/tests/files/vi/ascii.txt
new file mode 100644
index 00000000..ee9f73ba
--- /dev/null
+++ b/tests/files/vi/ascii.txt
@@ -0,0 +1,4 @@
+abc def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_D_first.out b/tests/files/vi/ascii_D_first.out
new file mode 100644
index 00000000..83a48a25
--- /dev/null
+++ b/tests/files/vi/ascii_D_first.out
@@ -0,0 +1,4 @@
+
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_D_last.out b/tests/files/vi/ascii_D_last.out
new file mode 100644
index 00000000..ee9f73ba
--- /dev/null
+++ b/tests/files/vi/ascii_D_last.out
@@ -0,0 +1,4 @@
+abc def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_dd_first.out b/tests/files/vi/ascii_dd_first.out
new file mode 100644
index 00000000..3361750a
--- /dev/null
+++ b/tests/files/vi/ascii_dd_first.out
@@ -0,0 +1,3 @@
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_dd_last.out b/tests/files/vi/ascii_dd_last.out
new file mode 100644
index 00000000..dd43ed6d
--- /dev/null
+++ b/tests/files/vi/ascii_dd_last.out
@@ -0,0 +1,3 @@
+abc def hij
+klm nop qrs
+tuv wxy z
diff --git a/tests/files/vi/ascii_dw_first.out b/tests/files/vi/ascii_dw_first.out
new file mode 100644
index 00000000..400e1cb1
--- /dev/null
+++ b/tests/files/vi/ascii_dw_first.out
@@ -0,0 +1,4 @@
+def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_dw_last.out b/tests/files/vi/ascii_dw_last.out
new file mode 100644
index 00000000..ee9f73ba
--- /dev/null
+++ b/tests/files/vi/ascii_dw_last.out
@@ -0,0 +1,4 @@
+abc def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/dd_first.in b/tests/files/vi/dd_first.in
new file mode 100644
index 00000000..e1a138b8
--- /dev/null
+++ b/tests/files/vi/dd_first.in
@@ -0,0 +1,3 @@
+dd
+:wq
+
diff --git a/tests/files/vi/dd_last.in b/tests/files/vi/dd_last.in
new file mode 100644
index 00000000..821e7bf4
--- /dev/null
+++ b/tests/files/vi/dd_last.in
@@ -0,0 +1,4 @@
+G
+dd
+:wq
+
diff --git a/tests/files/vi/dw_first.in b/tests/files/vi/dw_first.in
new file mode 100644
index 00000000..919e2aad
--- /dev/null
+++ b/tests/files/vi/dw_first.in
@@ -0,0 +1,3 @@
+dw
+:wq
+
diff --git a/tests/files/vi/dw_last.in b/tests/files/vi/dw_last.in
new file mode 100644
index 00000000..dc69492f
--- /dev/null
+++ b/tests/files/vi/dw_last.in
@@ -0,0 +1,6 @@
+G
+$
+b
+dw
+:wq
+
diff --git a/tests/vi.test b/tests/vi.test
new file mode 100644
index 00000000..1c6ff241
--- /dev/null
+++ b/tests/vi.test
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/dd_first.in cmd.txt
+cp $FILES/vi/ascii_dd_first.out out.txt
+
+
+testing "dd first line ascii" \
+ "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown
+rm in.txt cmd.txt out.txt
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/dd_last.in cmd.txt
+cp $FILES/vi/ascii_dd_last.out out.txt
+
+testing "dd last line ascii" \
+ "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown
+rm in.txt cmd.txt out.txt
+
+
+## setup
+#cp $FILES/vi/ascii.txt in.txt
+#cp $FILES/vi/dw_last.in cmd.txt
+#cp $FILES/vi/ascii_dw_last.out out.txt
+#
+#testing "dw last line ascii" \
+# "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+#
+## teardown
+#rm in.txt cmd.txt out.txt
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/dw_first.in cmd.txt
+cp $FILES/vi/ascii_dw_first.out out.txt
+
+testing "dw first line ascii" \
+ "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown
+rm in.txt cmd.txt out.txt
+
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/D_first.in cmd.txt
+cp $FILES/vi/ascii_D_first.out out.txt
+
+testing "D first line ascii" \
+ "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown
+rm in.txt cmd.txt out.txt
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/D_last.in cmd.txt
+cp $FILES/vi/ascii_D_last.out out.txt
+
+testing "D last line ascii" \
+ "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown
+rm in.txt cmd.txt out.txt
diff --git a/toys/pending/vi.c b/toys/pending/vi.c
index 9c47a4c5..a21867b2 100644
--- a/toys/pending/vi.c
+++ b/toys/pending/vi.c
@@ -5,13 +5,14 @@
*
* See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html
-USE_VI(NEWTOY(vi, "<1>1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_VI(NEWTOY(vi, ">1s:", TOYFLAG_USR|TOYFLAG_BIN))
config VI
bool "vi"
default n
help
- usage: vi FILE
+ usage: vi [-s script] FILE
+ -s script: run script file
Visual text editor. Predates the existence of standardized cursor keys,
so the controls are weird and historical.
*/
@@ -20,6 +21,7 @@ config VI
#include "toys.h"
GLOBALS(
+ char *s;
int cur_col;
int cur_row;
int scr_row;
@@ -885,6 +887,8 @@ void vi_main(void)
char vi_buf[16] = {0};
char utf8_code[8] = {0};
int utf8_dec_p = 0, vi_buf_pos = 0;
+ FILE *script = 0;
+ if (FLAG(s)) script = fopen(TT.s, "r");
TT.il = xzalloc(sizeof(struct str_line));
TT.il->data = xzalloc(80);
@@ -912,7 +916,15 @@ void vi_main(void)
draw_page();
for (;;) {
- int key = scan_key(keybuf, -1);
+ int key = 0;
+ if (script) {
+ key = fgetc(script);
+ if (key == EOF) {
+ fclose(script);
+ script = 0;
+ key = scan_key(keybuf, -1);
+ }
+ } else key = scan_key(keybuf, -1);
if (key == -1) goto cleanup_vi;
@@ -983,6 +995,7 @@ void vi_main(void)
TT.il->len = 0;
memset(TT.il->data, 0, TT.il->alloc);
break;
+ case 0x0A:
case 0x0D:
if (run_ex_cmd(TT.il->data) == -1)
goto cleanup_vi;
@@ -1018,6 +1031,7 @@ void vi_main(void)
TT.il->len -= shrink;
}
break;
+ case 0x0A:
case 0x0D:
//insert newline
//