Skip to content

Commit

Permalink
use 16-bit codes in vim_send
Browse files Browse the repository at this point in the history
  • Loading branch information
juliekoubova committed Jun 29, 2024
1 parent 05c1884 commit 80544f8
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 73 deletions.
12 changes: 7 additions & 5 deletions keyboards/keychron/q4/ansi/keymaps/juliekoubova/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {

#endif

void keyboard_post_init_user(void) {
#ifdef VIM_DEBUG
debug_enable = true;
#endif
}


bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return process_record_vim(keycode, record, QK_VIM);
}
Expand All @@ -124,9 +131,4 @@ void housekeeping_task_user() {
vim_task();
}

#ifdef VIM_DEBUG
void keyboard_post_init_user(void) {
debug_enable = true;
}
#endif

126 changes: 67 additions & 59 deletions users/juliekoubova/vim/perform_action.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@
#include "vim_send.h"
#include <stdbool.h>

static uint8_t command_mods = MOD_LCTL;
static uint8_t word_mods = MOD_LCTL;
static uint16_t command_mods = QK_LCTL;
static uint16_t word_mods = QK_LCTL;
static uint8_t line_mods = 0;
static uint16_t document_mods = QK_LCTL;

static uint8_t document_mods = MOD_LCTL;
static uint8_t document_start = KC_HOME;
static uint8_t document_end = KC_END;

static uint8_t line_mods = 0;
static uint8_t line_start = KC_HOME;
static uint8_t line_end = KC_END;

Expand All @@ -49,8 +49,8 @@ static vline_t vline = VLINE_DOWN_ASSUMED;
static void vim_vline_start(vline_t direction) {
uint8_t first = direction == VLINE_UP ? line_end : line_start;
uint8_t second = direction == VLINE_UP ? line_start : line_end;
vim_send(line_mods, first, VIM_SEND_TAP);
vim_send(MOD_LSFT | line_mods, second, VIM_SEND_TAP);
vim_send(line_mods | first, VIM_SEND_TAP);
vim_send(QK_LSFT | line_mods | second, VIM_SEND_TAP);
vline = direction;
}

Expand All @@ -61,122 +61,118 @@ void vim_vline_entered(void) {

void vim_set_apple(bool apple) {
VIM_DPRINTF("apple=%d\n", apple);
command_mods = apple ? MOD_LGUI : MOD_LCTL;
word_mods = apple ? MOD_LALT : MOD_LCTL;
command_mods = apple ? QK_LGUI : QK_LCTL;
word_mods = apple ? QK_LALT : QK_LCTL;

document_mods = apple ? MOD_LGUI : MOD_LCTL;
document_mods = apple ? QK_LGUI : QK_LCTL;
document_start = apple ? KC_UP : KC_HOME;
document_end = apple ? KC_DOWN : KC_END;

line_mods = apple ? MOD_LGUI : 0;
line_mods = apple ? QK_LGUI : 0;
line_start = apple ? KC_LEFT : KC_HOME;
line_end = apple ? KC_RIGHT : KC_END;
}

static void vim_send_repeated(int8_t repeat, uint8_t mods, uint16_t keycode, vim_send_type_t type) {
static void vim_send_repeated_multi(int8_t repeat, const uint16_t* code16s, uint8_t code16_count) {
while (repeat > 0) {
for (int i = 0; i < code16_count; i++) {
vim_send(code16s[i], VIM_SEND_TAP);
}
repeat--;
}
}

static void vim_send_repeated(int8_t repeat, uint16_t code16, vim_send_type_t type) {
if (type == VIM_SEND_RELEASE) {
vim_send(mods, keycode, type);
vim_send(code16, type);
return;
}
while (repeat > 1) {
vim_send(mods, keycode, VIM_SEND_TAP);
vim_send(code16, VIM_SEND_TAP);
repeat--;
}
vim_send(mods, keycode, type);
vim_send(code16, type);
}

void vim_perform_action(vim_action_t action, vim_send_type_t type) {
vim_pending_t pending = vim_clear_pending();
switch (action & VIM_MASK_ACTION) {
case VIM_ACTION_PASTE:
vim_send_repeated(pending.repeat, command_mods, KC_V, type);
vim_send_repeated(pending.repeat, command_mods | KC_V, type);
return;
case VIM_ACTION_UNDO:
vim_send_repeated(pending.repeat, command_mods, KC_Z, type);
vim_send_repeated(pending.repeat, command_mods | KC_Z, type);
return;
case VIM_ACTION_OPEN_LINE_DOWN:
vim_send(line_mods, line_end, VIM_SEND_TAP);
vim_send(0, KC_ENTER, VIM_SEND_TAP);
vim_send(line_mods | line_end, VIM_SEND_TAP);
vim_send(KC_ENTER, VIM_SEND_TAP);
vim_enter_insert_mode();
return;
case VIM_ACTION_OPEN_LINE_UP:
vim_send(line_mods, line_start, VIM_SEND_TAP);
vim_send(0, KC_ENTER, VIM_SEND_TAP);
vim_send(0, KC_UP, VIM_SEND_TAP);
vim_send(line_mods | line_start, VIM_SEND_TAP);
vim_send(KC_ENTER, VIM_SEND_TAP);
vim_send(KC_UP, VIM_SEND_TAP);
vim_enter_insert_mode();
return;
case VIM_ACTION_JOIN_LINE:
vim_send(line_mods, line_end, VIM_SEND_TAP);
vim_send(0, KC_DEL, VIM_SEND_TAP);
vim_send(line_mods | line_end, VIM_SEND_TAP);
vim_send(KC_DEL, VIM_SEND_TAP);
return;
case VIM_ACTION_LINE:
vim_send(line_mods, line_start, VIM_SEND_TAP);
type = VIM_SEND_TAP;
action &= ~VIM_MASK_ACTION;
action |= VIM_ACTION_LINE_END;
break;
default:
break;
}

uint16_t keycode = KC_NO;
uint8_t mods = 0;
uint16_t code16 = KC_NO;
vline_t next_vline = VLINE_DOWN_ASSUMED;

if (action == (VIM_MOD_DELETE | VIM_ACTION_LEFT)) {
keycode = KC_BSPC;
code16 = KC_BSPC;
action &= ~VIM_MOD_DELETE;
} else if (action == (VIM_MOD_DELETE | VIM_ACTION_RIGHT)) {
keycode = KC_DEL;
code16 = KC_DEL;
action &= ~VIM_MOD_DELETE;
} else {
switch (action & VIM_MASK_ACTION) {
case VIM_ACTION_LEFT:
keycode = KC_LEFT;
code16 = KC_LEFT;
break;
case VIM_ACTION_DOWN:
keycode = KC_DOWN;
code16 = KC_DOWN;
next_vline = VLINE_DOWN;
break;
case VIM_ACTION_UP:
keycode = KC_UP;
code16 = KC_UP;
next_vline = VLINE_UP;
break;
case VIM_ACTION_RIGHT:
keycode = KC_RIGHT;
code16 = KC_RIGHT;
break;
case VIM_ACTION_LINE_START:
keycode = line_start;
mods = line_mods;
code16 = line_mods | line_start;
break;
case VIM_ACTION_LINE_END:
keycode = line_end;
mods = line_mods;
code16 = line_mods | line_end;
break;
case VIM_ACTION_WORD_START:
keycode = KC_LEFT;
mods = word_mods;
code16 = word_mods | KC_LEFT;
break;
case VIM_ACTION_WORD_END:
keycode = KC_RIGHT;
mods = word_mods;
code16 = word_mods | KC_RIGHT;
break;
case VIM_ACTION_DOCUMENT_START:
keycode = document_start;
mods = document_mods;
code16 = document_mods | document_start;
next_vline = VLINE_UP;
break;
case VIM_ACTION_DOCUMENT_END:
keycode = document_end;
mods = document_mods;
code16 = document_mods | document_end;
next_vline = VLINE_DOWN;
break;
case VIM_ACTION_PAGE_UP:
keycode = KC_PAGE_UP;
code16 = KC_PAGE_UP;
next_vline = VLINE_UP;
break;
case VIM_ACTION_PAGE_DOWN:
keycode = KC_PAGE_DOWN;
code16 = KC_PAGE_DOWN;
next_vline = VLINE_DOWN;
break;
default:
Expand All @@ -202,12 +198,12 @@ void vim_perform_action(vim_action_t action, vim_send_type_t type) {
}

if (action & (VIM_MOD_DELETE | VIM_MOD_YANK)) {
mods |= MOD_LSFT;
code16 |= QK_LSFT;
type = VIM_SEND_TAP;
}

if (action & VIM_MOD_SELECT) {
mods |= MOD_LSFT;
code16 |= QK_LSFT;
}

if (vim_get_mode() == VIM_MODE_VLINE) {
Expand All @@ -221,27 +217,39 @@ void vim_perform_action(vim_action_t action, vim_send_type_t type) {
}
}

if (keycode != KC_NO) {
if ((action & VIM_MASK_ACTION) == VIM_ACTION_LINE) {
type = VIM_SEND_TAP;
vim_send(line_mods | line_start, type);
vim_send(QK_LSFT | line_mods | line_end, type);
vim_send(QK_LSFT | KC_RIGHT, type);
if (pending.repeat > 1) {
const uint16_t end_left[] = {QK_LSFT | KC_DOWN, QK_LSFT | line_mods | line_end};
vim_send_repeated_multi(pending.repeat - 1, end_left, 2);
pending.repeat = 0;
}
}

if (code16 != KC_NO) {
// keycode is KC_NO in visual mode, where the object is the visual
// selection; send shifted action as a tap
vim_send_repeated(pending.repeat, mods, keycode, type);
vim_send_repeated(pending.repeat, code16, type);
}

if (vim_get_mode() == VIM_MODE_VLINE) {
// select the full line after we release the up/down key, or after a tap
if (type == VIM_SEND_RELEASE || type == VIM_SEND_TAP) {
if (vline == VLINE_UP) {
vim_send(MOD_LSFT | line_mods, line_start, VIM_SEND_TAP);
vim_send(QK_LSFT | line_mods | line_start, VIM_SEND_TAP);
} else if (vline == VLINE_DOWN) {
vim_send(MOD_LSFT | line_mods, line_end, VIM_SEND_TAP);
vim_send(QK_LSFT | line_mods | line_end, VIM_SEND_TAP);
}
}
}

if (action & VIM_MOD_DELETE) {
vim_send(command_mods, KC_X, VIM_SEND_TAP);
vim_send(command_mods | KC_X, VIM_SEND_TAP);
} else if (action & VIM_MOD_YANK) {
vim_send(command_mods, KC_C, VIM_SEND_TAP);
vim_send(command_mods | KC_C, VIM_SEND_TAP);
}

VIM_DPRINTF("vim_perform_action %x\n", action);
Expand Down
10 changes: 5 additions & 5 deletions users/juliekoubova/vim/statemachine.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,11 @@ static const vim_statemachine_t vsm_visual[VSM_SIZE] = {

static const vim_statemachine_t vsm_visual_shift[VSM_SIZE] = {
// clang-format off
VSM(KC_C, VIM_ACTION_LINE | VIM_MOD_DELETE | VIM_ENTER_INSERT),
VSM(KC_D, VIM_ACTION_LINE | VIM_MOD_DELETE | VIM_ENTER_COMMAND),
VSM(KC_V, VIM_ACTION_LINE | VIM_MOD_SELECT | VIM_ENTER_VLINE),
VSM(KC_X, VIM_ACTION_LINE | VIM_MOD_DELETE | VIM_ENTER_COMMAND),
VSM(KC_Y, VIM_ACTION_LINE | VIM_MOD_YANK | VIM_ENTER_COMMAND),
VSM(KC_C, VIM_ACTION_SELECTION | VIM_MOD_DELETE | VIM_ENTER_INSERT),
VSM(KC_D, VIM_ACTION_SELECTION | VIM_MOD_DELETE | VIM_ENTER_COMMAND),
VSM(KC_V, VIM_ACTION_SELECTION | VIM_MOD_SELECT | VIM_ENTER_VLINE),
VSM(KC_X, VIM_ACTION_SELECTION | VIM_MOD_DELETE | VIM_ENTER_COMMAND),
VSM(KC_Y, VIM_ACTION_SELECTION | VIM_MOD_YANK | VIM_ENTER_COMMAND),
VSM(KC_4, VIM_ACTION_LINE_END | VIM_MOD_SELECT),
VSM(KC_6, VIM_ACTION_LINE_START | VIM_MOD_SELECT),
VSM(KC_ESCAPE, VIM_ENTER_COMMAND),
Expand Down
2 changes: 1 addition & 1 deletion users/juliekoubova/vim/vim_mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ static vim_key_state_t vim_key_state = VIM_KEY_NONE;
static uint8_t vim_mods = 0; // we modify the actual mods so we can't rely on them

static void vim_cancel_os_selection(void) {
vim_send(0, KC_LEFT, VIM_SEND_TAP);
vim_send(KC_LEFT, VIM_SEND_TAP);
}

static void vim_set_mode(vim_mode_t mode) {
Expand Down
5 changes: 4 additions & 1 deletion users/juliekoubova/vim/vim_send.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@

#define VIM_TAP_DELAY 30

void vim_send(uint8_t mods, uint16_t keycode, vim_send_type_t type) {
void vim_send(uint16_t code16, vim_send_type_t type) {
uint8_t mods = QK_MODS_GET_MODS(code16);
uint8_t keycode = QK_MODS_GET_BASIC_KEYCODE(code16);

if (mods && (type == VIM_SEND_PRESS || type == VIM_SEND_TAP)) {
VIM_DPRINTF("register mods=%x\n", mods);
register_mods(mods);
Expand Down
3 changes: 1 addition & 2 deletions users/juliekoubova/vim/vim_send.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,4 @@ typedef enum {
VIM_SEND_RELEASE,
} vim_send_type_t;

void vim_send(uint8_t mods, uint16_t keycode, vim_send_type_t type);

void vim_send(uint16_t keycode, vim_send_type_t);

0 comments on commit 80544f8

Please sign in to comment.