sled

Једноставни уређивач текста
git clone https://git.sr.ht/~strahinja/sled
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

config.def.h (10557B)


      1 /* This program is licensed under the terms of GNU GPL v3 or (at your option)
      2  * any later version. Copyright (C) 2022-2026  Страхиња Радић.
      3  * See the file LICENSE for exact copyright and license details. */
      4 
      5 /* clang-format off */
      6 static const struct Color colors[] = {
      7 	[C_DLG]	       = { .fg = TB_BLACK,	.bg = TB_WHITE		},
      8 	[C_ERROR]      = { .fg = TB_WHITE | TB_BOLD,
      9 						.bg = TB_RED		},
     10 	[C_ACTION]     = { .fg = TB_BLACK,	.bg = TB_WHITE		},
     11 	[C_INPUT]      = { .fg = TB_BLACK,	.bg = TB_WHITE		},
     12 	[C_INPUT_EDIT] = { .fg = TB_WHITE,	.bg = TB_BLACK		},
     13 	[C_LINENO]     = { .fg = TB_BLACK,	.bg = TB_CYAN		},
     14 	[C_PROMPT]     = { .fg = TB_YELLOW | TB_BOLD,
     15 						.bg = TB_MAGENTA	},
     16 	[C_SEARCH]     = { .fg = TB_WHITE | TB_BOLD,
     17 						.bg = TB_GREEN		},
     18 	[C_SEL]	       = { .fg = TB_BLACK,	.bg = TB_WHITE		},
     19 	[C_SHADOW]     = { .fg = TB_BLACK,	.bg = TB_BLACK | TB_BOLD},
     20 	[C_STATUS_1]   = { .fg = TB_WHITE | TB_BOLD,
     21 						.bg = TB_BLUE		},
     22 	[C_STATUS_2]   = { .fg = TB_YELLOW | TB_BOLD,
     23 						.bg = TB_BLUE		},
     24 	[C_STATUS_3]   = { .fg = TB_WHITE,	.bg = TB_BLUE		},
     25 	[C_STATUS_4]   = { .fg = TB_WHITE | TB_BOLD,
     26 						.bg = TB_BLUE		},
     27 	[C_STATUS_5]   = { .fg = TB_WHITE,	.bg = TB_BLUE		},
     28 	[C_TEXT]       = { .fg = TB_DEFAULT,	.bg = TB_DEFAULT	},
     29 	[C_TITLE]      = { .fg = TB_BLACK,	.bg = TB_WHITE		},
     30 };
     31 /* clang-format on */
     32 
     33 extern int backup_fail;
     34 extern char* backup_suffix;
     35 extern int create_backups;
     36 extern int enable_wrap;
     37 extern int line_numbers;
     38 extern int line_numbers_width;
     39 extern int open_binary;
     40 extern int wrap_width;
     41 
     42 #ifdef SLED_C_GLOBALS
     43 /* clang-format off */
     44 
     45 /* Fail with error if creating backups is not possible due to file and
     46  * directory permissions? */
     47 int backup_fail		= 1;
     48 char* backup_suffix	= "~";
     49 int create_backups	= 1;	/* comment out to not create backups */
     50 int enable_wrap		= 1;
     51 int line_numbers 	= 0;	/* draw line numbers? initial value */
     52 int open_binary		= 0;	/* open binary files?		    */
     53 /* - ideally, wrap_width + line_numbers_width (automatic) <= 80		    */
     54 /* - wrap width of 72 is recommended on https://useplaintext.email/	    */
     55 int wrap_width		= 72;
     56 
     57 /* Always processed */
     58 static const struct Key top_level_keys[] = {
     59 	{ .ev = { .key = TB_KEY_ESC },  .callback = cancel_close },
     60 	{ .ev = { .key = TB_KEY_CTRL_Q, .mod = TB_MOD_CTRL },
     61 					.callback = exit_program },
     62 	{ .ev = { .key = TB_KEY_CTRL_Z, .mod = TB_MOD_CTRL },
     63 					.callback = suspend_program }
     64 };
     65 
     66 /* Only when no dialog/prompt open */
     67 static const struct Key global_keys[] = {
     68 	{ .ev = { .key = TB_KEY_ARROW_DOWN },
     69 					.callback = move_down },
     70 	{ .ev = { .key = TB_KEY_ARROW_UP },
     71 					.callback = move_up },
     72 	{ .ev = { .key = TB_KEY_ARROW_LEFT },
     73 					.callback = move_left },
     74 	{ .ev = { .key = TB_KEY_ARROW_RIGHT },
     75 					.callback = move_right },
     76 	{ .ev = { .key = TB_KEY_BACKSPACE, .mod = TB_MOD_CTRL },
     77 					.callback = erase_backwards },
     78 	{ .ev = { .key = TB_KEY_BACKSPACE2, .mod = TB_MOD_CTRL },
     79 					.callback = erase_backwards },
     80 	{ .ev = { .key = TB_KEY_CTRL_A, .mod = TB_MOD_CTRL },
     81 					.callback = move_start },
     82 	{ .ev = { .key = TB_KEY_CTRL_B, .mod = TB_MOD_CTRL },
     83 					.callback = move_page_up },
     84 	{ .ev = { .key = TB_KEY_CTRL_C, .mod = TB_MOD_CTRL },
     85 					.callback = yank_to_paste },
     86 	{ .ev = { .key = TB_KEY_CTRL_D, .mod = TB_MOD_CTRL },
     87 					.callback = erase_forward },
     88 	{ .ev = { .key = TB_KEY_CTRL_E, .mod = TB_MOD_CTRL },
     89 					.callback = move_end },
     90 	{ .ev = { .key = TB_KEY_CTRL_F, .mod = TB_MOD_CTRL },
     91 					.callback = move_page_down },
     92 	{ .ev = { .key = TB_KEY_CTRL_J, .mod = TB_MOD_CTRL },
     93 					.callback = wrap_para },
     94 	{ .ev = { .key = TB_KEY_CTRL_K, .mod = TB_MOD_CTRL },
     95 					.callback = erase_to_end },
     96 	{ .ev = { .key = TB_KEY_CTRL_L, .mod = TB_MOD_CTRL },
     97 					.callback = show_go_to_line },
     98 	{ .ev = { .key = TB_KEY_CTRL_N, .mod = TB_MOD_CTRL },
     99 					.callback = next_match },
    100 	{ .ev = { .key = TB_KEY_CTRL_O, .mod = TB_MOD_CTRL },
    101 					.callback = reread_or_callback },
    102 	{ .ev = { .key = TB_KEY_CTRL_P, .mod = TB_MOD_CTRL },
    103 					.callback = prev_match },
    104 	{ .ev = { .key = TB_KEY_CTRL_R, .mod = TB_MOD_CTRL },
    105 					.callback = move_prev_word },
    106 	{ .ev = { .key = TB_KEY_CTRL_SPACE, .mod = TB_MOD_CTRL },
    107 					.callback = toggle_selection },
    108 	{ .ev = { .key = TB_KEY_CTRL_S, .mod = TB_MOD_CTRL },
    109 					.callback = write_file },
    110 	{ .ev = { .key = TB_KEY_CTRL_T, .mod = TB_MOD_CTRL },
    111 					.callback = move_next_word },
    112 	{ .ev = { .key = TB_KEY_CTRL_U, .mod = TB_MOD_CTRL },
    113 					.callback = erase_to_start },
    114 	{ .ev = { .key = TB_KEY_CTRL_V, .mod = TB_MOD_CTRL },
    115 					.callback = paste_from_paste },
    116 	{ .ev = { .key = TB_KEY_CTRL_X, .mod = TB_MOD_CTRL },
    117 					.callback = cut_to_paste },
    118 	{ .ev = { .key = TB_KEY_CTRL_Y, .mod = TB_MOD_CTRL },
    119 					.callback = erase_line },
    120 	{ .ev = { .key = TB_KEY_CTRL_W, .mod = TB_MOD_CTRL },
    121 					.callback = erase_prev_word },
    122 	{ .ev = { .key = TB_KEY_DELETE },
    123 					.callback = erase_forward },
    124 	{ .ev = { .key = TB_KEY_F1 },	.callback = show_help },
    125 	{ .ev = { .key = TB_KEY_F2 },	.callback = toggle_line_numbers },
    126 	{ .ev = { .key = TB_KEY_F3 },	.callback = next_match },
    127 	{ .ev = { .key = TB_KEY_F3, .mod = TB_MOD_SHIFT },
    128 					.callback = prev_match },
    129 	{ .ev = { .key = TB_KEY_F4 },	.callback = show_search_replace },
    130 	{ .ev = { .key = TB_KEY_F7 },	.callback = show_search },
    131 	{ .ev = { .key = TB_KEY_END },	.callback = move_end },
    132 	{ .ev = { .key = TB_KEY_HOME },	.callback = move_start },
    133 	{ .ev = { .key = TB_KEY_INSERT },
    134 					.callback = toggle_overwrite },
    135 	{ .ev = { .key = TB_KEY_PGDN }, .callback = move_page_down },
    136 	{ .ev = { .key = TB_KEY_PGUP }, .callback = move_page_up }
    137 };
    138 
    139 /* Only when input dialog is shown */
    140 static const struct Key input_dialog_keys[] = {
    141 	{ .ev = { .key = TB_KEY_ESC },	.callback = input_cancel },
    142 	{ .ev = { .key = TB_KEY_ARROW_LEFT },
    143 					.callback = input_move_left },
    144 	{ .ev = { .key = TB_KEY_ARROW_RIGHT },
    145 					.callback = input_move_right },
    146 	{ .ev = { .key = TB_KEY_BACKSPACE, .mod = TB_MOD_CTRL },
    147 					.callback = input_erase_backwards },
    148 	{ .ev = { .key = TB_KEY_BACKSPACE2, .mod = TB_MOD_CTRL },
    149 					.callback = input_erase_backwards },
    150 	{ .ev = { .key = TB_KEY_CTRL_A, .mod = TB_MOD_CTRL },
    151 					.callback = input_move_start },
    152 	{ .ev = { .key = TB_KEY_CTRL_D, .mod = TB_MOD_CTRL },
    153 					.callback = input_erase_forward },
    154 	{ .ev = { .key = TB_KEY_CTRL_E, .mod = TB_MOD_CTRL },
    155 					.callback = input_move_end },
    156 	{ .ev = { .key = TB_KEY_CTRL_K, .mod = TB_MOD_CTRL },
    157 					.callback = input_erase_to_end },
    158 	{ .ev = { .key = TB_KEY_CTRL_R, .mod = TB_MOD_CTRL },
    159 					.callback = input_move_prev_word },
    160 	{ .ev = { .key = TB_KEY_CTRL_T, .mod = TB_MOD_CTRL },
    161 					.callback = input_move_next_word },
    162 	{ .ev = { .key = TB_KEY_CTRL_U, .mod = TB_MOD_CTRL },
    163 					.callback = input_erase_to_start },
    164 	{ .ev = { .key = TB_KEY_DELETE },
    165 					.callback = input_erase_forward },
    166 	{ .ev = { .key = TB_KEY_END },	.callback = input_move_end },
    167 	/* Enter = C-M, hence the TB_MOD_CTRL; tb doesn't make a difference
    168 	 * between C-Enter and Enter... */
    169 	{ .ev = { .key = TB_KEY_ENTER, .mod = TB_MOD_CTRL },
    170 					.callback = input_enter },
    171 	{ .ev = { .key = TB_KEY_HOME },	.callback = input_move_start },
    172 	{ .ev = { .key = TB_KEY_SPACE },
    173 					.callback = input_insert_space },
    174 	/* Tab = C-I, hence the TB_MOD_CTRL; tb doesn't make a difference
    175 	 * between C-I and Tab... */
    176 	{ .ev = { .key = TB_KEY_TAB, .mod = TB_MOD_CTRL },
    177 					.callback = input_insert_tab }
    178 };
    179 
    180 /* Only when in insert mode */
    181 static const struct Key insert_keys[] = {
    182 	{ .ev = { .key = TB_KEY_CTRL_BACKSLASH, .mod = TB_MOD_CTRL },
    183 					.callback = enter_command_mode },
    184 	/* Enter = C-M, hence the TB_MOD_CTRL; tb doesn't make a difference
    185 	 * between C-Enter and Enter... */
    186 	{ .ev = { .key = TB_KEY_ENTER, .mod = TB_MOD_CTRL },
    187 					.callback = insert_line },
    188 	{ .ev = { .key = TB_KEY_INSERT },
    189 					.callback = toggle_overwrite },
    190 	{ .ev = { .key = TB_KEY_SPACE },
    191 					.callback = insert_space },
    192 	/* Tab = C-I, hence the TB_MOD_CTRL; tb doesn't make a difference
    193 	 * between C-I and Tab... */
    194 	{ .ev = { .key = TB_KEY_TAB, .mod = TB_MOD_CTRL },
    195 					.callback = insert_tab }
    196 };
    197 
    198 /* Only when in command mode */
    199 static const struct Key command_keys[] = {
    200 	{ .ev = { .key = TB_KEY_CTRL_BACKSLASH, .mod = TB_MOD_CTRL },
    201 					.callback = enter_insert_mode },
    202 	{ .ev = { .ch = '/' },		.callback = show_search },
    203 	{ .ev = { .ch = '\\' },		.callback = show_search_replace },
    204 	{ .ev = { .ch = ':' },		.callback = show_go_to_line },
    205 	{ .ev = { .ch = '0' },		.callback = move_start },
    206 	{ .ev = { .ch = '$' },		.callback = move_end },
    207 	{ .ev = { .ch = 'd' },		.callback = erase_line },
    208 	{ .ev = { .ch = 'G' },		.callback = move_bottom },
    209 	{ .ev = { .ch = 'g' },		.callback = move_top },
    210 	{ .ev = { .ch = 'H' },		.callback = move_screen_top },
    211 	{ .ev = { .ch = 'h' },		.callback = move_left },
    212 	{ .ev = { .ch = 'J' },		.callback = join_lines },
    213 	{ .ev = { .ch = 'j' },		.callback = move_down },
    214 	{ .ev = { .ch = 'k' },		.callback = move_up },
    215 	{ .ev = { .ch = 'L' },		.callback = move_screen_bottom },
    216 	{ .ev = { .ch = 'l' },		.callback = move_right },
    217 	{ .ev = { .ch = 'M' },		.callback = move_screen_middle },
    218 	{ .ev = { .ch = 'N' },		.callback = prev_match },
    219 	{ .ev = { .ch = 'n' },		.callback = next_match },
    220 	{ .ev = { .ch = 'P' },		.callback = paste_from_paste },
    221 	{ .ev = { .ch = 'q' },		.callback = exit_program },
    222 	{ .ev = { .ch = 'R' },		.callback = toggle_overwrite },
    223 	{ .ev = { .ch = 'r' },		.callback = reread_or_callback },
    224 	{ .ev = { .ch = 'v' },		.callback = toggle_selection },
    225 	{ .ev = { .ch = 'W' },		.callback = move_prev_word },
    226 	{ .ev = { .ch = 'w' },		.callback = move_next_word },
    227 	{ .ev = { .ch = 'X' },		.callback = cut_to_paste },
    228 	{ .ev = { .ch = 'x' },		.callback = erase_forward },
    229 	{ .ev = { .ch = 'y' },		.callback = yank_to_paste },
    230 	{ .ev = { .ch = 'Z' },		.callback = write_file }
    231 };
    232 
    233 /* clang-format on */
    234 #endif /* SLED_C_GLOBALS */
    235 
    236 /* clang-format off */
    237 static const struct StatusSegment status_segments[] = {
    238 	{.format      = "%s%s",
    239 	 .callback    = format_filename,
    240 	 .color_index = C_STATUS_1,
    241 	 .alignment   = LEFT},
    242 	{.format      = "%s",
    243 	 .callback    = format_mode,
    244 	 .color_index = C_STATUS_2,
    245 	 .alignment   = CENTER},
    246 	{.format      = "[%s]",
    247 	 .callback    = format_codep,
    248 	 .color_index = C_STATUS_3,
    249 	 .alignment   = CENTER},
    250 	{.format      = "+%d %d:%d (%d%%)",
    251 	 .callback    = format_position,
    252 	 .color_index = C_STATUS_4,
    253 	 .alignment   = CENTER},
    254 	{.format      = "F1=HELP",
    255 	 .callback    = NULL,
    256 	 .color_index = C_STATUS_5,
    257 	 .alignment   = RIGHT},
    258 };
    259 /* clang-format on */