diff options
| -rw-r--r-- | vis-cmds.c | 6 | ||||
| -rw-r--r-- | vis-core.h | 3 | ||||
| -rw-r--r-- | vis.c | 39 | ||||
| -rw-r--r-- | vis.h | 20 |
4 files changed, 43 insertions, 25 deletions
@@ -688,6 +688,12 @@ static bool cmd_help(Vis *vis, Win *win, Command *cmd, const char *argv[], Curso for (size_t i = 0; i < LENGTH(vis_marks); i++) text_appendf(txt, " %c %s\n", vis_marks[i].name, vis_marks[i].help); + text_appendf(txt, "\n Registers\n\n"); + text_appendf(txt, " a-z General purpose registers\n"); + text_appendf(txt, " A-Z Append to corresponding general purpose register\n"); + for (size_t i = 0; i < LENGTH(vis_registers); i++) + text_appendf(txt, " %c %s\n", vis_registers[i].name, vis_registers[i].help); + text_appendf(txt, "\n :set command options\n\n"); for (int i = 0; i < LENGTH(options); i++) { char names[256]; @@ -214,6 +214,8 @@ typedef struct { const char *help; } MarkDef; +typedef MarkDef RegisterDef; + /** stuff used by multiple of the vis-* files */ extern Mode vis_modes[VIS_MODE_INVALID]; @@ -221,6 +223,7 @@ extern const Movement vis_motions[VIS_MOVE_INVALID]; extern const Operator vis_operators[VIS_OP_INVALID]; extern const TextObject vis_textobjects[VIS_TEXTOBJECT_INVALID]; extern const MarkDef vis_marks[VIS_MARK_a]; +extern const RegisterDef vis_registers[VIS_REG_a]; void macro_operator_stop(Vis *vis); void macro_operator_record(Vis *vis); @@ -34,6 +34,17 @@ const MarkDef vis_marks[] = { [VIS_MARK_SELECTION_END] = { '>', "Last selection end" }, }; +const RegisterDef vis_registers[] = { + [VIS_REG_DEFAULT] = { '"', "Unnamed register" }, + [VIS_REG_ZERO] = { '0', "Yank register" }, + [VIS_REG_BLACKHOLE] = { '_', "/dev/null register" }, + [VIS_REG_CLIPBOARD] = { '*', "System clipboard register, see vis-clipboard(1)" }, + [VIS_MACRO_REPEAT] = { '.', "Last inserted text" }, + [VIS_REG_SEARCH] = { '/', "Last search pattern" }, + [VIS_REG_COMMAND] = { ':', "Last :-command" }, + [VIS_REG_SHELL] = { '!', "Last shell command given to either <, >, |, or !" }, +}; + static Macro *macro_get(Vis *vis, enum VisRegister); static void macro_replay(Vis *vis, const Macro *macro); static void vis_keys_push(Vis *vis, const char *input, size_t pos, bool record); @@ -1296,26 +1307,24 @@ void vis_count_set(Vis *vis, int count) { enum VisRegister vis_register_from(Vis *vis, char reg) { switch (reg) { - case '*': /* fall through */ case '+': return VIS_REG_CLIPBOARD; - case '_': return VIS_REG_BLACKHOLE; - case '0': return VIS_REG_ZERO; case '@': return VIS_MACRO_LAST_RECORDED; - case '/': return VIS_REG_SEARCH; - case ':': return VIS_REG_COMMAND; - case '!': return VIS_REG_SHELL; - default: - if ('a' <= reg && reg <= 'z') - return VIS_REG_a + reg - 'a'; - else if ('A' <= reg && reg <= 'Z') - return VIS_REG_A + reg - 'A'; - return VIS_REG_INVALID; } + + if ('a' <= reg && reg <= 'z') + return VIS_REG_a + reg - 'a'; + if ('A' <= reg && reg <= 'Z') + return VIS_REG_A + reg - 'A'; + for (size_t i = 0; i < LENGTH(vis_registers); i++) { + if (vis_registers[i].name == reg) + return i; + } + return VIS_REG_INVALID; } void vis_register_set(Vis *vis, enum VisRegister reg) { - if (reg >= VIS_REG_A && reg <= VIS_REG_Z) { - vis->action.reg = &vis->registers[reg - VIS_REG_A]; + if (VIS_REG_A <= reg && reg <= VIS_REG_Z) { + vis->action.reg = &vis->registers[VIS_REG_a + reg - VIS_REG_A]; vis->action.reg->append = true; } else if (reg < LENGTH(vis->registers)) { vis->action.reg = &vis->registers[reg]; @@ -1325,7 +1334,7 @@ void vis_register_set(Vis *vis, enum VisRegister reg) { const char *vis_register_get(Vis *vis, enum VisRegister reg, size_t *len) { if (VIS_REG_A <= reg && reg <= VIS_REG_Z) - reg -= VIS_REG_A; + reg = VIS_REG_a + reg - VIS_REG_A; if (reg < LENGTH(vis->registers)) return register_get(vis, &vis->registers[reg], len); *len = 0; @@ -398,22 +398,22 @@ enum VisMark vis_mark_from(Vis*, char mark); void vis_mark_set(Vis*, enum VisMark mark, size_t pos); enum VisRegister { + VIS_REG_DEFAULT, /* used when no other register is specified */ + VIS_REG_ZERO, /* yank register */ + VIS_REG_BLACKHOLE, /* /dev/null register */ + VIS_REG_CLIPBOARD, /* system clipboard register */ + VIS_MACRO_REPEAT, /* copy of the above macro once the recording is finished */ + VIS_REG_SEARCH, /* last used search pattern "/ */ + VIS_REG_COMMAND, /* last used :-command ": */ + VIS_REG_SHELL, /* last used shell command given to either <, >, |, or ! */ VIS_REG_a, VIS_REG_b, VIS_REG_c, VIS_REG_d, VIS_REG_e, VIS_REG_f, VIS_REG_g, VIS_REG_h, VIS_REG_i, VIS_REG_j, VIS_REG_k, VIS_REG_l, VIS_REG_m, VIS_REG_n, VIS_REG_o, VIS_REG_p, VIS_REG_q, VIS_REG_r, VIS_REG_s, VIS_REG_t, VIS_REG_u, VIS_REG_v, VIS_REG_w, VIS_REG_x, VIS_REG_y, VIS_REG_z, - VIS_REG_DEFAULT, /* used when no other register is specified */ - VIS_REG_ZERO, /* yank register */ - VIS_REG_BLACKHOLE, /* /dev/null register */ - VIS_REG_CLIPBOARD, /* system clipboard register */ - VIS_REG_PROMPT, /* internal register which shadows DEFAULT in PROMPT mode */ - VIS_MACRO_OPERATOR, /* records entered keys after an operator */ - VIS_MACRO_REPEAT, /* copy of the above macro once the recording is finished */ - VIS_REG_SEARCH, /* last used search pattern "/ */ - VIS_REG_COMMAND, /* last used :-command ": */ - VIS_REG_SHELL, /* last used shell command given to either <, >, |, or ! */ + VIS_MACRO_OPERATOR, /* records entered keys after an operator */ + VIS_REG_PROMPT, /* internal register which shadows DEFAULT in PROMPT mode */ VIS_REG_INVALID, /* has to be the last 'real' register */ VIS_REG_A, VIS_REG_B, VIS_REG_C, VIS_REG_D, VIS_REG_E, VIS_REG_F, VIS_REG_G, VIS_REG_H, VIS_REG_I, VIS_REG_J, |
