aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vis-cmds.c6
-rw-r--r--vis-core.h3
-rw-r--r--vis.c39
-rw-r--r--vis.h20
4 files changed, 43 insertions, 25 deletions
diff --git a/vis-cmds.c b/vis-cmds.c
index cdff8c0..5394ad5 100644
--- a/vis-cmds.c
+++ b/vis-cmds.c
@@ -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];
diff --git a/vis-core.h b/vis-core.h
index 982cda3..1015db1 100644
--- a/vis-core.h
+++ b/vis-core.h
@@ -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);
diff --git a/vis.c b/vis.c
index 1cd5b8f..691c3fc 100644
--- a/vis.c
+++ b/vis.c
@@ -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;
diff --git a/vis.h b/vis.h
index 04d54fb..ab18d3b 100644
--- a/vis.h
+++ b/vis.h
@@ -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,