aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-10-27 00:33:53 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-10-27 00:33:53 +0200
commit8a85e071fdaa7448e6ec595bcbeba633e7a95af6 (patch)
tree80ab2c25bb68e7559dc52b317f36b47708c49cf8 /vis.c
parentd4f852269246b07479aa2bbd8db8798509394f99 (diff)
downloadvis-8a85e071fdaa7448e6ec595bcbeba633e7a95af6.tar.gz
vis-8a85e071fdaa7448e6ec595bcbeba633e7a95af6.tar.xz
vis: apply language map only to key values not modifiers
The language map translation should not take modifiers into account. For example if `a` is mapped to `b` then `<M-a>` should also be mapped to `<M-b>`. Fix #404
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/vis.c b/vis.c
index 085681e..25f7840 100644
--- a/vis.c
+++ b/vis.c
@@ -864,20 +864,26 @@ static void vis_keys_push(Vis *vis, const char *input, size_t pos, bool record)
}
static const char *getkey(Vis *vis) {
- const char *key = vis->ui->getkey(vis->ui);
- if (!key)
+ TermKeyKey key = { 0 };
+ if (!vis->ui->getkey(vis->ui, &key))
return NULL;
vis_info_hide(vis);
bool use_keymap = vis->mode->id != VIS_MODE_INSERT &&
vis->mode->id != VIS_MODE_REPLACE &&
!vis->keymap_disabled;
vis->keymap_disabled = false;
- if (use_keymap) {
- const char *mapped = map_get(vis->keymap, key);
- if (mapped)
- return mapped;
+ if (key.type == TERMKEY_TYPE_UNICODE && use_keymap) {
+ const char *mapped = map_get(vis->keymap, key.utf8);
+ if (mapped) {
+ size_t len = strlen(mapped);
+ if (len < sizeof(key.utf8))
+ memcpy(key.utf8, mapped, len);
+ }
}
- return key;
+
+ TermKey *termkey = vis->ui->termkey_get(vis->ui);
+ termkey_strfkey(termkey, vis->key, sizeof(vis->key), &key, TERMKEY_FORMAT_VIM);
+ return vis->key;
}
bool vis_signal_handler(Vis *vis, int signum, const siginfo_t *siginfo, const void *context) {