diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | Makefile | 48 | ||||
-rw-r--r-- | ex.c | 65 | ||||
-rw-r--r-- | ex.h | 43 | ||||
-rw-r--r-- | ex_abbreviate.c | 3 | ||||
-rw-r--r-- | ex_ampersand.c | 3 | ||||
-rw-r--r-- | ex_append.c | 3 | ||||
-rw-r--r-- | ex_args.c | 3 | ||||
-rw-r--r-- | ex_change.c | 3 | ||||
-rw-r--r-- | ex_chdir.c | 3 | ||||
-rw-r--r-- | ex_command.c | 54 | ||||
-rw-r--r-- | ex_copy.c | 3 | ||||
-rw-r--r-- | ex_delete.c | 3 | ||||
-rw-r--r-- | ex_edit.c | 3 | ||||
-rw-r--r-- | ex_file.c | 3 | ||||
-rw-r--r-- | ex_global.c | 3 | ||||
-rw-r--r-- | ex_insert.c | 3 | ||||
-rw-r--r-- | ex_join.c | 3 | ||||
-rw-r--r-- | ex_list.c | 3 | ||||
-rw-r--r-- | ex_map.c | 3 | ||||
-rw-r--r-- | ex_mark.c | 3 | ||||
-rw-r--r-- | ex_move.c | 3 | ||||
-rw-r--r-- | ex_next.c | 3 | ||||
-rw-r--r-- | ex_number.c | 3 | ||||
-rw-r--r-- | ex_open.c | 3 | ||||
-rw-r--r-- | ex_preserve.c | 3 | ||||
-rw-r--r-- | ex_print.c | 3 | ||||
-rw-r--r-- | ex_put.c | 3 | ||||
-rw-r--r-- | ex_quit.c | 3 | ||||
-rw-r--r-- | ex_read.c | 3 | ||||
-rw-r--r-- | ex_recover.c | 3 | ||||
-rw-r--r-- | ex_rewind.c | 3 | ||||
-rw-r--r-- | ex_set.c | 3 | ||||
-rw-r--r-- | ex_shell.c | 3 | ||||
-rw-r--r-- | ex_source.c | 3 | ||||
-rw-r--r-- | ex_substitute.c | 3 | ||||
-rw-r--r-- | ex_suspend.c | 3 | ||||
-rw-r--r-- | ex_tag.c | 3 | ||||
-rw-r--r-- | ex_tilde.c | 3 | ||||
-rw-r--r-- | ex_unabbrev.c | 3 | ||||
-rw-r--r-- | ex_undo.c | 3 | ||||
-rw-r--r-- | ex_unmap.c | 3 | ||||
-rw-r--r-- | ex_version.c | 3 | ||||
-rw-r--r-- | ex_visual.c | 3 | ||||
-rw-r--r-- | ex_wq.c | 3 | ||||
-rw-r--r-- | ex_write.c | 3 | ||||
-rw-r--r-- | ex_xit.c | 3 | ||||
-rw-r--r-- | vi.h | 0 | ||||
-rw-r--r-- | vi_command.c | 290 |
49 files changed, 629 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ee2fdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +ex +vi +*.o diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..036c036 --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +default: vi + +vi: ex + ln -sf ex $@ + +ex: ex.o ex_command.o \ + ex_abbreviate.o\ + ex_append.o\ + ex_args.o\ + ex_change.o\ + ex_chdir.o\ + ex_copy.o\ + ex_delete.o\ + ex_edit.o\ + ex_file.o\ + ex_global.o\ + ex_insert.o\ + ex_join.o\ + ex_list.o\ + ex_map.o\ + ex_mark.o\ + ex_move.o\ + ex_next.o\ + ex_number.o\ + ex_open.o\ + ex_preserve.o\ + ex_print.o\ + ex_put.o\ + ex_quit.o\ + ex_read.o\ + ex_recover.o\ + ex_rewind.o\ + ex_set.o\ + ex_shell.o\ + ex_source.o\ + ex_substitute.o\ + ex_ampersand.o\ + ex_tilde.o\ + ex_suspend.o\ + ex_tag.o\ + ex_unabbrev.o\ + ex_undo.o\ + ex_unmap.o\ + ex_version.o\ + ex_visual.o\ + ex_write.o\ + ex_wq.o\ + ex_xit.o\ @@ -0,0 +1,65 @@ +#define _XOPEN_SOURCE 700 +#include <libgen.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +int main(int argc, char *argv[]) +{ + int visual = 0; + const char *options = "rRsvc:t:w:"; + if (!strcmp(basename(argv[0]), "vi")) { + options = "rRc:t:w:"; + visual = 1; + } + + char *command = NULL; + int recovery = 0; + int readonly = 0; + int batch = 0; + char *tag = NULL; + int window = 0; + + int c; + while ((c = getopt(argc, argv, options)) != -1) { + switch (c) { + case 'c': + command = optarg; + break; + + case 'r': + recovery = 1; + break; + + case 'R': + readonly = 1; + break; + + case 's': + batch = 1; + break; + + case 't': + tag = optarg; + break; + + case 'v': + visual = 1; + break; + + case 'w': + window = atoi(optarg); + break; + + default: + return 1; + } + } + + printf("starting in %s mode\n", visual ? "visual" : "line"); + printf("tag: %s\n", tag ? tag : "-"); + printf("command: %s\n", command ? command : "-"); + + return 0; +} @@ -0,0 +1,43 @@ +void ex_abbreviate(); +void ex_append(); +void ex_args(); +void ex_change(); +void ex_chdir(); +void ex_copy(); +void ex_copy(); +void ex_delete(); +void ex_edit(); +void ex_file(); +void ex_global(); +void ex_insert(); +void ex_join(); +void ex_list(); +void ex_map(); +void ex_mark(); +void ex_move(); +void ex_next(); +void ex_number(); +void ex_open(); +void ex_preserve(); +void ex_print(); +void ex_put(); +void ex_quit(); +void ex_read(); +void ex_recover(); +void ex_rewind(); +void ex_set(); +void ex_shell(); +void ex_source(); +void ex_substitute(); +void ex_ampersand(); +void ex_tilde(); +void ex_suspend(); +void ex_tag(); +void ex_unabbrev(); +void ex_undo(); +void ex_unmap(); +void ex_version(); +void ex_visual(); +void ex_write(); +void ex_wq(); +void ex_xit(); diff --git a/ex_abbreviate.c b/ex_abbreviate.c new file mode 100644 index 0000000..820113d --- /dev/null +++ b/ex_abbreviate.c @@ -0,0 +1,3 @@ +void ex_abbreviate() +{ +} diff --git a/ex_ampersand.c b/ex_ampersand.c new file mode 100644 index 0000000..25a7937 --- /dev/null +++ b/ex_ampersand.c @@ -0,0 +1,3 @@ +void ex_ampersand() +{ +} diff --git a/ex_append.c b/ex_append.c new file mode 100644 index 0000000..18aad48 --- /dev/null +++ b/ex_append.c @@ -0,0 +1,3 @@ +void ex_append() +{ +} diff --git a/ex_args.c b/ex_args.c new file mode 100644 index 0000000..1931429 --- /dev/null +++ b/ex_args.c @@ -0,0 +1,3 @@ +void ex_args() +{ +} diff --git a/ex_change.c b/ex_change.c new file mode 100644 index 0000000..44e752a --- /dev/null +++ b/ex_change.c @@ -0,0 +1,3 @@ +void ex_change() +{ +} diff --git a/ex_chdir.c b/ex_chdir.c new file mode 100644 index 0000000..5156a6b --- /dev/null +++ b/ex_chdir.c @@ -0,0 +1,3 @@ +void ex_chdir() +{ +} diff --git a/ex_command.c b/ex_command.c new file mode 100644 index 0000000..bb491a0 --- /dev/null +++ b/ex_command.c @@ -0,0 +1,54 @@ +#include "ex.h" + +static struct { + const char *sname; + const char *lname; + void (*fn)(); +} ex_commands[] = { + { "ab", "abbreviate", ex_abbreviate }, + { "a", "append", ex_append }, + { "ar", "args", ex_args }, + { "c", "change", ex_change }, + { "chd", "chdir", ex_chdir }, + { "co", "copy", ex_copy }, + { "t", "t", ex_copy }, + { "d", "delete", ex_delete }, + { "e", "edit", ex_edit }, + { "f", "file", ex_file }, + { "g", "global", ex_global }, + { "v", "v", ex_global }, + { "i", "insert", ex_insert }, + { "j", "join", ex_join }, + { "l", "list", ex_list }, + { "map", "map", ex_map }, + { "ma", "mark", ex_mark }, + { "k", "k", ex_mark }, + { "m", "move", ex_move }, + { "n", "next", ex_next }, + { "nu", "number", ex_number }, + { "#", "#", ex_number }, + { "o", "open", ex_open }, + { "pre", "preserve", ex_preserve }, + { "p", "print", ex_print }, + { "pu", "put", ex_put }, + { "q", "quit", ex_quit }, + { "r", "read", ex_read }, + { "rec", "recover", ex_recover }, + { "rew", "rewind", ex_rewind }, + { "se", "set", ex_set }, + { "sh", "shell", ex_shell }, + { "so", "source", ex_source }, + { "s", "substitute", ex_substitute }, + { "&", "&", ex_ampersand }, + { "~", "~", ex_tilde }, + { "su", "suspend", ex_suspend }, + { "ta", "tag", ex_tag }, + { "una", "unabbrev", ex_unabbrev }, + { "u", "undo", ex_undo }, + { "unm", "unmap", ex_unmap }, + { "ve", "version", ex_version }, + { "vi", "visual", ex_visual }, + { "w", "write", ex_write }, + { "wq", "wq", ex_wq }, + { "x", "xit", ex_xit }, +}; diff --git a/ex_copy.c b/ex_copy.c new file mode 100644 index 0000000..727271a --- /dev/null +++ b/ex_copy.c @@ -0,0 +1,3 @@ +void ex_copy() +{ +} diff --git a/ex_delete.c b/ex_delete.c new file mode 100644 index 0000000..7fdb85c --- /dev/null +++ b/ex_delete.c @@ -0,0 +1,3 @@ +void ex_delete() +{ +} diff --git a/ex_edit.c b/ex_edit.c new file mode 100644 index 0000000..b8639c4 --- /dev/null +++ b/ex_edit.c @@ -0,0 +1,3 @@ +void ex_edit() +{ +} diff --git a/ex_file.c b/ex_file.c new file mode 100644 index 0000000..3f99250 --- /dev/null +++ b/ex_file.c @@ -0,0 +1,3 @@ +void ex_file() +{ +} diff --git a/ex_global.c b/ex_global.c new file mode 100644 index 0000000..8fc1926 --- /dev/null +++ b/ex_global.c @@ -0,0 +1,3 @@ +void ex_global() +{ +} diff --git a/ex_insert.c b/ex_insert.c new file mode 100644 index 0000000..09527f7 --- /dev/null +++ b/ex_insert.c @@ -0,0 +1,3 @@ +void ex_insert() +{ +} diff --git a/ex_join.c b/ex_join.c new file mode 100644 index 0000000..32c8f20 --- /dev/null +++ b/ex_join.c @@ -0,0 +1,3 @@ +void ex_join() +{ +} diff --git a/ex_list.c b/ex_list.c new file mode 100644 index 0000000..c7d0889 --- /dev/null +++ b/ex_list.c @@ -0,0 +1,3 @@ +void ex_list() +{ +} diff --git a/ex_map.c b/ex_map.c new file mode 100644 index 0000000..3796dfe --- /dev/null +++ b/ex_map.c @@ -0,0 +1,3 @@ +void ex_map() +{ +} diff --git a/ex_mark.c b/ex_mark.c new file mode 100644 index 0000000..580af93 --- /dev/null +++ b/ex_mark.c @@ -0,0 +1,3 @@ +void ex_mark() +{ +} diff --git a/ex_move.c b/ex_move.c new file mode 100644 index 0000000..4893547 --- /dev/null +++ b/ex_move.c @@ -0,0 +1,3 @@ +void ex_move() +{ +} diff --git a/ex_next.c b/ex_next.c new file mode 100644 index 0000000..b6f5c84 --- /dev/null +++ b/ex_next.c @@ -0,0 +1,3 @@ +void ex_next() +{ +} diff --git a/ex_number.c b/ex_number.c new file mode 100644 index 0000000..22a0863 --- /dev/null +++ b/ex_number.c @@ -0,0 +1,3 @@ +void ex_number() +{ +} diff --git a/ex_open.c b/ex_open.c new file mode 100644 index 0000000..7e94dd4 --- /dev/null +++ b/ex_open.c @@ -0,0 +1,3 @@ +void ex_open() +{ +} diff --git a/ex_preserve.c b/ex_preserve.c new file mode 100644 index 0000000..ed94752 --- /dev/null +++ b/ex_preserve.c @@ -0,0 +1,3 @@ +void ex_preserve() +{ +} diff --git a/ex_print.c b/ex_print.c new file mode 100644 index 0000000..2106d05 --- /dev/null +++ b/ex_print.c @@ -0,0 +1,3 @@ +void ex_print() +{ +} diff --git a/ex_put.c b/ex_put.c new file mode 100644 index 0000000..e981d7e --- /dev/null +++ b/ex_put.c @@ -0,0 +1,3 @@ +void ex_put() +{ +} diff --git a/ex_quit.c b/ex_quit.c new file mode 100644 index 0000000..a59f245 --- /dev/null +++ b/ex_quit.c @@ -0,0 +1,3 @@ +void ex_quit() +{ +} diff --git a/ex_read.c b/ex_read.c new file mode 100644 index 0000000..80dbd33 --- /dev/null +++ b/ex_read.c @@ -0,0 +1,3 @@ +void ex_read() +{ +} diff --git a/ex_recover.c b/ex_recover.c new file mode 100644 index 0000000..7b22f3c --- /dev/null +++ b/ex_recover.c @@ -0,0 +1,3 @@ +void ex_recover() +{ +} diff --git a/ex_rewind.c b/ex_rewind.c new file mode 100644 index 0000000..3566675 --- /dev/null +++ b/ex_rewind.c @@ -0,0 +1,3 @@ +void ex_rewind() +{ +} diff --git a/ex_set.c b/ex_set.c new file mode 100644 index 0000000..2db2625 --- /dev/null +++ b/ex_set.c @@ -0,0 +1,3 @@ +void ex_set() +{ +} diff --git a/ex_shell.c b/ex_shell.c new file mode 100644 index 0000000..951fe35 --- /dev/null +++ b/ex_shell.c @@ -0,0 +1,3 @@ +void ex_shell() +{ +} diff --git a/ex_source.c b/ex_source.c new file mode 100644 index 0000000..5a5f52c --- /dev/null +++ b/ex_source.c @@ -0,0 +1,3 @@ +void ex_source() +{ +} diff --git a/ex_substitute.c b/ex_substitute.c new file mode 100644 index 0000000..1edbbbe --- /dev/null +++ b/ex_substitute.c @@ -0,0 +1,3 @@ +void ex_substitute() +{ +} diff --git a/ex_suspend.c b/ex_suspend.c new file mode 100644 index 0000000..7484317 --- /dev/null +++ b/ex_suspend.c @@ -0,0 +1,3 @@ +void ex_suspend() +{ +} diff --git a/ex_tag.c b/ex_tag.c new file mode 100644 index 0000000..fa79e2f --- /dev/null +++ b/ex_tag.c @@ -0,0 +1,3 @@ +void ex_tag() +{ +} diff --git a/ex_tilde.c b/ex_tilde.c new file mode 100644 index 0000000..bfacf5c --- /dev/null +++ b/ex_tilde.c @@ -0,0 +1,3 @@ +void ex_tilde() +{ +} diff --git a/ex_unabbrev.c b/ex_unabbrev.c new file mode 100644 index 0000000..950e805 --- /dev/null +++ b/ex_unabbrev.c @@ -0,0 +1,3 @@ +void ex_unabbrev() +{ +} diff --git a/ex_undo.c b/ex_undo.c new file mode 100644 index 0000000..fd8c6f4 --- /dev/null +++ b/ex_undo.c @@ -0,0 +1,3 @@ +void ex_undo() +{ +} diff --git a/ex_unmap.c b/ex_unmap.c new file mode 100644 index 0000000..37d43b9 --- /dev/null +++ b/ex_unmap.c @@ -0,0 +1,3 @@ +void ex_unmap() +{ +} diff --git a/ex_version.c b/ex_version.c new file mode 100644 index 0000000..bc14da2 --- /dev/null +++ b/ex_version.c @@ -0,0 +1,3 @@ +void ex_version() +{ +} diff --git a/ex_visual.c b/ex_visual.c new file mode 100644 index 0000000..a8267be --- /dev/null +++ b/ex_visual.c @@ -0,0 +1,3 @@ +void ex_visual() +{ +} @@ -0,0 +1,3 @@ +void ex_wq() +{ +} diff --git a/ex_write.c b/ex_write.c new file mode 100644 index 0000000..5c50990 --- /dev/null +++ b/ex_write.c @@ -0,0 +1,3 @@ +void ex_write() +{ +} diff --git a/ex_xit.c b/ex_xit.c new file mode 100644 index 0000000..4998132 --- /dev/null +++ b/ex_xit.c @@ -0,0 +1,3 @@ +void ex_xit() +{ +} diff --git a/vi_command.c b/vi_command.c new file mode 100644 index 0000000..9776aa1 --- /dev/null +++ b/vi_command.c @@ -0,0 +1,290 @@ +#include "vi.h" + +#define CTRL(x) (x - 'a' + 1) +#define ESCAPE '\033' + +int vi_command(char buffer, int count, int key) +{ + switch (key) { + case CTRL('b'): + return vi_page_backwards(count); + + case CTRL('d'): + return vi_scroll_forward(count); + + case CTRL('e'): + return vi_scroll_forward_by_line(count); + + case CTRL('f'): + return vi_page_forward(count); + + case CTRL('g'): + return vi_display_information(); + + case CTRL('h'): + case 'h': + /* case <erase>: */ + return vi_move_cursor_backwards(count); + + case '\n': + #if CTRL('j') != '\n' + case CTRL('j'): + #endif + #if CTRL('m') != '\r' + case CTRL('m'): + #endif + case CTRL('n'): + case 'j': + case '\r': + case '+': + return vi_move_down(count); + + case CTRL('l'): + return vi_clear_and_redisplay(); + + case CTRL('p'): + case 'k': + case '-': + return vi_move_up(count); + + case CTRL('r'): + return vi_redraw_screen(); + + case CTRL('u'): + return vi_scroll_backward(count); + + case CTRL('y'): + return vi_scroll_backward_by_line(count); + + case CTRL('^'): + return vi_edit_alternate_file(); + + case ESCAPE: + return vi_terminate_command_or_input_mode(); + + case CTRL(']'): + return vi_search_for_tagstring(); + + case ' ': + case 'l': + return vi_move_cursor_forward(count); + + case '!': + return vi_replace_text_with_results_from_shell_command(count); + + case '$': + return vi_move_cursor_to_end_of_line(count); + + case '%': + return vi_move_to_matching_character(); + + case '&': + return vi_repeat_substitution(); + + case '\'': + return vi_return_to_previous_context_at_beggining_of_line(); + + case '`': + return vi_return_to_previous_context(); + + /* + case '[[': + return vi_return_to_previous_section(count); + + case ']]': + return vi_move_to_next_section(count); + */ + + case '^': + return vi_move_to_first_non_blank_position_on_current_line(); + + case '_': + return vi_current_and_line_above(count); + + case '(': + return vi_move_back_to_beginning_of_sentence(count); + + case ')': + return vi_move_forward_to_begginning_of_sentence(count); + + case '{': + return vi_move_back_to_preceding_paragraph(count); + + case '}': + return vi_move_forward_to_next_paragraph(count); + + case '|': + return vi_move_to_specific_column_position(count); + + case ',': + return vi_reverse_find_character(count); + + case '.': + return vi_repeat(count); + + case '/': + return vi_find_regular_expression(); + + case '0': + return vi_move_to_first_character_in_line(); + + case ':': + return vi_execute_ex_command(); + + case ';': + return vi_repeat_find(count); + + case '<': + motion = vi_getmotion(); + return vi_shift_left(count); + + case '>': + motion = vi_getmotion(); + return vi_shift_right(count); + + case '?': + return vi_scan_backwards_for_regular_expression(); + + case '@': + return vi_execute(); /* buffer */ + + case '~': + return vi_reverse_case(count); + + case 'a': + return vi_append(count); + + case 'A': + return vi_append_at_end_of_line(count); + + case 'b': + return vi_move_backward_to_preceding_word(count); + + case 'B': + return vi_move_backward_to_preceding_bigword(count); + + case 'c': + motion = vi_getmotion(); + return vi_change(buffer, count, motion); + + case 'C': + return vi_change_to_end_of_line(buffer, count); + + case 'd': + motion = vi_getmotion(); + return vi_delete(buffer, count, motion); + + case 'D': + return vi_delete_to_end_of_line(buffer); + + case 'e': + return vi_move_to_end_of_word(count); + + case 'E': + return vi_move_to_end_of_bigword(count); + + case 'f': + return vi_find_character_in_current_line_forward(count); + + case 'F': + return vi_find_character_in_current_line_reverse(count); + + case 'G': + return vi_move_to_line(count); + + case 'H': + return vi_move_to_top_of_screen(count); + + case 'i': + return vi_insert_before_cursor(count); + + case 'I': + return vi_insert_at_beginning_of_line(count); + + case 'J': + return vi_join(count); + + case 'L': + return vi_move_to_bottom_of_screen(count); + + case 'm': + return vi_mark(); + + case 'M': + return vi_move_to_middle_of_screen(); + + case 'n': + return vi_repeat_regular_expression_find_forward(); + + case 'N': + return vi_repeat_regular_expression_find_reverse(); + + case 'o': + return vi_insert_empty_line_below(); + + case 'O': + return vi_insert_empty_line_above(); + + case 'p': + return vi_put_from_buffer_following(buffer); + + case 'P': + return vi_put_from_buffer_before(buffer); + + case 'Q': + return vi_enter_ex_mode(); + + case 'r': + return vi_replace_character(count); + + case 'R': + return vi_replace_characters(); + + case 's': + return vi_substitute_character(buffer, count); + + case 'S': + return vi_substitute_lines(buffer, count); + + case 't': + return vi_move_cursor_to_before_character_forward(count); + + case 'T': + return vi_move_cursor_to_after_character_reverse(count); + + case 'u': + return vi_undo(); + + case 'U': + return vi_undo_current_line(); + + case 'w': + return vi_move_to_beginning_of_word(count); + + case 'W': + return vi_move_to_beginning_of_bigword(count); + + case 'x': + return vi_delete_character_at_cursor(buffer, count); + + case 'X': + return vi_delete_character_before_cursor(buffer, count); + + case 'y': + motion = vi_getmotion(); + return vi_yank(buffer, count, motion); + + case 'Y': + return vi_yank_current_line(buffer, count); + + case 'z': + return vi_redraw_window(count); + + /* + case 'ZZ': + return vi_exit(); + */ + } + + return 0; +} |