diff options
| author | Stephen Blott | 2016-10-09 15:20:15 +0100 |
|---|---|---|
| committer | Stephen Blott | 2016-10-09 15:20:15 +0100 |
| commit | 6596e30392a1ca053223825eda5cde060394a4aa (patch) | |
| tree | d4320196e034dfa848852a2fe0762a0616d1a225 | |
| parent | 801dd4ea5edfff8b22c3c8c875808ee33e96571e (diff) | |
| download | vimium-6596e30392a1ca053223825eda5cde060394a4aa.tar.bz2 | |
Add translate command for key mappings.
Under *Custom key mappings* (on the options page), this implements:
translate x y
Whenever the users types `x` in normal mode or in visual mode, the `x`
is replaced by `y`.
For example:
map รง l
(which apparently would be helpful on Brazilian keyboards).
Issues:
- Do we want yet another hack like this? This would be documented only on
the wiki.
- If we allowed `translate <c-c> <c-[>` (and extended `isEscape()` to
use the translation), then we'd get the `exitMode` command for free
(#2253).
- Alternatively, instead of adding a new "command" called `translate`,
we could overload the existing `map` command. Since these are
single-key mappings, there's no ambiguity. (Although, I guess there's
a risk some user has junk in their key mappings and would be taken by
surprise).
Inspired by isssue posted by @vhoyer (#2305).
Fixes #2305.
| -rw-r--r-- | background_scripts/commands.coffee | 8 | ||||
| -rw-r--r-- | content_scripts/mode_key_handler.coffee | 9 |
2 files changed, 17 insertions, 0 deletions
diff --git a/background_scripts/commands.coffee b/background_scripts/commands.coffee index 7a4526c2..17c05f90 100644 --- a/background_scripts/commands.coffee +++ b/background_scripts/commands.coffee @@ -9,6 +9,7 @@ Commands = @clearKeyMappingsAndSetDefaults() @parseCustomKeyMappings customKeyMappings @generateKeyStateMapping() + chrome.storage.local.set keyTranslationRegistry: @keyTranslationRegistry availableCommands: {} keyToCommandRegistry: {} @@ -84,6 +85,12 @@ Commands = when "unmapAll" @keyToCommandRegistry = {} + when "translate" + if tokens.length == 3 + fromChar = @parseKeySequence tokens[1] + toChar = @parseKeySequence tokens[2] + @keyTranslationRegistry[fromChar[0]] = toChar[0] if fromChar.length == toChar.length == 1 + # Push the key mapping for passNextKey into Settings so that it's available in the front end for insert # mode. We exclude single-key mappings (that is, printable keys) because when users press printable keys # in insert mode they expect the character to be input, not to be droppped into some special Vimium @@ -109,6 +116,7 @@ Commands = clearKeyMappingsAndSetDefaults: -> @keyToCommandRegistry = {} + @keyTranslationRegistry = {} for own key, command of defaultKeyMappings keySequence = @parseKeySequence key key = keySequence.join "" diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 8c0ae4b8..7904d801 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -33,8 +33,16 @@ class KeyHandlerMode extends Mode # We cannot track keyup events if we lose the focus. blur: (event) => @alwaysContinueBubbling => @keydownEvents = {} if event.target == window + @keyTranslationRegistry = {} + chrome.storage.local.get "keyTranslationRegistry", (obj) => + @keyTranslationRegistry = obj.keyTranslationRegistry + chrome.storage.onChanged.addListener (changes, area) => + if area == "local" and changes.keyTranslationRegistry?.newValue? + @keyTranslationRegistry = changes.keyTranslationRegistry.newValue + onKeydown: (event) -> keyChar = KeyboardUtils.getKeyCharString event + keyChar = @keyTranslationRegistry[keyChar] ? keyChar isEscape = KeyboardUtils.isEscape event if isEscape and (@countPrefix != 0 or @keyState.length != 1) @keydownEvents[event.keyCode] = true @@ -61,6 +69,7 @@ class KeyHandlerMode extends Mode onKeypress: (event) -> keyChar = KeyboardUtils.getKeyCharString event + keyChar = @keyTranslationRegistry[keyChar] ? keyChar if @isMappedKey keyChar @handleKeyChar keyChar else if @isCountKey keyChar |
