sandy

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

commit a9d876ca6180454418dc257ff8e1a3556345a812
parent 60777b454326ce3790fcaf530fe3fd73469b5605
Author: Dimitris Zervas <dzervas@dzervas.gr>
Date:   Wed,  9 Jul 2014 03:01:06 +0300

Added vim-like command mode

Diffstat:
config.h | 10+++++++++-
sandy.c | 35++++++++++++++++++++++++++++++++---
2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/config.h b/config.h @@ -92,6 +92,7 @@ static const Key curskeys[] = { /* Plain keys here, no CONTROL or META */ { .keyv.i = KEY_RIGHT, { 0, 0, 0, 0 }, f_moveboth, { .m = m_nextchar } }, { .keyv.i = KEY_SLEFT, { 0, 0, 0, 0 }, f_moveboth, { .m = m_prevword } }, { .keyv.i = KEY_SRIGHT, { 0, 0, 0, 0 }, f_moveboth, { .m = m_nextword } }, +//{ .keyv.i = KEY_ESC, { t_nocomm,0, 0, 0 }, f_toggle, { .i = S_Command } }, }; static const Key stdkeys[] = { @@ -146,7 +147,7 @@ static const Key stdkeys[] = { { .keyv.c = CONTROL('X'), { t_mod, t_rw, 0, 0 }, f_save, { 0 } }, { .keyv.c = CONTROL('X'), { 0, 0, 0, 0 }, f_toggle, { .i = S_Running } }, { .keyv.c = META('x'), { 0, 0, 0, 0 }, f_spawn, CMD_P }, -{ .keyv.c = CONTROL('Y'), { t_rw, 0, 0, 0 }, f_pipenull, FROMCLIP }, +//{ .keyv.c = CONTROL('Y'), { t_rw, 0, 0, 0 }, f_pipenull, FROMCLIP }, { .keyv.c = CONTROL('Z'), { 0 ,0, 0, 0 }, f_suspend, { 0 } }, { .keyv.c = CONTROL('['), { 0, 0, 0, 0 }, f_spawn, CMD_P }, { .keyv.c = CONTROL('\\'),{ t_rw, 0, 0, 0 }, f_spawn, PIPE }, @@ -160,6 +161,13 @@ static const Key stdkeys[] = { { .keyv.c = CONTROL('?'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_prevchar } }, { .keyv.c = META(','), { 0, 0, 0, 0 }, f_move, { .m = m_bof } }, { .keyv.c = META('.'), { 0, 0, 0, 0 }, f_move, { .m = m_eof } }, +{ .keyv.c = CONTROL('Y'), { t_nocomm,0, 0, 0 }, f_toggle, { .i = S_Command } }, +}; + +static const Key commkeys[] = { /* Command mode keys here */ +/* keyv.c, tests, func, arg */ +{ .keyv.c = { 'i' }, { 0, 0, 0, 0 }, f_toggle, { .i = S_Command } }, +{ .keyv.c = { ':' }, { 0, 0, 0, 0 }, f_spawn, CMD_P }, }; #if HANDLE_MOUSE diff --git a/sandy.c b/sandy.c @@ -137,6 +137,9 @@ enum { /* To use in statusflags */ S_GroupUndo = 1<<9, /* Last action was an insert, so another insert should group with it, set automatically */ S_AutoIndent = 1<<10, /* Perform autoindenting on RET */ S_DumpStdout = 1<<11, /* Dump to stdout instead of writing to a file */ +//#if COMMAND_MODE + S_Command = 1<<12, /* Command mode */ +//#endif }; enum { /* To use in Undo.flags */ @@ -243,8 +246,10 @@ static bool i_writefile(char*); /* t_* functions to know whether to process an action or keybinding */ static bool t_ai(void); static bool t_bol(void); +//static bool t_comm(void); static bool t_eol(void); static bool t_mod(void); +static bool t_nocomm(void); static bool t_rw(void); static bool t_redo(void); static bool t_sel(void); @@ -816,8 +821,21 @@ i_edit(void) { continue; } statusflags&=~(S_InsEsc); +//#if COMMAND_MODE + if(t_rw() && t_nocomm()) f_insert(&(const Arg){ .v = c }); +/*#else if(t_rw()) f_insert(&(const Arg){ .v = c }); - else tmptitle="WARNING! File is read-only!!!"; +#endif*/ + else if(!t_rw()) tmptitle="WARNING! File is read-only!!!"; + else { + for(i=0; i<LENGTH(commkeys); i++) { + if(memcmp(c, commkeys[i].keyv.c, sizeof commkeys[i].keyv.c) == 0 && i_dotests(commkeys[i].test) ) { + if(commkeys[i].func != f_insert) statusflags&=~(S_GroupUndo); + commkeys[i].func(&(commkeys[i].arg)); + break; + } + } + } } } @@ -1438,7 +1456,8 @@ i_update(void) { else { statusflags&=~S_Warned; /* Reset warning */ snprintf(buf, 4, "%ld%%", (100*ncur)/nlst); - snprintf(title, BUFSIZ, "%s [%s]%s%s%s%s %ld,%d %s", + snprintf(title, BUFSIZ, "%s %s [%s]%s%s%s%s %ld,%d %s", + (t_nocomm()?"Insert":"Command"), (statusflags&S_DumpStdout?"<Stdout>":(filename == NULL?"<No file>":filename)), (syntx>=0 ? syntaxes[syntx].name : "none"), (t_mod()?"[+]":""), @@ -1675,6 +1694,11 @@ t_bol(void) { return (fcur.o == 0); } +//bool /* TRUE if we are in command mode */ +//t_comm(void) { +// return (statusflags & S_Command); +//} + bool /* TRUE at end of line */ t_eol(void) { return (fcur.o == fcur.l->len); @@ -1685,6 +1709,11 @@ t_mod(void) { return (statusflags & S_Modified); } +bool /* TRUE if we are not in command mode FIXME: Find a way to use t_comm */ +t_nocomm(void) { + return !(statusflags & S_Command); +} + bool /* TRUE if the file is writable */ t_rw(void) { return !(statusflags & S_Readonly); @@ -1742,7 +1771,7 @@ main(int argc, char **argv){ i++; break; } else if(!strcmp(argv[i], "-v")) - i_die("sandy-"VERSION", © 2011 sandy engineers, see LICENSE for details\n"); + i_die("sandy-"VERSION", © 2014 sandy engineers, see LICENSE for details\n"); else i_usage(); }