sandy

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

commit b12cddd79814e62f7706dd36a32a656330b6c631
parent fb1d8910f60af9f3a010a4bd6566a3b6f8a73a4a
Author: Dimitris Zervas <dzervas@dzervas.gr>
Date:   Wed,  9 Jul 2014 14:31:24 +0300

Added vim keybindings

Diffstat:
TODO | 1+
config.h | 37++++++++++++++++++++++---------------
sandy.c | 20+++++++++++++-------
3 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/TODO b/TODO @@ -9,6 +9,7 @@ In no particular order, at sandy.c: - Improve regex search (backwards!!) - Improve syntax highlight, multiline? - Group delete undos? +- Show line numbers At config.def.h: - Bindings! diff --git a/config.h b/config.h @@ -73,7 +73,8 @@ static void f_pipenull(const Arg*); static const Key curskeys[] = { /* Plain keys here, no CONTROL or META */ /* keyv.i, tests, func, arg */ -{ .keyv.i = KEY_BACKSPACE, { t_rw, 0, 0, 0 }, f_delete, { .m = m_prevchar } }, +{ .keyv.i = KEY_BACKSPACE, { t_rw, t_nocomm,0,0 }, f_delete, { .m = m_prevchar } }, +{ .keyv.i = KEY_BACKSPACE, { 0, 0, 0, 0 }, f_moveboth, { .m = m_prevchar } }, { .keyv.i = KEY_DC, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, { .keyv.i = KEY_DC, { t_rw, 0, 0, 0 }, f_delete, { .m = m_nextchar } }, { .keyv.i = KEY_SDC, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, @@ -118,8 +119,8 @@ static const Key stdkeys[] = { { .keyv.c = CONTROL('H'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_prevchar } }, { .keyv.c = CONTROL('I'), { t_rw, 0, 0, 0 }, f_insert, { .v = "\t" } }, { .keyv.c = CONTROL('J'), { t_rw, t_ai, 0, 0 }, f_pipeai, AUTOINDENT } , -{ .keyv.c = CONTROL('J'), { t_rw, 0, 0, 0 }, f_insert, { .v = "\n" } }, -{ .keyv.c = CONTROL('J'), { 0, 0, 0, 0 }, f_move, { .m = m_nextline } }, +{ .keyv.c = CONTROL('J'), { t_rw, t_nocomm,0,0 }, f_insert, { .v = "\n" } }, +{ .keyv.c = CONTROL('J'), { 0, 0, 0, 0 }, f_moveboth, { .m = m_nextline } }, { .keyv.c = CONTROL('K'), { t_eol, t_rw, 0, 0 }, f_delete, { .m = m_nextchar } }, { .keyv.c = CONTROL('K'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_eol } }, { .keyv.c = CONTROL('L'), { 0, 0, 0, 0 }, f_center, { 0 } }, @@ -131,11 +132,11 @@ static const Key stdkeys[] = { { .keyv.c = CONTROL('O'), { t_sel, 0, 0, 0 }, f_select, { .m = m_tosel } }, /* Swap fsel and fcur */ { .keyv.c = CONTROL('P'), { 0, 0, 0, 0 }, f_move, { .m = m_prevline } }, { .keyv.c = CONTROL('Q'), { t_rw, 0, 0, 0 }, f_toggle, { .i = S_InsEsc } }, -{ .keyv.c = CONTROL('R'), { t_sel, 0, 0, 0 }, f_findbw, { 0 } }, -{ .keyv.c = CONTROL('R'), { 0, 0, 0, 0 }, f_spawn, FINDBW }, +//{ .keyv.c = CONTROL('R'), { t_sel, 0, 0, 0 }, f_findbw, { 0 } }, +//{ .keyv.c = CONTROL('R'), { 0, 0, 0, 0 }, f_spawn, FINDBW }, +{ .keyv.c = CONTROL('R'), { t_redo,t_rw, 0, 0 }, f_undo, { .i = -1 } }, { .keyv.c = META('r'), { 0, 0, 0, 0 }, f_findbw, { 0 } }, { .keyv.c = CONTROL('S'), { t_sel, 0, 0, 0 }, f_findfw, { 0 } }, -{ .keyv.c = CONTROL('S'), { 0, 0, 0, 0 }, f_spawn, FIND }, { .keyv.c = META('s'), { 0, 0, 0, 0 }, f_findfw, { 0 } }, { .keyv.c = CONTROL('T'), { 0, 0, 0, 0 }, f_pipero , TOCLIP }, { .keyv.c = CONTROL('U'), { t_bol, t_rw, 0, 0 }, f_delete, { .m = m_prevchar } }, @@ -144,9 +145,6 @@ static const Key stdkeys[] = { { .keyv.c = CONTROL('V'), { 0, 0, 0, 0 }, f_move, { .m = m_prevscr } }, { .keyv.c = META('v'), { 0, 0, 0, 0 }, f_move, { .m = m_nextscr } }, { .keyv.c = CONTROL('W'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_prevword } }, -{ .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('Z'), { 0 ,0, 0, 0 }, f_suspend, { 0 } }, #if VIM_BINDINGS @@ -155,11 +153,8 @@ static const Key stdkeys[] = { { .keyv.c = CONTROL('\\'),{ t_rw, 0, 0, 0 }, f_spawn, PIPE }, { .keyv.c = META('\\'), { t_rw, 0, 0, 0 }, f_spawn, SED }, { .keyv.c = CONTROL(']'), { 0, 0, 0, 0 }, f_extsel, { .i = ExtDefault } }, -{ .keyv.c = CONTROL('^'), { t_redo,t_rw, 0, 0 }, f_undo, { .i = -1 } }, -{ .keyv.c = CONTROL('^'), { t_rw, 0, 0, 0 }, f_repeat, { 0 } }, { .keyv.c = META('6'), { t_rw, 0, 0, 0 }, f_pipeline, { .v = "tr '\n' ' '" } }, /* Join lines */ { .keyv.c = META('5'), { t_sel, t_rw, 0, 0 }, f_spawn, REPLACE }, -{ .keyv.c = CONTROL('_'), { t_undo,t_rw, 0, 0 }, f_undo, { .i = 1 } }, { .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 } }, @@ -168,8 +163,21 @@ static const Key stdkeys[] = { #if VIM_BINDINGS 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 }, +{ .keyv.c = { 'b' }, { 0, 0, 0, 0 }, f_moveboth, { .m = m_prevword } }, +{ .keyv.c = { 'i' }, { 0, 0, 0, 0 }, f_toggle, { .i = S_Command } }, +{ .keyv.c = { 'n' }, { t_sel, 0, 0, 0 }, f_findfw, { 0 } }, +{ .keyv.c = { 'N' }, { t_sel, 0, 0, 0 }, f_findbw, { 0 } }, +// TODO: Find a non-complex way to insert line above and beneath +{ .keyv.c = { 'o' }, { t_rw, 0, 0, 0 }, f_insert, { .v = "\n" } }, +{ .keyv.c = { 'O' }, { t_rw, 0, 0, 0 }, f_insert, { .v = "\n" } }, +{ .keyv.c = { 'u' }, { t_undo,t_rw, 0, 0 }, f_undo, { .i = 1 } }, +{ .keyv.c = { 'w' }, { 0, 0, 0, 0 }, f_moveboth, { .m = m_nextword } }, +{ .keyv.c = { 'x' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, +{ .keyv.c = { 'x' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_nextchar } }, +{ .keyv.c = { ':' }, { 0, 0, 0, 0 }, f_spawn, CMD_P }, +{ .keyv.c = { '/' }, { 0, 0, 0, 0 }, f_spawn, FIND }, +{ .keyv.c = { '.' }, { t_rw, 0, 0, 0 }, f_repeat, { 0 } }, +{ .keyv.c = { ' ' }, { 0, 0, 0, 0 }, f_moveboth, { .m = m_nextchar } }, }; #endif @@ -373,4 +381,3 @@ f_pipenull(const Arg *arg) { fsel=fcur; f_pipe(arg); } - diff --git a/sandy.c b/sandy.c @@ -818,13 +818,10 @@ i_edit(void) { continue; } statusflags&=~(S_InsEsc); + #if VIM_BINDINGS if(t_rw() && t_nocomm()) f_insert(&(const Arg){ .v = c }); -#else - if(t_rw()) f_insert(&(const Arg){ .v = c }); -#endif - else if(!t_rw()) tmptitle="WARNING! File is read-only!!!"; - else { + else if(statusflags & S_Command) { 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); @@ -833,6 +830,11 @@ i_edit(void) { } } } +#else + if(t_rw()) f_insert(&(const Arg){ .v = c }); +#endif + else tmptitle="WARNING! File is read-only!!!"; + } } @@ -1685,6 +1687,7 @@ m_tosel(Filepos pos) { /* T_* FUNCTIONS Used to test for conditions, take no arguments and return bool. */ + bool /* TRUE is autoindent is on */ t_ai(void) { return (statusflags & S_AutoIndent); @@ -1705,12 +1708,14 @@ t_mod(void) { return (statusflags & S_Modified); } -#if VIM_BINDINGS bool /* TRUE if we are not in command mode */ t_nocomm(void) { +#if VIM_BINDINGS return !(statusflags & S_Command); -} +#else + return TRUE; #endif +} bool /* TRUE if the file is writable */ t_rw(void) { @@ -1746,6 +1751,7 @@ main(int argc, char **argv){ /* Use system locale, hopefully UTF-8 */ setlocale(LC_ALL,""); statusflags|=S_Command; + ESCDELAY=0; // FIXME: Change this to something else to support num keys? for(i = 1; i < argc && argv[i][0] == '-' && argv[i][1] != '\0'; i++) { if(!strcmp(argv[i], "-r")) {