diff options
-rw-r--r-- | tests/files/vi/D_first.in | 3 | ||||
-rw-r--r-- | tests/files/vi/D_last.in | 4 | ||||
-rw-r--r-- | tests/files/vi/ascii.txt | 4 | ||||
-rw-r--r-- | tests/files/vi/ascii_D_first.out | 4 | ||||
-rw-r--r-- | tests/files/vi/ascii_D_last.out | 4 | ||||
-rw-r--r-- | tests/files/vi/ascii_dd_first.out | 3 | ||||
-rw-r--r-- | tests/files/vi/ascii_dd_last.out | 3 | ||||
-rw-r--r-- | tests/files/vi/ascii_dw_first.out | 4 | ||||
-rw-r--r-- | tests/files/vi/ascii_dw_last.out | 4 | ||||
-rw-r--r-- | tests/files/vi/dd_first.in | 3 | ||||
-rw-r--r-- | tests/files/vi/dd_last.in | 4 | ||||
-rw-r--r-- | tests/files/vi/dw_first.in | 3 | ||||
-rw-r--r-- | tests/files/vi/dw_last.in | 6 | ||||
-rw-r--r-- | tests/vi.test | 72 | ||||
-rw-r--r-- | toys/pending/vi.c | 20 |
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 // |