sandy

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

commit 04b1b9fdbaa90e45dfa2ee2dfbbc8b8ba1860ab3
parent 05882e5c2e043923bb056c3958ba1c4ee6bdcfb0
Author: Dimitris Zervas <dzervas@dzervas.gr>
Date:   Sat, 19 Jul 2014 11:28:40 +0300

Linked config.h to config.def.h (for debugging)

Diffstat:
config.def.h | 4++--
config.h | 444-------------------------------------------------------------------------------
config.h | 2++
3 files changed, 4 insertions(+), 446 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -187,8 +187,8 @@ static const Key commkeys[] = { /* Command mode keys here */ { .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 } }, +{ .keyv.c = { 'c' }, { t_rw, 0, 0, 0 }, f_toggle, { .i = S_Command } }, { .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 } }, diff --git a/config.h b/config.h @@ -1,444 +0,0 @@ -/* A simplified way to customize */ -#define USE_TERM_STATUS 1 -#define BOTTOM_TITLE 0 -#define HILIGHT_CURRENT 1 -#define HILIGHT_SYNTAX 1 -#define SHOW_NONPRINT 0 -#define HANDLE_MOUSE 1 -#define VIM_BINDINGS 1 - -/* Things unlikely to be changed, yet still in the config.h file */ -static const bool isutf8 = TRUE; -static const char fifobase[] = "/tmp/sandyfifo."; -static int tabstop = 8; /* Not const, as it may be changed via param */ -/* static const char systempath[] = "/etc/sandy"; */ -/* static const char userpath[] = ".sandy"; */ /* Relative to $HOME */ - -#if SHOW_NONPRINT /* TODO: show newline character too (as $) */ -static const char tabstr[3] = { (char)0xC2, (char)0xBB, 0x00 }; /* Double right arrow */ -static const char spcstr[3] = { (char)0xC2, (char)0xB7, 0x00 }; /* Middle dot */ -static const char nlstr[2] = { '$', 0x00 }; /* '$' is tradition for EOL */ -#else -static const char tabstr[2] = { ' ', 0 }; -static const char spcstr[2] = { ' ', 0 }; -static const char nlstr[1] = { 0 }; -#endif - -/* Helper config functions, not used in main code */ -static void f_pipeai(const Arg*); -static void f_pipeline(const Arg*); -static void f_pipenull(const Arg*); - -/* Args to f_spawn */ -#define PROMPT(prompt, default, cmd) { .v = (const char *[]){ "/bin/sh", "-c", \ - "dmenu -v >/dev/null 2>&1 || DISPLAY=\"\";"\ - "if [ -n \"$DISPLAY\" ]; then arg=\"`echo \\\"" default "\\\" | dmenu $DMENU_OPTS -p '" prompt "'`\";" \ - "else if slmenu -v >/dev/null 2>&1; then arg=\"`echo \\\"" default "\\\" | slmenu -t -p '" prompt "'`\";" \ - "else printf \"\033[0;0H\033[7m"prompt"\033[K\033[0m \" >&2; read arg; fi; fi &&" \ - "echo " cmd "\"$arg\" > ${SANDY_FIFO}", NULL } } - -#define FIND PROMPT("Find:", "${SANDY_FIND}", "/") -#define FINDBW PROMPT("Find (back):", "${SANDY_FIND}", "?") -#define PIPE PROMPT("Pipe:", "${SANDY_PIPE}", "!") -#define SAVEAS PROMPT("Save as:", "${SANDY_FILE}", "w") -#define REPLACE PROMPT("Replace:", "", "!echo -n ") -#define SED PROMPT("Sed:", "", "!sed ") -#define CMD_P PROMPT("Command:", "/\n?\nw\nq\n!\nsyntax\noffset\nicase\nro\nai\ndump", "") - -/* Args to f_pipe and friends, simple examples are inlined instead */ -#define TOCLIP "tee /tmp/.sandy.clipboard.$USER | xsel -ib 2>/dev/null" -#define FROMCLIP "xsel -ob 2>/dev/null || cat /tmp/.sandy.clipboard.$USER" -#define TOSEL "tee /tmp/.sandy.selection.$USER | xsel -i 2>/dev/null" -#define FROMSEL "xsel -o 2>/dev/null || cat /tmp/.sandy.selection.$USER" -#define AUTOINDENT "awk 'BEGIN{ l=\"\\n\" }; \ - { if(match($0, \"^[\t ]+[^\t ]\")) l=substr($0, RSTART, RLENGTH-1); \ - else l=\"\"; \ - if(FNR==NR && $0 ~ /^[\t ]+$/) print \"\"; \ - else print }; \ - END{ ORS=\"\"; print l }' 2>/dev/null" -#define CAPITALIZE "awk 'BEGIN{ ORS=\"\" }; \ - { for ( i=1; i <= NF; i++) { $i=tolower($i) ; sub(\".\", substr(toupper($i),1,1) , $i) } \ - if(FNR==NF) print $0; \ - else print $0\"\\n\" }' 2>/dev/null" - -/* Hooks are launched from the main code */ -#define HOOK_SAVE_NO_FILE f_spawn (&(const Arg)SAVEAS) -#undef HOOK_DELETE_ALL /* This affects every delete */ -#undef HOOK_SELECT_ALL /* This affects every selection */ - -/* Key-bindings and stuff */ -/* WARNING: use CONTROL(ch) ONLY with '@', (caps)A-Z, '[', '\', ']', '^', '_' or '?' */ -/* otherwise it may not mean what you think. See man 7 ascii for more info */ -#define CONTROL(ch) {(ch ^ 0x40)} -#define META(ch) { 0x1B, ch } - -static const Key curskeys[] = { /* Plain keys here, no CONTROL or META */ -/* keyv.i, tests, func, arg */ -{ .keyv.i = KEY_BACKSPACE, { t_rw, t_ins,0, 0 }, f_delete, { .m = m_prevchar } }, -{ .keyv.i = KEY_BACKSPACE, { 0, 0, 0, 0 }, f_move, { .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 } }, -{ .keyv.i = KEY_SDC, { t_rw, 0, 0, 0 }, f_delete, { .m = m_nextchar } }, -{ .keyv.i = KEY_IC, { t_sel, 0, 0, 0 }, f_pipero, { .v = TOCLIP } }, -{ .keyv.i = KEY_SIC, { t_rw, 0, 0, 0 }, f_pipenull, { .v = FROMCLIP } }, -{ .keyv.i = KEY_HOME, { t_ai, 0, 0, 0 }, f_move, { .m = m_smartbol } }, -{ .keyv.i = KEY_HOME, { 0, 0, 0, 0 }, f_move, { .m = m_bol } }, -{ .keyv.i = KEY_END, { 0, 0, 0, 0 }, f_move, { .m = m_eol } }, -{ .keyv.i = KEY_SHOME, { 0, 0, 0, 0 }, f_move, { .m = m_bof } }, -{ .keyv.i = KEY_SEND, { 0, 0, 0, 0 }, f_move, { .m = m_eof } }, -{ .keyv.i = KEY_PPAGE, { 0, 0, 0, 0 }, f_move, { .m = m_prevscr } }, -{ .keyv.i = KEY_NPAGE, { 0, 0, 0, 0 }, f_move, { .m = m_nextscr } }, -{ .keyv.i = KEY_UP, { t_sent,0, 0, 0 }, f_adjective, { .m = m_prevline } }, -{ .keyv.i = KEY_UP, { 0, 0, 0, 0 }, f_move, { .m = m_prevline } }, -{ .keyv.i = KEY_DOWN, { t_sent,0, 0, 0 }, f_adjective, { .m = m_nextline } }, -{ .keyv.i = KEY_DOWN, { 0, 0, 0, 0 }, f_move, { .m = m_nextline } }, -{ .keyv.i = KEY_LEFT, { t_sent,0, 0, 0 }, f_adjective, { .m = m_prevchar } }, -{ .keyv.i = KEY_LEFT, { 0, 0, 0, 0 }, f_move, { .m = m_prevchar } }, -{ .keyv.i = KEY_RIGHT, { t_sent,0, 0, 0 }, f_adjective, { .m = m_nextchar } }, -{ .keyv.i = KEY_RIGHT, { 0, 0, 0, 0 }, f_move, { .m = m_nextchar } }, -{ .keyv.i = KEY_SLEFT, { 0, 0, 0, 0 }, f_move, { .m = m_prevword } }, -{ .keyv.i = KEY_SRIGHT, { 0, 0, 0, 0 }, f_move, { .m = m_nextword } }, -}; - -static const Key stdkeys[] = { -/* keyv.c, test, func, arg */ -{ .keyv.c = CONTROL('C'), { t_warn,t_mod,0, 0 }, f_toggle, { .i = S_Running } }, -{ .keyv.c = CONTROL('C'), { t_mod, 0, 0, 0 }, f_toggle, { .i = S_Warned } }, -{ .keyv.c = CONTROL('C'), { 0, 0, 0, 0 }, f_toggle, { .i = S_Running } }, -{ .keyv.c = META('c'), { t_sel, t_rw, 0, 0 }, f_pipe, { .v = CAPITALIZE } }, -{ .keyv.c = CONTROL('D'), { t_sel, t_rw, 0, 0 }, f_pipe, { .v = TOCLIP } }, -{ .keyv.c = CONTROL('D'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_nextchar } }, -{ .keyv.c = META('d'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_nextword } }, -{ .keyv.c = CONTROL('E'), { 0, 0, 0, 0 }, f_move, { .m = m_eol } }, -{ .keyv.c = CONTROL('F'), { 0, 0, 0, 0 }, f_move, { .m = m_nextchar } }, -{ .keyv.c = META('f'), { 0, 0, 0, 0 }, f_move, { .m = m_nextword } }, -{ .keyv.c = CONTROL('G'), { t_sel, 0, 0, 0 }, f_select, { .m = m_stay } }, -{ .keyv.c = CONTROL('H'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_prevchar } }, -{ .keyv.c = CONTROL('I'), { t_rw, t_ins,0, 0 }, f_insert, { .v = "\t" } }, -{ .keyv.c = CONTROL('J'), { t_rw, t_ai, 0, 0 }, f_pipeai, { .v = AUTOINDENT } }, -{ .keyv.c = CONTROL('J'), { t_rw, t_ins,0, 0 }, f_insert, { .v = "\n" } }, -{ .keyv.c = CONTROL('J'), { 0, 0, 0, 0 }, f_move, { .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 } }, -{ .keyv.c = META('l'), { t_sel, t_rw, 0, 0 }, f_pipe, { .v = "tr [A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ] [a-zàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]" } }, /* Lowercase */ -{ .keyv.c = CONTROL('M'), { t_rw, t_ai, 0, 0 }, f_pipeai, { .v = AUTOINDENT } } , -{ .keyv.c = CONTROL('M'), { t_rw, t_ins,0, 0 }, f_insert, { .v = "\n" } }, -{ .keyv.c = CONTROL('M'), { 0, 0, 0, 0 }, f_move, { .m = m_nextline } }, -{ .keyv.c = CONTROL('N'), { 0, 0, 0, 0 }, f_move, { .m = m_nextline } }, -{ .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_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 = META('s'), { 0, 0, 0, 0 }, f_findfw, { 0 } }, -{ .keyv.c = CONTROL('T'), { 0, 0, 0, 0 }, f_pipero , { .v = TOCLIP } }, -{ .keyv.c = CONTROL('U'), { t_bol, t_rw, 0, 0 }, f_delete, { .m = m_prevchar } }, -{ .keyv.c = CONTROL('U'), { t_rw, 0, 0, 0 }, f_delete, { .m = m_bol } }, -{ .keyv.c = META('u'), { t_sel, t_rw, 0, 0 }, f_pipe, { .v = "tr [a-zàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ] [A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ] | sed 's/ß/SS/g'" } }, /* Uppercase */ -{ .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('Z'), { 0, 0, 0, 0 }, f_suspend, { 0 } }, -{ .keyv.c = CONTROL('['), { t_vis, 0, 0, 0 }, f_toggle, { .i = S_Visual } }, -#if VIM_BINDINGS -{ .keyv.c = CONTROL('['), { t_ins, 0, 0, 0 }, f_toggle, { .i = S_Command } }, -#else -{ .keyv.c = CONTROL('['), { 0, 0, 0, 0 }, f_spawn, CMD_P }, -#endif -//{ .keyv.c = CONTROL('['), { 0, 0, 0, 0 }, 0, { 0 } }, -{ .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 = 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_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 } }, -}; - -#if VIM_BINDINGS -// 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 */ -{ .keyv.c = { '$' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_eol } }, -{ .keyv.c = { '$' }, { 0, 0, 0, 0 }, f_move, { .m = m_eol } }, -{ .keyv.c = { '^' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_bol } }, -{ .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_sel, t_rw, 0, 0 }, f_toggle, { .i = S_Visual } }, -{ .keyv.c = { 'c' }, { t_sel, t_rw, 0, 0 }, f_toggle, { .i = S_Command } },*/ -{ .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_toggle, { .i = S_Command } }, -{ .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_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 } }, -{ .keyv.c = { 'G' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_eof } }, -{ .keyv.c = { 'G' }, { 0, 0, 0, 0 }, f_move, { .m = m_eof } }, -{ .keyv.c = { 'h' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_prevchar } }, -{ .keyv.c = { 'h' }, { 0, 0, 0, 0 }, f_move, { .m = m_prevchar } }, -{ .keyv.c = { 'i' }, { 0, 0, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 'j' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_nextline } }, -{ .keyv.c = { 'j' }, { 0, 0, 0, 0 }, f_move, { .m = m_nextline } }, -{ .keyv.c = { 'k' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_prevline } }, -{ .keyv.c = { 'k' }, { 0, 0, 0, 0 }, f_move, { .m = m_prevline } }, -{ .keyv.c = { 'l' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_nextchar } }, -{ .keyv.c = { 'l' }, { 0, 0, 0, 0 }, f_move, { .m = m_nextchar } }, -{ .keyv.c = { 'm' }, { 0, 0, 0, 0 }, f_mark, { .i = 0 } }, -{ .keyv.c = { 'n' }, { 0, 0, 0, 0 }, f_findfw, { .i = 0 } }, -{ .keyv.c = { 'N' }, { 0, 0, 0, 0 }, f_findbw, { .i = 0 } }, -{ .keyv.c = { 'o' }, { t_rw, t_ai, 0, 0 }, f_move, { .m = m_eol } }, -{ .keyv.c = { 'o' }, { t_rw, t_ai, 0, 0 }, f_pipeai, { .v = AUTOINDENT } }, -{ .keyv.c = { 'o' }, { t_rw, t_ai, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 'o' }, { t_rw, 0, 0, 0 }, f_move, { .m = m_eol } }, -{ .keyv.c = { 'o' }, { t_rw, 0, 0, 0 }, f_insert, { .v = "\n" } }, -{ .keyv.c = { 'o' }, { t_rw, 0, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 'O' }, { t_rw, t_ai, 0, 0 }, f_move, { .m = m_bol } }, -{ .keyv.c = { 'O' }, { t_rw, t_ai, 0, 0 }, f_pipeai, { .v = AUTOINDENT } }, -{ .keyv.c = { 'O' }, { t_rw, t_ai, 0, 0 }, f_move, { .m = m_prevline } }, -{ .keyv.c = { 'O' }, { t_rw, t_ai, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 'O' }, { t_rw, 0, 0, 0 }, f_move, { .m = m_bol } }, -{ .keyv.c = { 'O' }, { t_rw, 0, 0, 0 }, f_insert, { .v = "\n" } }, -{ .keyv.c = { 'O' }, { t_rw, 0, 0, 0 }, f_move, { .m = m_prevline } }, -{ .keyv.c = { 'O' }, { t_rw, 0, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 'p' }, { t_rw, 0, 0, 0 }, f_pipenull, { .v = FROMCLIP } }, -{ .keyv.c = { 's' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, -{ .keyv.c = { 's' }, { t_sel, t_rw, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 's' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_nextchar } }, -{ .keyv.c = { 's' }, { t_rw, 0, 0, 0 }, f_toggle, { .i = S_Command } }, -{ .keyv.c = { 'u' }, { t_undo,t_rw, 0, 0 }, f_undo, { .i = 1 } }, -{ .keyv.c = { 'v' }, { 0, 0, 0, 0 }, f_toggle, { .i = S_Visual } }, -{ .keyv.c = { 'w' }, { t_sent,0, 0, 0 }, f_adjective, { .m = m_nextword } }, -{ .keyv.c = { 'w' }, { 0, 0, 0, 0 }, f_move, { .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 = { 'X' }, { t_sel, t_rw, 0, 0 }, f_delete, { .m = m_tosel } }, -{ .keyv.c = { 'X' }, { t_rw, 0, 0, 0 }, f_delete, { .m = m_prevchar } }, -{ .keyv.c = { 'y' }, { t_rw, 0, 0, 0 }, f_pipero, { .m = m_sentence, .v = TOCLIP } }, /* TODO: won't work since Arg is a union */ -{ .keyv.c = { ';' }, { 0, 0, 0, 0 }, f_spawn, CMD_P }, -{ .keyv.c = { ':' }, { 0, 0, 0, 0 }, f_spawn, CMD_P }, -{ .keyv.c = { '\'' }, { 0, 0, 0, 0 }, f_move, { .m = m_tomark } }, -{ .keyv.c = { '.' }, { t_rw, 0, 0, 0 }, f_repeat, { 0 } }, -{ .keyv.c = { '/' }, { 0, 0, 0, 0 }, f_spawn, FIND }, -{ .keyv.c = { ' ' }, { 0, 0, 0, 0 }, f_move, { .m = m_nextchar } }, -/* TODO: Keybindings left: - * e/E go to the end of the word (adj) (?) - * r replace char (verb) - * t/T do until char (adj) - * i do inside (adj) (ex. diw deletes current word) - * </> ident - */ -}; -#endif - -#if HANDLE_MOUSE -/*Mouse clicks */ -static const Click clks[] = { -/* mouse mask, fcur / fsel, tests, func, arg */ -{BUTTON1_CLICKED, { TRUE , TRUE }, { 0, 0, 0 }, 0, { 0 } }, -{BUTTON3_CLICKED, { TRUE , FALSE }, { t_sel, 0, 0 }, f_pipero, { .v = TOSEL } }, -{BUTTON2_CLICKED, { FALSE, FALSE }, { t_rw, 0, 0 }, f_pipenull, { .v = FROMSEL } }, -//{BUTTON4_CLICKED, { FALSE, FALSE }, { 0, 0, 0 }, f_move, { .m = m_prevscr } }, -//{BUTTON5_CLICKED, { FALSE, FALSE }, { 0, 0, 0 }, f_move, { .m = m_nextscr } }, -/* ^^ NCurses is a sad old library.... it does not include button 5 nor cursor movement in its mouse declaration by default */ -{BUTTON1_DOUBLE_CLICKED, { TRUE , TRUE }, { 0, 0, 0 }, f_extsel, { .i = ExtWord } }, -{BUTTON1_TRIPLE_CLICKED, { TRUE , TRUE }, { 0, 0, 0 }, f_extsel, { .i = ExtLines } }, -}; -#endif /* HANDLE_MOUSE */ - -/* Commands read at the fifo */ -static const Command cmds[] = { /* REMEMBER: if(arg == 0) arg.v=regex_match */ -/* regex, tests, func arg */ -{"^([0-9]+)$", { 0, 0, 0 }, f_line , { 0 } }, -{"^/(.*)$", { 0, 0, 0 }, f_findfw, { 0 } }, -{"^\\?(.*)$", { 0, 0, 0 }, f_findbw, { 0 } }, -{"^![ \t]*(.*)$", { t_rw, 0, 0 }, f_pipe, { 0 } }, -{"^![ /t]*(.*)$", { 0, 0, 0 }, f_pipero, { 0 } }, -{"^w[ \t]*(.*)$", { t_mod, t_rw, 0 }, f_save, { 0 } }, -{"^syntax (.*)$", { 0, 0, 0 }, f_syntax, { 0 } }, -{"^offset (.*)$", { 0, 0, 0 }, f_offset, { 0 } }, -{"^icase$", { 0, 0, 0 }, f_toggle, { .i = S_CaseIns } }, -{"^ro$", { 0, 0, 0 }, f_toggle, { .i = S_Readonly } }, -{"^ai$", { 0, 0, 0 }, f_toggle, { .i = S_AutoIndent } }, -{"^dump$", { 0, 0, 0 }, f_toggle, { .i = S_DumpStdout } }, -{"^q$", { t_mod, 0, 0 }, f_toggle, { .i = S_Warned } }, -{"^q$", { 0, 0, 0 }, f_toggle, { .i = S_Running } }, -{"^q!$", { 0, 0, 0 }, f_toggle, { .i = S_Running } }, -}; - -/* Syntax color definition */ -#define B "\\b" -/* #define B "^| |\t|\\(|\\)|\\[|\\]|\\{|\\}|\\||$" -- Use this if \b is not in your libc's regex implementation */ - -static const Syntax syntaxes[] = { -#if HILIGHT_SYNTAX -{"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, - /* HiMag */ B"(goto|continue|break|return)"B, - /* LoMag */ "(^#(define|include(_next)?|(un|ifn?)def|endif|el(if|se)|if|warning|error|pragma))|"B"[A-Z_][0-9A-Z_]+"B"", - /* HiBlue */ "(\\(|\\)|\\{|\\}|\\[|\\])", - /* LoRed */ "(\"(\\\\.|[^\"])*\")", - /* LoBlue */ "(//.*|/\\*([^*]|\\*[^/])*\\*/|/\\*([^*]|\\*[^/])*$|^([^/]|/[^*])*\\*/)", - } }, - -{"sh", "\\.sh$", { - /* HiRed */ "$^", - /* HiGreen */ "^[0-9A-Z_]+\\(\\)", - /* LoGreen */ B"(case|do|done|elif|else|esac|exit|fi|for|function|if|in|local|read|return|select|shift|then|time|until|while)"B, - /* HiMag */ "$^", - /* LoMag */ "\"(\\\\.|[^\"])*\"", - /* HiBlue */ "(\\{|\\}|\\(|\\)|\\;|\\]|\\[|`|\\\\|\\$|<|>|!|=|&|\\|)", - /* LoRed */ "\\$\\{?[0-9A-Z_!@#$*?-]+\\}?", - /* LoBlue */ "#.*$", - } }, - -{"makefile", "(Makefile[^/]*|\\.mk)$", { - /* HiRed */ "$^", - /* HiGreen */ "$^", - /* LoGreen */ "\\$+[{(][a-zA-Z0-9_-]+[})]", - /* HiMag */ B"(if|ifeq|else|endif)"B, - /* LoMag */ "$^", - /* HiBlue */ "^[^ ]+:", - /* LoRed */ "[:=]", - /* LoBlue */ "#.*$", - } }, - -{"man", "\\.[1-9]x?$", { - /* HiRed */ "\\.(BR?|I[PR]?).*$", - /* HiGreen */ "$^", - /* LoGreen */ "\\.(S|T)H.*$", - /* HiMag */ "\\.(br|DS|RS|RE|PD)", - /* LoMag */ "(\\.(S|T)H|\\.TP)", - /* HiBlue */ "\\.(BR?|I[PR]?|PP)", - /* LoRed */ "$^", - /* LoBlue */ "\\\\f[BIPR]", - } }, - -{"vala", "\\.(vapi|vala)$", { - /* HiRed */ B"[A-Z_][0-9A-Z_]+"B, - /* HiGreen */ B"(for|if|while|do|else|case|default|switch|get|set|value|out|ref|enum)"B, - /* LoGreen */ B"(uint|uint8|uint16|uint32|uint64|bool|byte|ssize_t|size_t|char|double|string|float|int|long|short|this|base|transient|void|true|false|null|unowned|owned)"B, - /* HiMag */ B"(try|catch|throw|finally|continue|break|return|new|sizeof|signal|delegate)"B, - /* LoMag */ B"(abstract|class|final|implements|import|instanceof|interface|using|private|public|static|strictfp|super|throws)"B, - /* HiBlue */ "(\\(|\\)|\\{|\\}|\\[|\\])", - /* LoRed */ "\"(\\\\.|[^\"])*\"", - /* LoBlue */ "(//.*|/\\*([^*]|\\*[^/])*\\*/|/\\*([^*]|\\*[^/])*$|^([^/]|/[^*])*\\*/)", - } }, - -{"java", "\\.java$", { - /* HiRed */ B"[A-Z_][0-9A-Z_]+"B, - /* HiGreen */ B"(for|if|while|do|else|case|default|switch)"B, - /* LoGreen */ B"(boolean|byte|char|double|float|int|long|short|transient|void|true|false|null)"B, - /* HiMag */ B"(try|catch|throw|finally|continue|break|return|new)"B, - /* LoMag */ B"(abstract|class|extends|final|implements|import|instanceof|interface|native|package|private|protected|public|static|strictfp|this|super|synchronized|throws|volatile)"B, - /* HiBlue */ "(\\(|\\)|\\{|\\}|\\[|\\])", - /* LoRed */ "\"(\\\\.|[^\"])*\"", - /* LoBlue */ "(//.*|/\\*([^*]|\\*[^/])*\\*/|/\\*([^*]|\\*[^/])*$|^([^/]|/[^*])*\\*/)", - } }, - -{"ruby", "\\.rb$", { - /* HiRed */ "(\\$|@|@@)?"B"[A-Z]+[0-9A-Z_a-z]*", - /* HiGreen */ B"(__FILE__|__LINE__|BEGIN|END|alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)"B, - /* LoGreen */ "([ ]|^):[0-9A-Z_]+"B, - /* HiMag */ "(/([^/]|(\\/))*/[iomx]*|%r\\{([^}]|(\\}))*\\}[iomx]*)", - /* LoMag */ "(`[^`]*`|%x\\{[^}]*\\})", - /* HiBlue */ "(\"([^\"]|(\\\\\"))*\"|%[QW]?\\{[^}]*\\}|%[QW]?\\([^)]*\\)|%[QW]?<[^>]*>|%[QW]?\\[[^]]*\\]|%[QW]?\\$[^$]*\\$|%[QW]?\\^[^^]*\\^|%[QW]?![^!]*!|\'([^\']|(\\\\\'))*\'|%[qw]\\{[^}]*\\}|%[qw]\\([^)]*\\)|%[qw]<[^>]*>|%[qw]\\[[^]]*\\]|%[qw]\\$[^$]*\\$|%[qw]\\^[^^]*\\^|%[qw]![^!]*!)", - /* LoRed */ "#\\{[^}]*\\}", - /* LoBlue */ "(#[^{].*$|#$)", - } }, -#else /* HILIGHT_SYNTAX */ -{"", "\0", { "\0", "\0", "\0", "\0", "\0", "\0", "\0", "\0" } } -#endif /* HILIGHT_SYNTAX */ -}; - -/* Colors */ -static const short fgcolors[LastFG] = { - [DefFG] = 0xFFF, // 0xF8F8F2 - [CurFG] = -1, - [SelFG] = -1, - [SpcFG] = COLOR_WHITE, - [CtrlFG] = COLOR_RED, - [Syn0FG] = COLOR_RED, - [Syn1FG] = 0xF27, // 0xF92672 - [Syn2FG] = 0x6DE, // 0x66D9EF - [Syn3FG] = COLOR_MAGENTA, - [Syn4FG] = 0xAE2, // 0xA6E22E - [Syn5FG] = COLOR_BLUE, - [Syn6FG] = 0xED7, // 0xE6DB74 - [Syn7FG] = 0x775, // 0x7E8E91 -}; - -static const int colorattrs[LastFG] = { - [DefFG] = 0, - [CurFG] = 0, - [SelFG] = 0, - [SpcFG] = A_DIM, - [CtrlFG] = A_DIM, - [Syn0FG] = A_BOLD, - [Syn1FG] = A_BOLD, - [Syn2FG] = 0, - [Syn3FG] = A_BOLD, - [Syn4FG] = 0, - [Syn5FG] = A_BOLD, - [Syn6FG] = 0, - [Syn7FG] = 0, -}; - -static const int bwattrs[LastFG] = { - [DefFG] = 0, - [CurFG] = 0, - [SelFG] = A_REVERSE, - [SpcFG] = A_DIM, - [CtrlFG] = A_DIM, - [Syn0FG] = A_BOLD, - [Syn1FG] = A_BOLD, - [Syn2FG] = A_BOLD, - [Syn3FG] = A_BOLD, - [Syn4FG] = A_BOLD, - [Syn5FG] = A_BOLD, - [Syn6FG] = A_BOLD, - [Syn7FG] = A_BOLD, -}; - -static const short bgcolors[LastBG] = { - [DefBG] = 0x222, // 0x272822 or 0x1B1D1E - [CurBG] = (HILIGHT_CURRENT?0x333:-1), // 0x3E3D32 or 0x293739 - [SelBG] = 0x333, // 0x3E3D32 or 0x293739 -}; - -/* Helper config functions implementation */ -void /* Pipe selection from bol, then select last line only, special for autoindenting */ -f_pipeai(const Arg *arg) { - i_sortpos(&fsel, &fcur); - fsel.o=0; - f_pipe(arg); - fsel=fcur; -} - -void /* Pipe full lines including the selection */ -f_pipeline(const Arg *arg) { - f_extsel(&(const Arg){ .i = ExtLines }); - f_pipe(arg); -} - -void /* Pipe empty text */ -f_pipenull(const Arg *arg) { - fsel=fcur; - f_pipe(arg); -} diff --git a/config.h b/config.h @@ -0,0 +1 @@ +config.def.h+ \ No newline at end of file