[Feature Request] holding key down for second keybind 'layer'
It would be nice, to have two keybinds: one as default (with c-tap and n, e, s, w etc swipes), but if you hold down one key, it changes to the second layer, where you'd have another whole bind-setup (with c-tap and n, e, s, w etc swipes).
For example: i'd like to have the a-key to c-tap "a", n-swipe (Fast Capitalization) "A", but if i hold down the a, the c-tap (acutally release after the long press) would result in an "ä", or after the hold down, the n-swipe (Fast Capitalization) "Ä". When the key is released it should return to the default keybinds. That is just one particular example, for my usecase, but it could also be nice, for something like different punctuation characters, (almost) all on one key. Could just be something like c2-tap (the release after the key-hold) or n2, e2, s2, w2 etc swipes for the custom config (xml file).
Of course this would only work, if holding down does not the repeated key-input (on hold) is deactivated.
This was discussed recently by @manieKMP in https://github.com/Julow/Unexpected-Keyboard/issues/886#issuecomment-2706109939
Not having long presses is a fundamental design decision of the app. A long press is slow and breaks the flow of typing. It's also hard to explore as no one is spending a couple seconds on every keys just to see the possibilities. If someone implemented this, I would not oppose merging but I do not recommend spending time on making typing slower.
What do you think of "layer" like modifier keys like Fn ?
Oh, sorry, did not find this (already searched the issues)
I see - makes sense. Although i'd argue that speed is also highly affected with the accuracy on keystrokes ;P So in this case, you could decrease the keynumber in a row -> increase keysize -> increase accuracy = speed. (also the placement, not too close to the edge could improve the accuracy = speed) The example (for german) would be a keyboard (as on PC)
With 11 keys in the qwertz- and 11 key in the asdf-row, instead of 10 and 9 for the usual mobile keyboard
https://www.youtube.com/shorts/Z9mmvc6mIJA This is the shortest key-hold-time (about 180ms), that i can setup for my current keyboard - i would even prefer a shorter time, like 100ms (would have to test it)
(just commenting my pro-thoughts for a keyhold - not trying to force this idea ;P)
And the "layer" via Fn could be a nice tradeoff, but (with typing speed in mind, as main the main target) i guess two keystrokes (or even three, if you'd have to press Fn again, to return to layer1) are not faster, than a short key hold :D
Thanks for the pictures and the video. Reducing the number of columns is achieve by adding swipes. The "QWERTZ" layout is 10 columns wide. Can you try using the "QWERTZ" layout and see whether it's better for you ?
Yeah, i totally see your point - was just asking, especially for deeper customization oncustom layouts, which i already use. Thanks though!
there is another way to think of this than speed vs accuracy. I've been using a split layout on a tablet, in this case it becomes uncomfortable and takes time when selecting numbers for example with having to move the thumb from the home row.
In an ideal world I would like to be able to configure a layer on such a way that if I keep the key pressed then all the keys on the left cluster change to a specific set of keys. And then on release goes back to normal or base layer...
Does this make sense?
Is it possible to achieve this at the moment?
I'm not an android dev but happy to dig into this... If you could point on the rite direction I'll hopefully get a pr done...
personally I achieved this for my keyboard by just getting creative with the modmap on fn / shift keys - layout is a work in progress but feel free to check this out - 5 rows and columns, number/symbol/F1-12 layer based on Fn key primarily.
in the future i will have right/left/split variants with 3 columns each since it's symmetrical
<keyboard bottom_row="false" name="Dom's Symmetrical Layout" script="latin">
<row height="0.75">
<key width="1.0" c="i" nw="(" ne="[" sw="<" se="f" anticircle="1"/>
<key width="1.0" c="a" nw="v" ne="=" sw="{" se="p" anticircle="2"/>
<key width="1.7" c="r" nw="config" ne="switch_clipboard" w="undo:ctrl,z" e="redo:ctrl,y" n=":keyevent symbol='â¯' flags='small':85" s="b" anticircle="3"/>
<key width="1.0" c="a" nw="=" ne="v" sw="p" se="{" anticircle="2"/>
<key width="1.0" c="i" nw="[" ne="(" sw="f" se="<" anticircle="1"/>
</row>
<row height="0.8">
<key width="1.0" c="n" sw="@" nw="m" se="L:l" anticircle="4"/>
<key width="0.9" c="h" nw="w" ne="/" sw="*" se="y" anticircle="5"/>
<key width="1.9" c="o" nw="g" ne="g" sw="" se="" s="-" anticircle="6"/>
<key width="0.9" c="h" nw="/" ne="w" sw="y" se="*" anticircle="5"/>
<key width="1.0" c="n" se="@" ne="m" sw="L:l" anticircle="4"/>
</row>
<row height="0.9">
<key c="s" nw="q" ne="j" sw="'" se="k" anticircle="7"/>
<key width="1.05" c="e" nw="c" ne="x" sw="z" se="d" anticircle="8"/>
<key width="1.6" c="t" nw="u" ne="u" s="." w="voice_typing" e="switch_emoji" sw="" se="" anticircle="9"/>
<key width="1.05" c="e" nw="x" ne="c" sw="d" se="z" anticircle="8"/>
<key c="s" nw="j" ne="q" sw="k" se="'" anticircle="7"/>
</row>
<row height="0.85">
<key width="1.4" c="shift" e="alt" nw="loc change_method" n="cursor_up" s="cursor_down"/>
<key width="0.95" c="space" nw=";" ne="paste:ctrl,v" sw="copy:ctrl,c" se="\?"/>
<key width="1.0" c=" " n="," s="!" w="tab" e="tab" anticircle="0"/>
<key width="0.95" c="space" nw="paste:ctrl,v" ne=";" sw="\?" se="copy:ctrl,c"/>
<key width="1.4" c="shift" w="alt" n="cursor_up" s="cursor_down" ne="loc change_method"/>
</row>
<row height="0.75">
<key width="1.1" c="fn" c="backspace" e="delete" n="cut:ctrl,x" s="esc"/>
<key width="0.9" c="ctrl" w="cursor_left" e="cursor_right" s="meta" n="<---->:ctrl,a,selectAll"/>
<key width="1.7" c="fn" n="enter" w="cursor_left" e="cursor_right"/>
<key width="0.9" c="ctrl" w="cursor_left" e="cursor_right" s="meta" n="<---->:ctrl,a,selectAll"/>
<key width="1.1" c="fn" c="backspace" e="delete" n="cut:ctrl,x" s="esc"/>
</row>
<!-- Modifiers -->
<modmap>
<!-- Brackets -->
<fn a="(" b=")"/>
<fn a="{" b="}"/>
<fn a="[" b="]"/>
<fn a="<" b=">"/>
<shift a="(" b=")"/>
<shift a="{" b="}"/>
<shift a="[" b="]"/>
<shift a="<" b=">"/>
<!-- Punctuation -->
<!--
<fn a="[ . ]:., " b="."/>
<fn a="[ , ]:\,, " b=","/>
<fn a="[ ? ]:\?, " b="\?"/>
<fn a="[ ! ]:!, " b="!"/>
-->
<fn a=";" b=";"/>
<fn a=":" b=":"/>
<shift a=";" b=":"/>
<fn a="'" b="`"/>
<shift a="'" b="""/>
<fn a=""" b="""/>
<fn a="w" b="\\"/>
<shift a="-" b="_"/>
<shift a="=" b="+"/>
<fn a="q" b="|"/>
<fn a="k" b="&"/>
<fn a="L:l" b="\#"/>
<fn a="voice_typing" b="f11"/>
<fn a="switch_emoji" b="f12"/>
<fn b="f11" a="f11_placeholder"/>
<fn b="f12" a="f12_placeholder"/>
<!-- numbers -->
<fn a="i" b="1"/>
<fn a="a" b="2"/>
<fn a="r" b="3"/>
<fn a="n" b="4"/>
<fn a="h" b="5"/>
<fn a="o" b="6"/>
<fn a="s" b="7"/>
<fn a="e" b="8"/>
<fn a="t" b="9"/>
<fn a=" " b="0"/>
<fn a="fn" b="fn"/>
<!-- fn defaults substitution -->
<fn a="=" b="="/>
<!-- <fn a="g" b="≈"/>-->
<fn a="u" b=""/>
<fn a="g" b=""/>
<fn a="g" b=""/>
<fn a="v" b=""/>
<fn a="p" b=""/>
<fn a="j" b=""/>
<fn a="c" b=""/>
<fn a="m" b="$"/>
<fn a="b" b=""/>
<fn a="z" b=""/>
<fn a="config" b=""/>
<fn a="switch_clipboard" b=""/>
<fn a="space" b="space"/>
<fn a="?"b="?"/>
<fn a="!"b="!"/>
<fn a="*" b="*"/>
<fn a="d" b="°"/>
<fn a="-" b="-"/>
<!--<fn a="j" b="–"/>-->
<fn a="_" b="_"/>
<!-- <fn a="q" b="—"/>-->
<fn a="z" b="z"/>
<!--<fn a="b" b="â‚¿"/>-->
<fn a="f" b="~"/>
<fn a="y" b="^"/>
<fn a="." b="."/>
<fn a="," b=","/>
<!-- function key substitution -->
<shift a="1" b="f1"/>
<shift a="2" b="f2"/>
<shift a="3" b="f3"/>
<shift a="4" b="f4"/>
<shift a="5" b="f5"/>
<shift a="6" b="f6"/>
<shift a="7" b="f7"/>
<shift a="8" b="f8"/>
<shift a="9" b="f9"/>
<shift a="0" b="f10"/>
</modmap>
</keyboard>