sandy

text editor
git clone git://git.suckless.org/sandy
Log | Files | Refs | README | LICENSE

commit f845b454953b431b3e01f024be6d8f12e5799995
parent 21a5cf59f37671c65c75211db93979bb609290da
Author: Dimitris Zervas <dzervas@dzervas.gr>
Date:   Tue, 15 Jul 2014 16:17:27 +0300

Added support for verb arguments on verb definition

Diffstat:
TODO | 1+
config.def.h | 6++++--
config.h | 10++++------
sandy.c | 21++++++++++++++-------
4 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/TODO b/TODO @@ -14,6 +14,7 @@ In no particular order, at sandy.c: - Support multiple marks (with S_Parameter) - Instead of delete, just cut - Add folding support +- Add better paste support (if whole line was cut, append it beneath) At config.def.h: - Use local/system script path and all diff --git a/config.def.h b/config.def.h @@ -182,16 +182,18 @@ static const Key commkeys[] = { /* Command mode keys here */ { .keyv.c = { '^' }, { 0, 0, 0, 0 }, f_move, { .m = m_bol } }, { .keyv.c = { 'A' }, { 0, 0, 0, 0 }, f_move, { .m = m_eol } }, { .keyv.c = { 'A' }, { 0, 0, 0, 0 }, f_toggle, { .i = S_Command } }, +{ .keyv.c = { 'a' }, { t_eol, 0, 0, 0 }, f_toggle, { .i = S_Command } }, { .keyv.c = { 'a' }, { 0, 0, 0, 0 }, f_move, { .m = m_nextchar } }, { .keyv.c = { 'a' }, { 0, 0, 0, 0 }, f_toggle, { .i = S_Command } }, { .keyv.c = { 'b' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_prevword } }, { .keyv.c = { 'b' }, { 0, 0, 0, 0 }, f_move, { .m = m_prevword } }, { .keyv.c = { 'c' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, -{ .keyv.c = { 'c' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, /* TODO: queue insert mode, similar to 'y' */ +{ .keyv.c = { 'c' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, /* TODO: queue insert mode, similar to 'y' */ { .keyv.c = { 'C' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_eol } }, { .keyv.c = { 'C' }, { t_rw, 0, 0, 0 }, f_toggle, { .i = S_Command } }, { .keyv.c = { 'd' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, -{ .keyv.c = { 'd' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, +{ .keyv.c = { 'd' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, +//{ .keyv.c = { 'd' }, { t_rw, 0, 0, 0 }, f_pipe, { .m = m_sentence, .v = TOCLIP } }, { .keyv.c = { 'D' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_eol } }, { .keyv.c = { 'g' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_bof } }, { .keyv.c = { 'g' }, { 0, 0, 0, 0 }, f_move, { .m = m_bof } }, diff --git a/config.h b/config.h @@ -160,9 +160,6 @@ static const Key stdkeys[] = { }; #if VIM_BINDINGS -/* In order for a key to execute more than 1 function, add consecutive definitions of the key - with the exact same tests */ - // TODO: add better paste support (if whole line was yanked, append above, not where you are) static const Key commkeys[] = { /* Command mode keys here */ /* keyv.c, tests, func, arg */ @@ -178,11 +175,12 @@ static const Key commkeys[] = { /* Command mode keys here */ { .keyv.c = { 'b' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_prevword } }, { .keyv.c = { 'b' }, { 0, 0, 0, 0 }, f_move, { .m = m_prevword } }, { .keyv.c = { 'c' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, -{ .keyv.c = { 'c' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, /* TODO: queue insert mode, similar to 'y' */ +{ .keyv.c = { 'c' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, /* TODO: queue insert mode, similar to 'y' */ { .keyv.c = { 'C' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_eol } }, { .keyv.c = { 'C' }, { t_rw, 0, 0, 0 }, f_toggle, { .i = S_Command } }, { .keyv.c = { 'd' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, -{ .keyv.c = { 'd' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, +{ .keyv.c = { 'd' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_sentence } }, +//{ .keyv.c = { 'd' }, { t_rw, 0, 0, 0 }, f_pipe, { .m = m_sentence, .v = TOCLIP } }, { .keyv.c = { 'D' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_eol } }, { .keyv.c = { 'g' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_bof } }, { .keyv.c = { 'g' }, { 0, 0, 0, 0 }, f_move, { .m = m_bof } }, @@ -285,7 +283,7 @@ static const Command cmds[] = { /* REMEMBER: if(arg == 0) arg.v=regex_match */ static const Syntax syntaxes[] = { #if HILIGHT_SYNTAX -{"c", "\\.(c(pp|xx)?|h(pp|xx)?|cc)$", { +{"c", "\\.([ch](pp|xx)?|cc)$", { /* HiRed */ "$^", /* HiGreen */ B"(for|if|while|do|else|case|default|switch|try|throw|catch|operator|new|delete)"B, /* LoGreen */ B"(float|double|bool|char|int|short|long|sizeof|enum|void|static|const|struct|union|typedef|extern|(un)?signed|inline|((s?size)|((u_?)?int(8|16|32|64|ptr)))_t|class|namespace|template|public|protected|private|typename|this|friend|virtual|using|mutable|volatile|register|explicit)"B, diff --git a/sandy.c b/sandy.c @@ -190,6 +190,7 @@ static int lastaction=LastNone; /* The last action we took ( static int cols, lines; /* Ncurses: to use instead of COLS and LINES, wise */ static mmask_t defmmask = 0; /* Ncurses: mouse event mask */ static void (*verb)(const Arg *arg); /* Verb of current sentence */ +static Arg varg; /* Arguments of the verb (some will be overwritten by adjective) */ static int multiply = 1; /* Times to replay a command */ /* Functions */ @@ -299,7 +300,12 @@ static regex_t *syntax_res[LENGTH(syntaxes)][SYN_COLORS]; void f_adjective(const Arg *arg) { statusflags&=~S_Sentence; - verb(arg); + + if(arg->m) varg.m=arg->m; + if(arg->i) varg.i=arg->i; + if(arg->v) varg.v=arg->v; + + i_multiply(verb, varg); } #endif /* VIM_BINDINGS */ @@ -599,7 +605,7 @@ void /* Add new undo information to the undo ring */ i_addundo(bool ins, Filepos start, Filepos end, char *s) { Undo *u; - if(strlen(s) == 0) return; + //if(strlen(s) == 0) return; if(statusflags & S_GroupUndo) { end.l = i_lineat((undos->endl - undos->startl) + i_lineno(end.l)); i_addtoundo(end, s); @@ -780,13 +786,16 @@ i_dotests(bool (*const a[])(void)) { bool i_dokeys(const Key bindings[], int index, bool multi) { - int i; + int i=-1; if(bindings[index].func != f_insert) statusflags&=~(S_GroupUndo); /* Handle sentences */ if(t_sent()) { - if(bindings[index].func == verb) i_multiply(verb, (const Arg){ .m = m_nextline }); + if(bindings[index].func == verb) { + varg.m = m_nextline; + i_multiply(verb, varg); + } if(bindings[index].func != f_adjective) { statusflags&=~S_Sentence; @@ -795,6 +804,7 @@ i_dokeys(const Key bindings[], int index, bool multi) { } else if(bindings[index].arg.m == m_sentence) { statusflags|=(long)S_Sentence; verb=bindings[index].func; + varg=bindings[index].arg; return FALSE; } @@ -813,8 +823,6 @@ i_dokeys(const Key bindings[], int index, bool multi) { /* Handle multi-function commands */ if(multi) { - i=-1; - while(1) if(bindings[index].test[++i]) { if(bindings[index].test[i] != bindings[index+1].test[i]) { @@ -1055,7 +1063,6 @@ i_mouse(void) { } #endif /* HANDLE_MOUSE */ -// FIXME: Some weird thing can be executed (example: 5a or 0a which does nothing) void /* Handle multiplication */ i_multiply(void (*func)(const Arg *arg), const Arg arg) { int i;