Colemak is a modern alternative to the QWERTY and Dvorak layouts, designed for efficient and ergonomic touch typing in English. Signed-off-by: Nikita Romanyuk <ufh8945@gmail.com> --- Doc/Zsh/options.yo | 8 ++++++++ Src/options.c | 1 + Src/utils.c | 14 ++++++++++++++ Src/zsh.h | 3 ++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo index 443676b..cda4b33 100644 --- a/Doc/Zsh/options.yo +++ b/Doc/Zsh/options.yo @@ -1235,6 +1235,14 @@ Use the Dvorak keyboard instead of the standard qwerty keyboard as a basis for examining spelling mistakes for the tt(CORRECT) and tt(CORRECT_ALL) options and the tt(spell-word) editor command. ) +pindex(COLEMAK) +pindex(NO_COLEMAK) +pindex(NOCOLEMAK) +item(tt(COLEMAK))( +Use the Colemak keyboard instead of the standard qwerty keyboard as a basis +for examining spelling mistakes for the tt(CORRECT) and tt(CORRECT_ALL) +options and the tt(spell-word) editor command. +) pindex(FLOW_CONTROL) pindex(NO_FLOW_CONTROL) pindex(FLOWCONTROL) diff --git a/Src/options.c b/Src/options.c index a1fe918..8f9fe85 100644 --- a/Src/options.c +++ b/Src/options.c @@ -280,6 +280,7 @@ static struct optname optns[] = { {{NULL, "stdin", OPT_ALIAS}, /* ksh */ SHINSTDIN}, {{NULL, "trackall", OPT_ALIAS}, /* ksh */ HASHCMDS}, {{NULL, "dvorak", 0}, DVORAK}, +{{NULL, "colemak", 0}, COLEMAK}, {{NULL, NULL, 0}, 0} }; diff --git a/Src/utils.c b/Src/utils.c index 62bd3e6..b3d09d7 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -4607,10 +4607,24 @@ spdist(char *s, char *t, int thresh) \t\"<>PYFGCRL?+\t\ \tAOEUIDHTNS_\n\t\ \t:QJKXBMWVZ\n\n\t\ +\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; + const char colemakkeymap[] = + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ +\t1234567890-=\t\ +\tqwfpgjluy;[]\t\ +\tarstdhneio'\n\t\ +\tzxcvbkm,./\t\t\t\ +\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ +\t!@#$%^&*()_+\t\ +\tQWFPGJLUY:{}\t\ +\tARSTDHNEIO\"\n\t\ +\tZXCVBKM<>?\n\n\t\ \n\n\n\n\n\n\n\n\n\n\n\n\n\n"; const char *keymap; if ( isset( DVORAK ) ) keymap = dvorakkeymap; + else if ( isset( COLEMAK ) ) + keymap = colemakkeymap; else keymap = qwertykeymap; diff --git a/Src/zsh.h b/Src/zsh.h index 40f9ea5..93f3c8c 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -2547,7 +2547,8 @@ enum { XTRACE, USEZLE, DVORAK, - OPT_SIZE + OPT_SIZE, + COLEMAK }; /* -- 2.39.2
On 3/9/23, Nikita Romanyuk <ufh8945@gmail.com> wrote: > Colemak is a modern alternative to the QWERTY and Dvorak layouts, > designed for efficient and ergonomic touch typing in English. It would be nice to not introduce another weird tri-state thing here, eg what should happen when both dvorak and colemak are set, why is qwerty not a named option, etc. Perhaps it would be nicer to just let the user set the layout in some special (namespaced?) parameter for scalability and deprecate the dvorak option. We could have some helper function in the distribution that sets this parameter for various known layouts. > Signed-off-by: Nikita Romanyuk <ufh8945@gmail.com> > --- > Doc/Zsh/options.yo | 8 ++++++++ > Src/options.c | 1 + > Src/utils.c | 14 ++++++++++++++ > Src/zsh.h | 3 ++- > 4 files changed, 25 insertions(+), 1 deletion(-) > > diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo > index 443676b..cda4b33 100644 > --- a/Doc/Zsh/options.yo > +++ b/Doc/Zsh/options.yo > @@ -1235,6 +1235,14 @@ Use the Dvorak keyboard instead of the standard > qwerty keyboard as a basis > for examining spelling mistakes for the tt(CORRECT) and tt(CORRECT_ALL) > options and the tt(spell-word) editor command. > ) > +pindex(COLEMAK) > +pindex(NO_COLEMAK) > +pindex(NOCOLEMAK) > +item(tt(COLEMAK))( > +Use the Colemak keyboard instead of the standard qwerty keyboard as a > basis > +for examining spelling mistakes for the tt(CORRECT) and tt(CORRECT_ALL) > +options and the tt(spell-word) editor command. > +) > pindex(FLOW_CONTROL) > pindex(NO_FLOW_CONTROL) > pindex(FLOWCONTROL) > diff --git a/Src/options.c b/Src/options.c > index a1fe918..8f9fe85 100644 > --- a/Src/options.c > +++ b/Src/options.c > @@ -280,6 +280,7 @@ static struct optname optns[] = { > {{NULL, "stdin", OPT_ALIAS}, /* ksh */ SHINSTDIN}, > {{NULL, "trackall", OPT_ALIAS}, /* ksh */ HASHCMDS}, > {{NULL, "dvorak", 0}, DVORAK}, > +{{NULL, "colemak", 0}, COLEMAK}, > {{NULL, NULL, 0}, 0} > }; > > diff --git a/Src/utils.c b/Src/utils.c > index 62bd3e6..b3d09d7 100644 > --- a/Src/utils.c > +++ b/Src/utils.c > @@ -4607,10 +4607,24 @@ spdist(char *s, char *t, int thresh) > \t\"<>PYFGCRL?+\t\ > \tAOEUIDHTNS_\n\t\ > \t:QJKXBMWVZ\n\n\t\ > +\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; > + const char colemakkeymap[] = > + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ > +\t1234567890-=\t\ > +\tqwfpgjluy;[]\t\ > +\tarstdhneio'\n\t\ > +\tzxcvbkm,./\t\t\t\ > +\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ > +\t!@#$%^&*()_+\t\ > +\tQWFPGJLUY:{}\t\ > +\tARSTDHNEIO\"\n\t\ > +\tZXCVBKM<>?\n\n\t\ > \n\n\n\n\n\n\n\n\n\n\n\n\n\n"; > const char *keymap; > if ( isset( DVORAK ) ) > keymap = dvorakkeymap; > + else if ( isset( COLEMAK ) ) > + keymap = colemakkeymap; > else > keymap = qwertykeymap; > > diff --git a/Src/zsh.h b/Src/zsh.h > index 40f9ea5..93f3c8c 100644 > --- a/Src/zsh.h > +++ b/Src/zsh.h > @@ -2547,7 +2547,8 @@ enum { > XTRACE, > USEZLE, > DVORAK, > - OPT_SIZE > + OPT_SIZE, > + COLEMAK OPT_SIZE should always go last in this list. > }; > > /* > -- > 2.39.2 > > > -- Mikael Magnusson
If I understood correctly, we shouldn't use setopt for changing keyboard layouts because it's not expandable. Better, there should be a separate builtin function. How should it be called? "setlayout"? "setkblayout"? Thanks, I didn't put any brain activity into this enum. > OPT_SIZE should always go last in this list. I'm going to send another patch later, but with these options as builtins. On 3/10/23 06:37, Mikael Magnusson wrote: > On 3/9/23, Nikita Romanyuk <ufh8945@gmail.com> wrote: >> Colemak is a modern alternative to the QWERTY and Dvorak layouts, >> designed for efficient and ergonomic touch typing in English. > It would be nice to not introduce another weird tri-state thing here, > eg what should happen when both dvorak and colemak are set, why is > qwerty not a named option, etc. Perhaps it would be nicer to just let > the user set the layout in some special (namespaced?) parameter for > scalability and deprecate the dvorak option. We could have some helper > function in the distribution that sets this parameter for various > known layouts. > >> Signed-off-by: Nikita Romanyuk <ufh8945@gmail.com> >> --- >> Doc/Zsh/options.yo | 8 ++++++++ >> Src/options.c | 1 + >> Src/utils.c | 14 ++++++++++++++ >> Src/zsh.h | 3 ++- >> 4 files changed, 25 insertions(+), 1 deletion(-) >> >> diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo >> index 443676b..cda4b33 100644 >> --- a/Doc/Zsh/options.yo >> +++ b/Doc/Zsh/options.yo >> @@ -1235,6 +1235,14 @@ Use the Dvorak keyboard instead of the standard >> qwerty keyboard as a basis >> for examining spelling mistakes for the tt(CORRECT) and tt(CORRECT_ALL) >> options and the tt(spell-word) editor command. >> ) >> +pindex(COLEMAK) >> +pindex(NO_COLEMAK) >> +pindex(NOCOLEMAK) >> +item(tt(COLEMAK))( >> +Use the Colemak keyboard instead of the standard qwerty keyboard as a >> basis >> +for examining spelling mistakes for the tt(CORRECT) and tt(CORRECT_ALL) >> +options and the tt(spell-word) editor command. >> +) >> pindex(FLOW_CONTROL) >> pindex(NO_FLOW_CONTROL) >> pindex(FLOWCONTROL) >> diff --git a/Src/options.c b/Src/options.c >> index a1fe918..8f9fe85 100644 >> --- a/Src/options.c >> +++ b/Src/options.c >> @@ -280,6 +280,7 @@ static struct optname optns[] = { >> {{NULL, "stdin", OPT_ALIAS}, /* ksh */ SHINSTDIN}, >> {{NULL, "trackall", OPT_ALIAS}, /* ksh */ HASHCMDS}, >> {{NULL, "dvorak", 0}, DVORAK}, >> +{{NULL, "colemak", 0}, COLEMAK}, >> {{NULL, NULL, 0}, 0} >> }; >> >> diff --git a/Src/utils.c b/Src/utils.c >> index 62bd3e6..b3d09d7 100644 >> --- a/Src/utils.c >> +++ b/Src/utils.c >> @@ -4607,10 +4607,24 @@ spdist(char *s, char *t, int thresh) >> \t\"<>PYFGCRL?+\t\ >> \tAOEUIDHTNS_\n\t\ >> \t:QJKXBMWVZ\n\n\t\ >> +\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; >> + const char colemakkeymap[] = >> + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ >> +\t1234567890-=\t\ >> +\tqwfpgjluy;[]\t\ >> +\tarstdhneio'\n\t\ >> +\tzxcvbkm,./\t\t\t\ >> +\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ >> +\t!@#$%^&*()_+\t\ >> +\tQWFPGJLUY:{}\t\ >> +\tARSTDHNEIO\"\n\t\ >> +\tZXCVBKM<>?\n\n\t\ >> \n\n\n\n\n\n\n\n\n\n\n\n\n\n"; >> const char *keymap; >> if ( isset( DVORAK ) ) >> keymap = dvorakkeymap; >> + else if ( isset( COLEMAK ) ) >> + keymap = colemakkeymap; >> else >> keymap = qwertykeymap; >> >> diff --git a/Src/zsh.h b/Src/zsh.h >> index 40f9ea5..93f3c8c 100644 >> --- a/Src/zsh.h >> +++ b/Src/zsh.h >> @@ -2547,7 +2547,8 @@ enum { >> XTRACE, >> USEZLE, >> DVORAK, >> - OPT_SIZE >> + OPT_SIZE, >> + COLEMAK > OPT_SIZE should always go last in this list. > >> }; >> >> /* >> -- >> 2.39.2 >> >> >> >
On Thu, Mar 9, 2023 at 7:38 PM Mikael Magnusson <mikachu@gmail.com> wrote:
>
> It would be nice to not introduce another weird tri-state thing here
> [...] Perhaps it would be nicer to just let
> the user set the layout in some special (namespaced?) parameter
Yes, I was just thinking the same thing. Since the keyboard layout
is expressed as a string rather than a 2d array, there's no special
complication with assigning it to a parameter, the format just needs
documenting. 14 newlines, then four runs of 12 "keys" each with tabs
at each end, then a run of 14 newlines, then four more runs for the
shifted keys, and finally 14 newlines?
If we namespace it (a reasonable idea) we'll need to start documenting
reserved namespaces. Oliver has already suggested a "zle" namespace.
Thanks, BTW, for mentioning OPT_SIZE placement.
On Thu, Mar 9, 2023 at 8:48 PM Nikita Romanyuk <ufh8945@gmail.com> wrote:
>
> If I understood correctly, we shouldn't use setopt for changing keyboard
> layouts because it's not expandable. Better, there should be a separate
> builtin function. How should it be called? "setlayout"? "setkblayout"?
No, you have misunderstood. We're suggesting something like
.zle.layout=$'\n\n\n\n\n\n\n\n\n\n\n\n\n\n etc etc'
and then the spdist function would read the value of that variable.
No new options, no new builtins.
A shell function file similar to (for an example)
Functions/Misc/colors would provide a set of layouts that could be
assigned to the variable.
[-- Attachment #1: Type: text/plain, Size: 824 bytes --] Thank you for the clarification. On Fri, Mar 10, 2023, 08:13 Bart Schaefer <schaefer@brasslantern.com> wrote: > On Thu, Mar 9, 2023 at 8:48 PM Nikita Romanyuk <ufh8945@gmail.com> wrote: > > > > If I understood correctly, we shouldn't use setopt for changing keyboard > > layouts because it's not expandable. Better, there should be a separate > > builtin function. How should it be called? "setlayout"? "setkblayout"? > > No, you have misunderstood. We're suggesting something like > > .zle.layout=$'\n\n\n\n\n\n\n\n\n\n\n\n\n\n etc etc' > > and then the spdist function would read the value of that variable. > No new options, no new builtins. > > A shell function file similar to (for an example) > Functions/Misc/colors would provide a set of layouts that could be > assigned to the variable. > [-- Attachment #2: Type: text/html, Size: 1268 bytes --]
On Thu, Mar 9, 2023 at 9:19 PM Kelvium <ufh8945@gmail.com> wrote:
>
> Thank you for the clarification.
Could you provide some examples where Colemak produces a guess that
differs from QWERTY ?
On 3/12/23 02:17, Bart Schaefer wrote:
>
> Could you provide some examples where Colemak produces a guess that
> differs from QWERTY ?
pastpetch -> fastfetch
cuear, cueas -> clear
mabe -> make
sfay -> sway (with QWERTY it corrects to stat)
tist -> test (with QWERTY it corrects to tset)
sost -> sort (with QWERTY it corrects to ssh)
greg -> grep (with QWERTY it corrects to rev)
evim -> nvim (with QWERTY it corrects to vi)