aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-10-06 09:47:57 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-10-26 10:52:01 -0300
commit5abd25f6fbbdf5a72da8d7f196310229939a4b41 (patch)
tree89f2eb64390a403f43fa2bf7fc3d0fe8f7dc6943 /src
parent0f0fae58b9576b970deab58acc606454d550ff05 (diff)
downloadrneovim-5abd25f6fbbdf5a72da8d7f196310229939a4b41.tar.gz
rneovim-5abd25f6fbbdf5a72da8d7f196310229939a4b41.tar.bz2
rneovim-5abd25f6fbbdf5a72da8d7f196310229939a4b41.zip
normal: Extract `normal_get_command_count` from `normal_execute`
Diffstat (limited to 'src')
-rw-r--r--src/nvim/normal.c126
1 files changed, 67 insertions, 59 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 1cc5d3591c..3b23c4e7dc 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -70,6 +70,7 @@ typedef struct normal_state {
VimState state;
linenr_T conceal_old_cursor_line;
linenr_T conceal_new_cursor_line;
+ bool ctrl_w;
bool need_flushbuf;
bool conceal_update_lines;
bool set_prevcount;
@@ -736,10 +737,73 @@ static void normal_invert_horizontal(NormalState *s)
s->idx = find_command(s->ca.cmdchar);
}
+static bool normal_get_command_count(NormalState *s)
+{
+ if (VIsual_active && VIsual_select) {
+ return false;
+ }
+ // Handle a count before a command and compute ca.count0.
+ // Note that '0' is a command and not the start of a count, but it's
+ // part of a count after other digits.
+ while ((s->c >= '1' && s->c <= '9') || (s->ca.count0 != 0
+ && (s->c == K_DEL || s->c == K_KDEL || s->c == '0'))) {
+ if (s->c == K_DEL || s->c == K_KDEL) {
+ s->ca.count0 /= 10;
+ del_from_showcmd(4); // delete the digit and ~@%
+ } else {
+ s->ca.count0 = s->ca.count0 * 10 + (s->c - '0');
+ }
+
+ if (s->ca.count0 < 0) {
+ // got too large!
+ s->ca.count0 = 999999999L;
+ }
+
+ // Set v:count here, when called from main() and not a stuffed
+ // command, so that v:count can be used in an expression mapping
+ // right after the count. Do set it for redo.
+ if (s->toplevel && readbuf1_empty()) {
+ set_vcount_ca(&s->ca, &s->set_prevcount);
+ }
+
+ if (s->ctrl_w) {
+ ++no_mapping;
+ ++allow_keys; // no mapping for nchar, but keys
+ }
+
+ ++no_zero_mapping; // don't map zero here
+ s->c = plain_vgetc();
+ LANGMAP_ADJUST(s->c, true);
+ --no_zero_mapping;
+ if (s->ctrl_w) {
+ --no_mapping;
+ --allow_keys;
+ }
+ s->need_flushbuf |= add_to_showcmd(s->c);
+ }
+
+ // If we got CTRL-W there may be a/another count
+ if (s->c == Ctrl_W && !s->ctrl_w && s->oa.op_type == OP_NOP) {
+ s->ctrl_w = true;
+ s->ca.opcount = s->ca.count0; // remember first count
+ s->ca.count0 = 0;
+ ++no_mapping;
+ ++allow_keys; // no mapping for nchar, but keys
+ s->c = plain_vgetc(); // get next character
+ LANGMAP_ADJUST(s->c, true);
+ --no_mapping;
+ --allow_keys;
+ s->need_flushbuf |= add_to_showcmd(s->c);
+ return true;
+ }
+
+ return false;
+}
+
static int normal_execute(VimState *state, int key)
{
NormalState *s = (NormalState *)state;
- bool ctrl_w = false; /* got CTRL-W command */
+ s->ctrl_w = false; /* got CTRL-W command */
int old_col = curwin->w_curswant;
pos_T old_pos; /* cursor position before command */
static int old_mapped_len = 0;
@@ -781,63 +845,7 @@ static int normal_execute(VimState *state, int key)
s->need_flushbuf = add_to_showcmd(s->c);
-getcount:
- if (!(VIsual_active && VIsual_select)) {
- // Handle a count before a command and compute ca.count0.
- // Note that '0' is a command and not the start of a count, but it's
- // part of a count after other digits.
- while ((s->c >= '1' && s->c <= '9') || (s->ca.count0 != 0
- && (s->c == K_DEL || s->c == K_KDEL || s->c == '0'))) {
- if (s->c == K_DEL || s->c == K_KDEL) {
- s->ca.count0 /= 10;
- del_from_showcmd(4); // delete the digit and ~@%
- } else {
- s->ca.count0 = s->ca.count0 * 10 + (s->c - '0');
- }
-
- if (s->ca.count0 < 0) {
- // got too large!
- s->ca.count0 = 999999999L;
- }
-
- // Set v:count here, when called from main() and not a stuffed
- // command, so that v:count can be used in an expression mapping
- // right after the count. Do set it for redo.
- if (s->toplevel && readbuf1_empty()) {
- set_vcount_ca(&s->ca, &s->set_prevcount);
- }
-
- if (ctrl_w) {
- ++no_mapping;
- ++allow_keys; // no mapping for nchar, but keys
- }
-
- ++no_zero_mapping; // don't map zero here
- s->c = plain_vgetc();
- LANGMAP_ADJUST(s->c, true);
- --no_zero_mapping;
- if (ctrl_w) {
- --no_mapping;
- --allow_keys;
- }
- s->need_flushbuf |= add_to_showcmd(s->c);
- }
-
- // If we got CTRL-W there may be a/another count
- if (s->c == Ctrl_W && !ctrl_w && s->oa.op_type == OP_NOP) {
- ctrl_w = true;
- s->ca.opcount = s->ca.count0; // remember first count
- s->ca.count0 = 0;
- ++no_mapping;
- ++allow_keys; // no mapping for nchar, but keys
- s->c = plain_vgetc(); // get next character
- LANGMAP_ADJUST(s->c, true);
- --no_mapping;
- --allow_keys;
- s->need_flushbuf |= add_to_showcmd(s->c);
- goto getcount; // jump back
- }
- }
+ while (normal_get_command_count(s)) continue;
if (s->c == K_EVENT) {
// Save the count values so that ca.opcount and ca.count0 are exactly
@@ -874,7 +882,7 @@ getcount:
// Find the command character in the table of commands.
// For CTRL-W we already got nchar when looking for a count.
- if (ctrl_w) {
+ if (s->ctrl_w) {
s->ca.nchar = s->c;
s->ca.cmdchar = Ctrl_W;
} else {