• You are not logged in.

DreymaR's Big Bag of Keyboard Tricks (Linux/XKB files included)!

  • Started by DreymaR
  • 384 Replies:
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

Hi, I hope it is appropriate to post my question here. I am transitioning to Colemak via Tarmak on Karabiner on Mac. I think your modifications to colemak look awesome! Are the modifications and keymappings in any way available for Mac, e.g. via Karabiner? It would be extra awesome if the Tarmak could aim directly at these improved layouts, but I guess that is a bit much to ask.
Also, being Danish, I liked your norwegian layout with the angle-wide. But that does not seem to have the D-H curl incorporated. Why is that, are they somehow incompatible? Or does your own favourite layout have all of these things (Norwegian, angle/wide, DH curl etc implemented all at once?
Please let me know if this is not appropriate for this thread.

Thanks!

Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

Hi and welcome! There isn't a Mac post/thread since I haven't used Mac in quite a while and consequently haven't made any files for it. Seems you found the Tarmak Karabiner files from my link? But as you may guess I don't know of Mac files with most of the other mods. If you make any, please let us know. We should get around to that sometime, for sure...

A really nice thing about the Linux XKB files is that they're so modular. You can switch on/off the Wide/Angle, Curl, locale mod etc etc without having to have one file entry for each combo. There's nothing incompatible with the different combos but on Mac I think one has to specify each one separately. If so, that's gonna be a lot of work! At the moment, I'm working (kinda slowly) on making the Windows/PKL solution a little more modular.

In the Tarmak thread there's a post about learning the DH-mod with Tarmak. It's quite similar, as you can see. I really like the Curl-DbgHk mod so I'll make some files supporting the Curl Tarmaks for Linux/XKB and Win/PKL soon.

Yes, my fave layout has CurlAngleWide Norwegian Colemak with Extend! :-) Actually, I recommend the same layout for Norwegian and Danish (even though the locale QWERTY layouts are different) so if you need it for Windows you can use mine directly.

Last edited by DreymaR (30-Apr-2015 21:01:41)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 0
  • Registered: 17-Nov-2014
  • Posts: 102

CurlAngleWide Norwegian Colemak with Extend with hereafter be known as CAWNCE!

mkborregaard, you might try a program called Ukulele. It should do what your looking for, but you'll have to manually arrange the keys and its not very intuitive. I'm a Mac user but I'm on standard Colemak.

Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

I was thinking more along the lines of CAW-NoX-Colemak! :-)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

Awesome, i implemented the Tarmak steps given in that thread in Karabiner for Mac, and put the private.xml code up there. Will probably add a wide option when I get there myself, so I end up with a layout similar to DreymaR's. It is great to have the opportunity to experiment, although it would be even more awesome if Colemak would eventually drift towards an 'ideal' standard layout.

Last edited by mkborregaard (01-May-2015 10:58:04)
Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

As said over in that thread, thanks a lot!

A standard seems nice, true, but at the same time I lean towards a more open-source-like development which leaves space for variants and informed choices.

For instance, the Angle mod is great for people with ISO/Euro keyboards, but more troublesome for the ANSI/US keyboard users – and some Euro users will not be interested in this extra level of modding. The Wide mod(s) even more so, they are nice but not all that necessary and some people just don't want to mess up their keyboard that much; my laptop board for instance, has a stick in the middle so I couldn't move the key caps to their Wide positions (but I still use the mod blind of course). The Extend mod is a complete miracle in itself, but some will prefer Shai's original solution of making the Caps key a simple Backspace. The AltGr mappings are very debatable and people simply have different needs there – I sometimes need to write þ ð ŋ π ʃ † and other symbols in my Cmk[eD] layout but many certainly do not and some will prefer the AltGr mappings that come with the Mac layouts or a coder layer with brackets etc for instance.

When it comes to Curl... well, I like the Curl-DbgHk variant a lot now but people seem to feel differently about it so it isn't easy to say whether there can be a one-size-fits-all solution for that either. This mod is the one I feel comes closer to actually changing the Colemak core setup, which is a bit scary as one of the assets of the Colemak layout has been its stability since 2006 while still proving very well optimized. We'll just have to see how the competitors fare over time. :-)

That said, some things keep falling in place too. There used to be other Tarmak variants and now there's only one standard progression (plus one for each Curl mod, hehe). I've tried several Wide variants and settled on one (for ISO boards). Etc etc.

Last edited by DreymaR (01-May-2015 17:27:29)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

Great overview! Yes, I wonder if people's individual neural and tendon wiring might mean that different versions of the curl work better for different people?
The extend mod looks interesting, and it does appear as if it should be possible to implement that in Karabiner, so a possible later project if noone else have done it already. I have a 'ninja' keyboard with blank keytops, which is really useful for experimenting.
Anyway, thanks a lot for providing all these improvements.

Last edited by mkborregaard (01-May-2015 12:31:38)
Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

The Extend mod is indeed interesting – it's the one mod I feel is as good as Colemak itself and it really helps your workflow once you get used to it. Also, it's very easy to get started with and gradually slip into and it's even quite layout invariant so I recommend it to any and all. If you could manage to get that working for the Mac, you'd in my opinion be doing the world a great favor! ;-)

I use the mouse a lot less when surfing, for instance: Ctrl+PgUp/Dn (Ext+T+J/K) to switch tabs, Ctrl+F4 (Ext+T+4) to close tabs, MouseWheelUp/Dn and PgUp/Dn (Ext+W/R,J/K) to scroll, F6 (Ext+6) to type in the address bar, etc... I just did some more research on that and found some more tricks that I'll write up. Yay!

Last edited by DreymaR (01-May-2015 17:25:57)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

OK, I have given it a try. This is by no means a finished product, but worth sharing for testing etc. at this point I feel. I have implemented, as well as I could, the diagram you have at the beginning of this thread. To use it:
1. To remap the CapsLock key, you need the software Seil: https://pqrs.org/osx/karabiner/seil.html . Open it and follow the instructions for changing CapsLock. Change it to code 80 (this is F19, so I assume you are not using this for a different purpose).
2. In Karabiner preferences, open the private.xml and replace the contents with the file given below, or save it as an xml file and <include> it.

I have put the extend layer under the same heading as the Tarmak Curl progression, but the Extend layer is independent and will stay in place regardless of which layer of Tarmak is activated.
Some caveats and things to note:
1. I have used the image from this thread, page 1. This means that the Extend+Z etc. will be out of position from the letters when the user has transitioned to the 'angle' mod (step 1B). Not really sure what the best solution is here.
2. I have not implemented the 'wide' mod. I guess the Extend layer has to be modified with that, as the finger positions change.
3. I have not worked out how to make Extend+Esc work as Caps Lock. Caps Lock is difficult, it appears.
4. I have no idea what the symbols shown on _ and / are, and thus they are not implemented.
5. Mac has no equivalent AFAIK for Insert and Menu, so I did not implement these. I guess Menu would really give the same result as Extend+M, right?
6. Mac already uses the F row for multimedia control by default, so I did not tamper with those.
7. Any shortcuts using more than two letter keys are not implemented, as the Macbook keyboards are two-key rollover only for letter keys.
8. The AltGr layer is not in place, neither for the Extend layer, nor the Tarmak/Colemak implementation. Mac has no AltGr key - is it customary to use the right option button?

OK, that said, here it is:

<?xml version="1.0"?>
<root>
  <item>
    <name>Tarmak(ETROI)-Curl(DbgHk) transitional layout</name>
    <!-- https://forum.colemak.com/viewtopic.php?pid=8786#p8786 -->
    <item>
      <name>Angle mode (B&gt;V&gt;C&gt;X&gt;Z&gt;`)</name>
        <identifier vk_config="true">private.angle_test</identifier>
    </item>
    <item>
      <name>Wide mode (Right hand moves one key to the right)</name>
        <identifier vk_config="true">private.wide</identifier>
    </item>

    <item>
      <name>Extend layer</name>
      <appendix>Extend layer from DreymaR, see https://forum.colemak.com/viewtopic.php?id=1438</appendix>
      <appendix> for description and a diagram of the keys</appendix>
      <appendix>Uses the CapsLock key as a new 'Extend' modifier </appendix>
      <appendix>that allows easy navigation from the keyboard </appendix>
      <appendix>To activate this, you must first use the Seil software to remap CapsLock to F19 (code 80)</appendix>
        <identifier>private.extend</identifier>
        <modifierdef>EXTEND</modifierdef>
          <autogen>__KeyToKey__ KeyCode::F19, KeyCode::VK_MODIFIER_EXTEND</autogen>

        <autogen>__KeyToKey__ KeyCode::T, ModifierFlag::EXTEND,
          KeyCode::VK_MOUSEKEY_UP</autogen>
        <autogen>__KeyToKey__ KeyCode::G, ModifierFlag::EXTEND,
          KeyCode::VK_MOUSEKEY_DOWN</autogen>
          <autogen>__KeyToKey__ KeyCode::E, ModifierFlag::EXTEND,
          KeyCode::CURSOR_LEFT, ModifierFlag::COMMAND_R</autogen>
        <autogen>__KeyToKey__ KeyCode::R, ModifierFlag::EXTEND,
          KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_R</autogen>
        <autogen>__KeyToKey__ KeyCode::Q, ModifierFlag::EXTEND,
          KeyCode::CONTROL_R, ModifierFlag::EXTEND</autogen>
        <autogen>__KeyToKey__ KeyCode::A, ModifierFlag::EXTEND,
          KeyCode::OPTION_L, ModifierFlag::EXTEND</autogen>
        <autogen>__KeyToKey__ KeyCode::D, ModifierFlag::EXTEND,
          KeyCode::SHIFT_L, ModifierFlag::EXTEND</autogen>
        <autogen>__KeyToKey__ KeyCode::ESCAPE, ModifierFlag::EXTEND,
          KeyCode::VK_LOCK_EXTEND</autogen>
        <autogen>__KeyToKey__ KeyCode::F, ModifierFlag::EXTEND,
          KeyCode::COMMAND_L, ModifierFlag::EXTEND</autogen>
        <autogen>__KeyToKey__ KeyCode::UK_SECTION, ModifierFlag::EXTEND,
          KeyCode::FORWARD_DELETE</autogen>
        <autogen>__KeyToKey__ KeyCode::W, ModifierFlag::EXTEND,
          KeyCode::VK_MOUSEKEY_SCROLL_UP</autogen>
        <autogen>__KeyToKey__ KeyCode::S, ModifierFlag::EXTEND,
          KeyCode::VK_MOUSEKEY_SCROLL_DOWN</autogen>
        <autogen>__KeyToKey__ KeyCode::SPACE, ModifierFlag::EXTEND,
          KeyCode::ENTER</autogen>
        <autogen>__KeyToKey__ KeyCode::ENTER, ModifierFlag::EXTEND,
          KeyCode::KEY_4, ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L</autogen> 
        <autogen>__KeyToKey__ KeyCode::KEY_1, ModifierFlag::EXTEND,
          KeyCode::F1</autogen>
        <autogen>__KeyToKey__ KeyCode::KEY_1, ModifierFlag::EXTEND,
          KeyCode::F1</autogen>
        <autogen>__KeyToKey__ KeyCode::KEY_2, ModifierFlag::EXTEND,
          KeyCode::F2</autogen>
        <autogen>__KeyToKey__ KeyCode::KEY_3, ModifierFlag::EXTEND,
          KeyCode::F3</autogen>
        <autogen>__KeyToKey__ KeyCode::KEY_4, ModifierFlag::EXTEND,
          KeyCode::F4</autogen>
        <autogen>__KeyToKey__ KeyCode::KEY_5, ModifierFlag::EXTEND,
          KeyCode::F5</autogen>
        <autogen>__KeyToKey__ KeyCode::KEY_6, ModifierFlag::EXTEND,
          KeyCode::F6</autogen>

        
        <block>
          <config_not>private.angle_test</config_not>
            <autogen>__KeyToKey__ KeyCode::Z, ModifierFlag::EXTEND,
              KeyCode::Z, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::X, ModifierFlag::EXTEND,
              KeyCode::X, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::C, ModifierFlag::EXTEND,
              KeyCode::C, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::V, ModifierFlag::EXTEND,
              KeyCode::V, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::B, ModifierFlag::EXTEND,
              PointingButton::LEFT</autogen>
          </block>

        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, ModifierFlag::EXTEND,
              KeyCode::Z, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, ModifierFlag::EXTEND,
              KeyCode::X, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::X, ModifierFlag::EXTEND,
              KeyCode::C, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::C, ModifierFlag::EXTEND,
              KeyCode::V, ModifierFlag::COMMAND_R</autogen>
            <autogen>__KeyToKey__ KeyCode::V, ModifierFlag::EXTEND,
              PointingButton::LEFT</autogen>
          </block>

        <block>
          <config_not>private.wide</config_not>

          <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::EXTEND,
            KeyCode::CURSOR_LEFT</autogen>
          <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::EXTEND,
            KeyCode::CURSOR_DOWN</autogen>
          <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::EXTEND,
            KeyCode::CURSOR_RIGHT</autogen>
          <autogen>__KeyToKey__ KeyCode::I, ModifierFlag::EXTEND,
            KeyCode::CURSOR_UP</autogen>
          <autogen>__KeyToKey__ KeyCode::U, ModifierFlag::EXTEND,
            KeyCode::HOME</autogen>
          <autogen>__KeyToKey__ KeyCode::O, ModifierFlag::EXTEND,
            KeyCode::END</autogen>
          <autogen>__KeyToKey__ KeyCode::Y, ModifierFlag::EXTEND,
            KeyCode::PAGEUP</autogen>
          <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::EXTEND,
            KeyCode::PAGEDOWN</autogen>
          <autogen>__KeyToKey__ KeyCode::COMMA, ModifierFlag::EXTEND,
            KeyCode::VK_MOUSEKEY_LEFT</autogen>
          <autogen>__KeyToKey__ KeyCode::DOT, ModifierFlag::EXTEND,
            KeyCode::VK_MOUSEKEY_RIGHT</autogen>
          <autogen>__KeyToKey__ KeyCode::N, ModifierFlag::EXTEND,
          PointingButton::MIDDLE</autogen>
          <autogen>__KeyToKey__ KeyCode::M, ModifierFlag::EXTEND,
          PointingButton::RIGHT</autogen>
          <autogen>__KeyToKey__ KeyCode::P, ModifierFlag::EXTEND,
          KeyCode::FORWARD_DELETE</autogen>
          <autogen>__KeyToKey__ KeyCode::SEMICOLON, ModifierFlag::EXTEND,                   
          KeyCode::DELETE</autogen>
          <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, ModifierFlag::EXTEND,
          KeyCode::ESCAPE</autogen>
          <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, ModifierFlag::EXTEND,
          KeyCode::PC_INSERT</autogen>
          <autogen>__KeyToKey__ KeyCode::BACKSLASH, ModifierFlag::EXTEND,
          KeyCode::D, ModifierFlag::COMMAND_L</autogen>
          <autogen>__KeyToKey__ KeyCode::SLASH, ModifierFlag::EXTEND,
          KeyCode::F13</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_7, ModifierFlag::EXTEND,
          KeyCode::F7</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_8, ModifierFlag::EXTEND,
          KeyCode::F8</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_9, ModifierFlag::EXTEND,
          KeyCode::F9</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_0, ModifierFlag::EXTEND,
          KeyCode::F10</autogen>
          <autogen>__KeyToKey__ KeyCode::QUOTE, ModifierFlag::EXTEND,
          KeyCode::VK_MOUSEKEY_HIGHSPEED, ModifierFlag::EXTEND</autogen>
        </block>

        <block>
          <config_only>private.wide</config_only>

          <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::EXTEND,
            KeyCode::CURSOR_LEFT</autogen>
          <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::EXTEND,
            KeyCode::CURSOR_DOWN</autogen>
          <autogen>__KeyToKey__ KeyCode::SEMICOLON, ModifierFlag::EXTEND,
            KeyCode::CURSOR_RIGHT</autogen>
          <autogen>__KeyToKey__ KeyCode::O, ModifierFlag::EXTEND,
            KeyCode::CURSOR_UP</autogen>
          <autogen>__KeyToKey__ KeyCode::I, ModifierFlag::EXTEND,
            KeyCode::HOME</autogen>
          <autogen>__KeyToKey__ KeyCode::P, ModifierFlag::EXTEND,
            KeyCode::END</autogen>
          <autogen>__KeyToKey__ KeyCode::U, ModifierFlag::EXTEND,
            KeyCode::PAGEUP</autogen>
          <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::EXTEND,
            KeyCode::PAGEDOWN</autogen>
          <autogen>__KeyToKey__ KeyCode::DOT, ModifierFlag::EXTEND,
            KeyCode::VK_MOUSEKEY_LEFT</autogen>
          <autogen>__KeyToKey__ KeyCode::SLASH, ModifierFlag::EXTEND,
            KeyCode::VK_MOUSEKEY_RIGHT</autogen>
          <autogen>__KeyToKey__ KeyCode::M, ModifierFlag::EXTEND,
          PointingButton::MIDDLE</autogen>
          <autogen>__KeyToKey__ KeyCode::COMMA, ModifierFlag::EXTEND,
          PointingButton::RIGHT</autogen>
          <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, ModifierFlag::EXTEND,
          KeyCode::FORWARD_DELETE</autogen>
          <autogen>__KeyToKey__ KeyCode::QUOTE, ModifierFlag::EXTEND,                   
          KeyCode::DELETE</autogen>
          <autogen>__KeyToKey__ KeyCode::Y, ModifierFlag::EXTEND,
          KeyCode::ESCAPE</autogen>
          <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::EXTEND,
          KeyCode::PC_INSERT</autogen>
          <autogen>__KeyToKey__ KeyCode::B, ModifierFlag::EXTEND,
          KeyCode::D, ModifierFlag::COMMAND_L</autogen>
          <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, ModifierFlag::EXTEND,
          KeyCode::F13</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_7, ModifierFlag::EXTEND,
          KeyCode::F7</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_8, ModifierFlag::EXTEND,
          KeyCode::F8</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_9, ModifierFlag::EXTEND,
          KeyCode::F9</autogen>
          <autogen>__KeyToKey__ KeyCode::KEY_0, ModifierFlag::EXTEND,
          KeyCode::F10</autogen>
          <autogen>__KeyToKey__ KeyCode::BACKSLASH, ModifierFlag::EXTEND,
          KeyCode::VK_MOUSEKEY_HIGHSPEED, ModifierFlag::EXTEND</autogen>
        </block>

    </item>

    <item>
      <name>Qwerty layout (for those who wish to use angle or wide mods but not change to Colemak)</name>
      <identifier>private.tarmakcurl.qwerty</identifier>
        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::BACKQUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::V, KeyCode::B</autogen>
            <autogen>__KeyToKey__ KeyCode::C, KeyCode::V</autogen>
            <autogen>__KeyToKey__ KeyCode::X, KeyCode::C</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, KeyCode::X</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::Z</autogen>
        </block>
        <block>
          <config_only>private.wide</config_only>
            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::BRACKET_LEFT</autogen>
            <autogen>__KeyToKey__ KeyCode::U, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::I</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, KeyCode::P</autogen>            
            <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, KeyCode::SLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::BRACKET_RIGHT</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::J</autogen>
            <autogen>__KeyToKey__ KeyCode::L, KeyCode::K</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::QUOTE, KeyCode::SEMICOLON</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKSLASH, KeyCode::QUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::BACKSLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::M, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::COMMA, KeyCode::M</autogen>
            <autogen>__KeyToKey__ KeyCode::DOT, KeyCode::COMMA</autogen>
            <autogen>__KeyToKey__ KeyCode::SLASH, KeyCode::DOT</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_7, KeyCode::EQUAL</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_8, KeyCode::KEY_7</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_9, KeyCode::KEY_8</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_0, KeyCode::KEY_9</autogen>
            <autogen>__KeyToKey__ KeyCode::MINUS, KeyCode::KEY_0</autogen>
            <autogen>__KeyToKey__ KeyCode::EQUAL, KeyCode::MINUS</autogen>
        </block>
    </item>

    <item>
      <name>Tarmak1(E)-Curl(Hk) transitional layout (E&gt;K&gt;H&gt;N&gt;J)</name>
      <identifier>private.tarmakcurl.tarmak_1_e</identifier>
        <autogen>__KeyToKey__ KeyCode::E, KeyCode::J</autogen> 
       
        <block>
          <config_only>private.wide</config_only>
            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::BRACKET_LEFT</autogen>
            <autogen>__KeyToKey__ KeyCode::U, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::I</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, KeyCode::P</autogen>            
            <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, KeyCode::SLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::QUOTE, KeyCode::SEMICOLON</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKSLASH, KeyCode::QUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::COMMA, KeyCode::M</autogen>
            <autogen>__KeyToKey__ KeyCode::DOT, KeyCode::COMMA</autogen>
            <autogen>__KeyToKey__ KeyCode::SLASH, KeyCode::DOT</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::BACKSLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::BRACKET_RIGHT</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_7, KeyCode::EQUAL</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_8, KeyCode::KEY_7</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_9, KeyCode::KEY_8</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_0, KeyCode::KEY_9</autogen>
            <autogen>__KeyToKey__ KeyCode::MINUS, KeyCode::KEY_0</autogen>
            <autogen>__KeyToKey__ KeyCode::EQUAL, KeyCode::MINUS</autogen>

            <autogen>__KeyToKey__ KeyCode::L, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::M, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>

        </block>

        <block>
          <config_not>private.wide</config_not>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::K</autogen>
        </block>

        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::BACKQUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::V, KeyCode::B</autogen>
            <autogen>__KeyToKey__ KeyCode::C, KeyCode::V</autogen>
            <autogen>__KeyToKey__ KeyCode::X, KeyCode::C</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, KeyCode::X</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::Z</autogen>
        </block>
    </item>
    
    <item>
      <name>Tarmak2(ET)-Curl(DbgHk) transitional layout ((B&gt;T&gt;F&gt;E&gt;K&gt;H&gt;N&gt;J))</name>
      <identifier>private.tarmakcurl.tarmak_2_et</identifier>
        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::BACKQUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::V, KeyCode::J</autogen>
            <autogen>__KeyToKey__ KeyCode::C, KeyCode::V</autogen>
            <autogen>__KeyToKey__ KeyCode::X, KeyCode::C</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, KeyCode::X</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::Z</autogen>
        </block>
        <block>
          <config_not>private.angle_test</config_not>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::J</autogen>
        </block>
      <autogen>__KeyToKey__ KeyCode::T, KeyCode::B</autogen>
      <autogen>__KeyToKey__ KeyCode::F, KeyCode::T</autogen>
      <autogen>__KeyToKey__ KeyCode::E, KeyCode::F</autogen>

       <block>
          <config_only>private.wide</config_only>
            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::BRACKET_LEFT</autogen>
            <autogen>__KeyToKey__ KeyCode::U, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::I</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, KeyCode::P</autogen>            
            <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, KeyCode::SLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::QUOTE, KeyCode::SEMICOLON</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKSLASH, KeyCode::QUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::COMMA, KeyCode::M</autogen>
            <autogen>__KeyToKey__ KeyCode::DOT, KeyCode::COMMA</autogen>
            <autogen>__KeyToKey__ KeyCode::SLASH, KeyCode::DOT</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::BACKSLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::BRACKET_RIGHT</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_7, KeyCode::EQUAL</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_8, KeyCode::KEY_7</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_9, KeyCode::KEY_8</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_0, KeyCode::KEY_9</autogen>
            <autogen>__KeyToKey__ KeyCode::MINUS, KeyCode::KEY_0</autogen>
            <autogen>__KeyToKey__ KeyCode::EQUAL, KeyCode::MINUS</autogen>

            <autogen>__KeyToKey__ KeyCode::L, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::M, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>
        </block>

        <block>
          <config_not>private.wide</config_not>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::K</autogen>
        </block>

    </item>
    

    <item>
      <name>Tarmak3(ETR)-Curl(DbgHk) transitional layout (R&gt;S&gt;D&gt;B&gt;T&gt;F&gt;E&gt;K&gt;H&gt;N&gt;J)</name>
      <identifier>private.tarmakcurl.tarmak_3_etr</identifier>
        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::BACKQUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::V, KeyCode::D</autogen>
            <autogen>__KeyToKey__ KeyCode::C, KeyCode::V</autogen>
            <autogen>__KeyToKey__ KeyCode::X, KeyCode::C</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, KeyCode::X</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::Z</autogen>
        </block>
        <block>
          <config_not>private.angle_test</config_not>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::D</autogen>
        </block>

      <autogen>__KeyToKey__ KeyCode::T, KeyCode::B</autogen>
      <autogen>__KeyToKey__ KeyCode::F, KeyCode::T</autogen>
      <autogen>__KeyToKey__ KeyCode::E, KeyCode::F</autogen>
      <autogen>__KeyToKey__ KeyCode::S, KeyCode::R</autogen>
      <autogen>__KeyToKey__ KeyCode::D, KeyCode::S</autogen>
      <autogen>__KeyToKey__ KeyCode::R, KeyCode::J</autogen>

        <block>
          <config_only>private.wide</config_only>
            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::BRACKET_LEFT</autogen>
            <autogen>__KeyToKey__ KeyCode::U, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::I</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, KeyCode::P</autogen>            
            <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, KeyCode::SLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::QUOTE, KeyCode::SEMICOLON</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKSLASH, KeyCode::QUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::COMMA, KeyCode::M</autogen>
            <autogen>__KeyToKey__ KeyCode::DOT, KeyCode::COMMA</autogen>
            <autogen>__KeyToKey__ KeyCode::SLASH, KeyCode::DOT</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::BACKSLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::BRACKET_RIGHT</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_7, KeyCode::EQUAL</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_8, KeyCode::KEY_7</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_9, KeyCode::KEY_8</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_0, KeyCode::KEY_9</autogen>
            <autogen>__KeyToKey__ KeyCode::MINUS, KeyCode::KEY_0</autogen>
            <autogen>__KeyToKey__ KeyCode::EQUAL, KeyCode::MINUS</autogen>

            <autogen>__KeyToKey__ KeyCode::L, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::M, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>
        </block>

        <block>
          <config_not>private.wide</config_not>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::K</autogen>
        </block>
    </item>
    
    <item>
      <name>Tarmak4(ETRO)-Curl(DbgHk) transitional layout (Y&gt;O&gt;;&gt;P&gt;R&gt;S&gt;D&gt;B&gt;T&gt;F&gt;E&gt;K&gt;H&gt;N&gt;J)</name>
      <identifier>private.tarmakcurl.tarmak_4_etr</identifier>
        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::BACKQUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::V, KeyCode::D</autogen>
            <autogen>__KeyToKey__ KeyCode::C, KeyCode::V</autogen>
            <autogen>__KeyToKey__ KeyCode::X, KeyCode::C</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, KeyCode::X</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::Z</autogen>
        </block>
        <block>
          <config_not>private.angle_test</config_not>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::D</autogen>
        </block>
      <autogen>__KeyToKey__ KeyCode::T, KeyCode::B</autogen>
      <autogen>__KeyToKey__ KeyCode::F, KeyCode::T</autogen>
      <autogen>__KeyToKey__ KeyCode::E, KeyCode::F</autogen>
      <autogen>__KeyToKey__ KeyCode::S, KeyCode::R</autogen>
      <autogen>__KeyToKey__ KeyCode::D, KeyCode::S</autogen>
      <autogen>__KeyToKey__ KeyCode::R, KeyCode::P</autogen>

        <block>
          <config_only>private.wide</config_only>
            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::BRACKET_LEFT</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::I</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, KeyCode::SLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKSLASH, KeyCode::QUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::COMMA, KeyCode::M</autogen>
            <autogen>__KeyToKey__ KeyCode::DOT, KeyCode::COMMA</autogen>
            <autogen>__KeyToKey__ KeyCode::SLASH, KeyCode::DOT</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::BACKSLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::BRACKET_RIGHT</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_7, KeyCode::EQUAL</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_8, KeyCode::KEY_7</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_9, KeyCode::KEY_8</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_0, KeyCode::KEY_9</autogen>
            <autogen>__KeyToKey__ KeyCode::MINUS, KeyCode::KEY_0</autogen>
            <autogen>__KeyToKey__ KeyCode::EQUAL, KeyCode::MINUS</autogen>

            <autogen>__KeyToKey__ KeyCode::L, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::M, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>

            <autogen>__KeyToKey__ KeyCode::U, KeyCode::J</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::QUOTE, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, KeyCode::SEMICOLON</autogen>     
        </block>

        <block>
          <config_not>private.wide</config_not>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::K</autogen>

            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::J</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::SEMICOLON</autogen>
        </block>
    </item>
    <item>
      <name>Colemak-Curl(DbgHk) layout (Y&gt;O&gt;;&gt;P&gt;R&gt;S&gt;D&gt;B&gt;T&gt;F&gt;E&gt;K&gt;H&gt;N&gt;J &amp; L&gt;U&gt;I)</name>
      <identifier>private.tarmakcurl.tarmak_5_etroi</identifier>
        <block>
          <config_only>private.angle_test</config_only>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::BACKQUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::V, KeyCode::D</autogen>
            <autogen>__KeyToKey__ KeyCode::C, KeyCode::V</autogen>
            <autogen>__KeyToKey__ KeyCode::X, KeyCode::C</autogen>
            <autogen>__KeyToKey__ KeyCode::Z, KeyCode::X</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::Z</autogen>
        </block>
        <block>
          <config_not>private.angle_test</config_not>
            <autogen>__KeyToKey__ KeyCode::B, KeyCode::D</autogen>
        </block>
      <autogen>__KeyToKey__ KeyCode::T, KeyCode::B</autogen>
      <autogen>__KeyToKey__ KeyCode::F, KeyCode::T</autogen>
      <autogen>__KeyToKey__ KeyCode::E, KeyCode::F</autogen>
      <autogen>__KeyToKey__ KeyCode::S, KeyCode::R</autogen>
      <autogen>__KeyToKey__ KeyCode::D, KeyCode::S</autogen>
      <autogen>__KeyToKey__ KeyCode::R, KeyCode::P</autogen>

       <block>
          <config_only>private.wide</config_only>
            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::BRACKET_LEFT</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_RIGHT, KeyCode::SLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::BACKSLASH, KeyCode::QUOTE</autogen>
            <autogen>__KeyToKey__ KeyCode::COMMA, KeyCode::M</autogen>
            <autogen>__KeyToKey__ KeyCode::DOT, KeyCode::COMMA</autogen>
            <autogen>__KeyToKey__ KeyCode::SLASH, KeyCode::DOT</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::BACKSLASH</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::BRACKET_RIGHT</autogen>
            <autogen>__KeyToKey__ KeyCode::L, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::M, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::K</autogen>
            <autogen>__KeyToKey__ KeyCode::U, KeyCode::J</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::QUOTE, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::BRACKET_LEFT, KeyCode::SEMICOLON</autogen>  
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::I</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_7, KeyCode::EQUAL</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_8, KeyCode::KEY_7</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_9, KeyCode::KEY_8</autogen>
            <autogen>__KeyToKey__ KeyCode::KEY_0, KeyCode::KEY_9</autogen>
            <autogen>__KeyToKey__ KeyCode::MINUS, KeyCode::KEY_0</autogen>
            <autogen>__KeyToKey__ KeyCode::EQUAL, KeyCode::MINUS</autogen>
        </block>

        <block>
          <config_not>private.wide</config_not>
            <autogen>__KeyToKey__ KeyCode::K, KeyCode::E</autogen>
            <autogen>__KeyToKey__ KeyCode::N, KeyCode::H</autogen>
            <autogen>__KeyToKey__ KeyCode::J, KeyCode::N</autogen>
            <autogen>__KeyToKey__ KeyCode::H, KeyCode::K</autogen>

            <autogen>__KeyToKey__ KeyCode::Y, KeyCode::J</autogen>
            <autogen>__KeyToKey__ KeyCode::O, KeyCode::Y</autogen>
            <autogen>__KeyToKey__ KeyCode::SEMICOLON, KeyCode::O</autogen>
            <autogen>__KeyToKey__ KeyCode::P, KeyCode::SEMICOLON</autogen>

            <autogen>__KeyToKey__ KeyCode::U, KeyCode::L</autogen>
            <autogen>__KeyToKey__ KeyCode::I, KeyCode::U</autogen>
            <autogen>__KeyToKey__ KeyCode::L, KeyCode::I</autogen>
        </block>  
    </item>
  </item>
</root>

EDIT: 1. To get the Compose key to work on the Mac, you should: Create a folder at ~/Library/Keybindings , and save this file to it: https://github.com/jsarenik/Mac-Ompose/ … nding.dict (I got this file from a blog post, I am not involved with it in any way, but it seems to work). It must be saved with UTF-8 text encoding. Works after restart. 2. It can now toggle the angle mode. 3. It now has a basic version of the Extend mode (see later post). 4. It can now toggle the wide mode as well.

Oh, and with the angle mod: I have my whole life used the middle finger on 'M', ring finger on ',' etc. That is the reason I thought it was weird! I only now realized that this is wrong, and having to change this makes it a whole lot more challenging!

Last edited by mkborregaard (07-May-2015 15:18:53)
Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

Wow, impressive work! I've actually been fiddling with the Extend layer the whole weekend, trying out and discarding some ideas, and ending up with pretty much everything as it was. The new thing is that I put PrintScreen on Ext-Enter and CtrlBreak on Ext-Back.

mkborregaard said:

Some caveats and things to note:
1. I have used the image from this thread, page 1. This means that the Extend+Z etc. will be out of position from the letters when the user has transitioned to the 'angle' mod (step 1B). Not really sure what the best solution is here.
2. I have not implemented the 'wide' mod. I guess the Extend layer has to be modified with that, as the finger positions change.
3. I have not worked out how to make Extend+Esc work as Caps Lock. Caps Lock is difficult, it appears.
4. I have no idea what the symbols shown on _ and / are, and thus they are not implemented.
5. Mac has no equivalent AFAIK for Insert and Menu, so I did not implement these. I guess Menu would really give the same result as Extend+M, right?
6. Mac already uses the F row for multimedia control by default, so I did not tamper with those.
7. Any shortcuts using more than two letter keys are not implemented, as the Macbook keyboards are two-key rollover only for letter keys.
8. The AltGr layer is not in place, neither for the Extend layer, nor the Tarmak/Colemak implementation. Mac has no AltGr key - is it customary to use the right option button?

1. Ext-Z should be on the same key as Z etc. The Extend mod follows "hard" key remappings like the AngleWide mod, but not "soft" remappings like Curl or Colemak itself – although the layer has some Colemak mnemonics.
    • Often, that boundary gets a little blurry. Some mappings are more positional (like mouse up/down) and some follow the keys they're on (like ZXCV). Not sure how to handle SteveP's Curl mod then... :-p
2. Extend should ideally be implemented both for Wide and NonWide keyboards, and with/-out the Angle mod. I know, it gets messy...
3. There should be some key on the keyboard providing the Caps functionality. If Ext-Esc doesn't work, maybe a remapping of the ScrollLock key could be a last resort – if your keyboard even has that key? Or similar.
4. The image you've seen has been for the Linux implementation of Extend. There, the <> (or _) key holds the MouseKeys On/Off lock which is necessary for the mouse keys, and the / key holds the Compose/Multi key.
    • In the Windows implementation, these mappings are different and the two keys instead hold MouseWheel Left/Right. That's not implemented everywhere, but it's nice enough when it works.
    • People with ANSI keyboards will be lacking the <> key so if they really want the MouseWheel keys they have to take for instance the Insert key. I don't use that a lot. Or maybe the Menu key.
5. Mac doesn't have Insert? Well, as I said it's not used a lot anyway. The Menu key is a lot like the RButton, true, but makes the menu in place rather than at the mouse pointer and sometimes works differently.
6. As the Mac already has quite excellent multimedia key support, I think that's good enough as it is yes. Note that I have mappings on the shifted F keys too (in Linux only).
    • In fact, I did look to the Mac layouts when making the multimedia mappings for Extend.
7. Not being able to chord is bad. I had it like that in my Linux implementation for the longest time and it really cramps the style. I'm about to make a post about how many wonderful combos you can make – you'll see!
    • So I hope we can get that working eventually. But it literally took me years to do in XKB and that got so involved that I ended up getting a nod from one of the big heads on the Linux development team. ;-)
8. The AltGr layers belong to the layout and not the Extend layer(s). They're the symbols you get with the AltGr ("Alternate Graphics") key which sits in the RAlt position, yes. Same principle as Mac Option.
    • My AltGr mappings for Colemak are called Colemak[eD] which stands for "Colemak – edition DreymaR". This too is described in the sig topics.
    • I'm not sure you need to implement that on the Mac (yet); it's got nice dead keys and stuff but the Mac Option mappings aren't bad as they are. Those should be moved to Colemak positions though.
    • If possible, of course it'd be nice to eventually get Colemak[eD] implemented too. The right Option button seems perfect for the job, yes, but it should work with Shift and allow dead keys.

Hope that clears up everything! Again, it's a great job you're doing. :-)

Last edited by DreymaR (03-May-2015 22:31:51)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

I've just updated the posts in this thread and the PKL one with descriptions and images of the updated Extend mappings, also showing the (minor) differences between the Linux and Win/PKL versions! The definition files aren't yet ready, but should be uploaded soon.

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

OK, cool. Here are responses:
1. Karabiner does not support any differences between hard and soft mappings. BUT, I have now updated the XML file using conditionals, so it appears to the user as if the Angle mode is modular. It can be activated at any time and will move the relevant keys, also in the Extend layer.
2. I have done this for the angle mode now. I think I can see how to do it for the Wide mode as well, but that will have to wait a few weeks until I get the time, or someone else is welcome to do it. To be honest, I already feel my elbows go too far from my sides with the angle mod, so I am not inclined to try out the wide myself at this point.
3. Karabiner has an in-built option to use the Shift+Escape key (under 'change escape key'), which is only marginally less convenient. I suggest using that.
4. Ahh, so the Mon is a key that in practice locks the Extend layer? That sounds useful, I will try to implement that when I find the time. Regarding the Compose key, I have put that in now. But to get it to work on the Mac, you should: Create a folder at ~/Library/Keybindings , and save this file to it: https://github.com/jsarenik/Mac-Ompose/ … nding.dict (I got this file from a blog post, I am not involved with it in any way, but it seems to work). It must be saved with UTF-8 text encoding. Works after restart.
5. OK, should think of something more useful to put there.
7. Oh but you can chord no problem, all the shortcuts you listed in the table seems to work - e.g. Extend + T + J (although of course the actual shortcuts are different on the Mac). It is just your Extend+LSGT or what it was that involves 5 keys is impossible. I should think most PC keyboards are 2-key rollover as well. My own Mac Keyboard is N-key, but I should think that is rare. Since it is a hardware issue, I suspect we can not solve it.
8. Oh, I thought there was an AltGr + Extend layer as well. Yes, I will get around to making an AltGr layer that follows the colemak mappings, and possibly the eD too, though this is more tricky I think.

Another note: To be useful on a Mac, the layout needs a Command button. For consistence with the shortcuts, I have put that on the 'T', moved Control to 'Q' and dropped the Escape from there, although it could be moved to the button next to '1'.

Perhaps this should go on Github soon. Do you prefer to host it, or should I put it on mine with attribution to you and this forum?

Last edited by mkborregaard (05-May-2015 15:13:21)
Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

1/2. That "hard"/"soft" lingo is part BS I realize. Rather, I should say that I see many Extend mappings as primarily positional and those should be layout invariant. The ZXCV ones are an exception to that as they're closely linked to their underlying letters which are also Ctrl+key shortcuts. The Wide mods move the home position, so the Extend layer has to adjust accordingly.
3. If there's a built-in option for a CapsLock function, there's no need to worry at all. It doesn't have to be convenient at all! Furthermore, then you have a spare Extend key on Esc! :-)
4. No, the Extend layer may be locked in Linux by activating two lv5 modifiers as 'switch_lock' lv5 modifiers and pressing them both at the same time! The MouseOn key only lets you use the mousing keys as without it those keys won't work at all. At the same time, the NumPad becomes a mousing pad with that thing active, so if you need your NumPad back you'll have to press that key again. It's also on a NumLock shortcut so it doesn't have to be on the Extend layer but it's somewhat practical to have it there. Compose keys are nice, but on Windows it requires extra software so I didn't put it in there.
5. Some functions that the Extend layer are missing, are the GUI key for menus and stuff (as it didn't map well under Win/PKL), and New Tab (Ctrl+T).
7. That's wonderful then! But <LSGT> is just one key, the key next to LShift that MouseOn is mapped to. Sorry if I wasn't clear about that. :-) Keyboards are rarely 2-key rollover but I think 6-key rollover is common now. However, there are other limitations when mapping keys to modifiers: For instance, a Ctrl key on Colemak R didn't work well at all so I had to put a MouseWheel key there instead.
8. AltGr+Extend is defined for Linux (a NumPad layer) but not for Windows (yet!). It really should have a better trigging key as holding down Caps+AltGr while entering numbers is a complete pain. I'll get around to that.
9. The Command button is the Mac analogue to Ctrl so I agree that it should be on 'T'. While it's very convenient with an Esc on 'Q' it's indeed a recommended choice for remapping.

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

For ease of communication, I have modified this to show what I have currently implemented of the Extend layer on the MacBook keyboard, shown here with the 'Angle' mod activated.
mac extend keyboard

1-2. Cool, that is how I had done it.
3. I have now put a 'lock extend layer' here.
4. Great. I think the compose key is a nice addition at a small cost here.
5. Cmd-, (preferences) on Ext-Q?
7. Ah, thanks for clearing that up.
8. Remap Ext-paragraph to a second AltGr perhaps?
9. Great.

I have updated the XML in the post above.

I have introduced a button that increases the speed of the mouse keys. Perhaps the two unimplemented keys on the right could be used for cycling through windows from the same program, and among programs, respectively?

Last edited by mkborregaard (07-May-2015 15:24:06)
Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

I realize I have hijacked a linux thread. Mind if I put the info in a new thread for the Mac instead?

Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

Looks nice!

I'd put the mouse acceleration button on the <?> one between the mouse buttons (VK_102)? Or are you afraid it'll go away for the ANSI users? It'd look more consistent there for sure. And yes, if you have keys you think would make Extend for Mac better then put them in the free positions. The Back key I thought to make a Break or Sleep key, but Sleep doesn't always work so well and Break is rarely needed. I use combos to cycle windows (such as the plain Alt-Tab, Ext-A+Q and a Win-T Extend key on the Tilde key).

Is the Ctrl on Q even necessary on a Mac? If it's rarely used, just let the native Ctrl key be enough. Maybe an Esc is more useful on Q after all?

Don't sweat the NumPad layer yet, I think. I'm not sure what you mean by AltGr unimplemented – is that the NumPad layer you refer to?

Yes, a separate Mac thread might be a good idea now. I haven't made a Big Bag topic for Mac since I didn't have much to put in it! But it looks like you've got things off to a good start now. I think you should make that topic and I'll link to it from here (as I already have too much work maintaining the many topics I've made...). And link to this topic too of course.

Last edited by DreymaR (08-May-2015 11:33:04)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 3
  • Registered: 29-Apr-2015
  • Posts: 23

Hey,
thanks for the advice, I am currently using the layer quite a lot, so I should get a good feel for it soon enough. I do tend to use the Ctrl key, mainly for cycling through workspaces (together with the arrows on N and I). And I feel the mouse accelator sits really comfortably under the little finger when using the mouse keys - I am not really sure what to put on the <> button, I find it diffcult to reach while holding Extend.

Thanks for putting this together, my experiences with it so far are really promising.

I finally made the Mac thread, it is over at: https://forum.colemak.com/viewtopic.php … 733#p16733

Offline
  • 0
  • Reputation: 0
  • Registered: 28-Oct-2007
  • Posts: 5

I am still using an xmodmap solution for linux, but this looks way cooler. I found this topic looking for general info on xkb, but these mods do almost all I wanted already. :D

Anyway, sudo isn't installed by default in debian which crashes the installation script. Here is a bash tip that would allow running the script as root as well.

if [[ "$EUID" -eq 0 ]]; then
    # Running as root!
    sudoIfNeeded=""
elif command -v sudo >/dev/null 2>&1; then
    # sudo is installed!
    sudoIfNeeded="sudo "
else
    # Fuck!
    echo "This script needs either the sudo command, or to be run as root."
    exit 0
fi

# ...
# Other things...
# ...

# Hey, some command needs superprivs!
$sudoIfNeeded some command
Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

Thanks for the tip!

This should work (if a little less transparently)?

DoSudo=''; [ "$EUID" -eq 0 ] || DoSudo='sudo'
$DoSudo $Command || MyError "Fail! Root privileges needed."
Last edited by DreymaR (07-Aug-2015 13:52:32)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 0
  • Registered: 04-Apr-2013
  • Posts: 538

I don't know much about bash, but it looks to me like if the command fails for another reason, it'd still give that same error message.

Plus, less transparently is almost never a good idea.

Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

Okay, I agree (but I'd still like this to be compact or my script gets very long!)

DoSudo=''
if [ "$EUID" -ne 0 ]; then # not root, so test for and use sudo instead
    [ command -v sudo >/dev/null 2>&1 ] || MyError "This script needs root privileges and sudo wouldn't run!"
    DoSudo='sudo'
fi

$DoSudo $Command || MyError "$Command failed!"

?

Actually, in another script I've used this which works whether you're actually root or use sudo:

if [[ `whoami` != 'root' ]]; then

?

The problem with the install script is that it may not need root access and in that case I don't want to enforce it! You may install to a non-system folder.

Last edited by DreymaR (12-Aug-2015 15:53:27)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 0
  • Registered: 13-Sep-2015
  • Posts: 3

Could someone describe the basic steps for modifying the extend layer? I'm trying to create a layout similar to the Pok3r (see below), with some modifications to use vim style directional keys (hjkl). I've spent quite a bit of time reading through this thread, but I'm still a bit confused about the process.

vortex-pok3r-poker-3-pbt-black-version-alu-casing-ansi-us-international.jpg

Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

Well, modifying xkb is tricky and I can't quite give you an instruction booklet for it. But if you read up on ArchWiki's xkb articles and look inside my symbols/extend file it should get you on your way.

Search for 'modify xkb' and you'll find some good links such as http://madduck.net/docs/extending-xkb/

Yes, the extend file is complex. That's the only way I could make it work. As you'll see, I had to both provide a key remapping (sort of a 'virtual key') and then for many keys set actual actions or such keys as modifiers wouldn't take.

Last edited by DreymaR (14-Sep-2015 12:27:40)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0
  • Reputation: 0
  • Registered: 13-Sep-2015
  • Posts: 3

OK, thank you! That does look pretty difficult to get in to, so I think I may let the tail wag the dog here, and try switching my Pok3r to match your layout. I'm running into a couple small problems, which I imagine are due to keymappings I don't fully understand: shift+space and leftwin+e. Any chance you could give me a hint on where I could change that? Looking through the description of your extend layer, it doesn't look like the shift or win keys were affected by default, but I'm probably missing something obvious (I'm using /setxkb.sh -m pc104 -l us -o 'misc:extend,lv5:caps_switch_lock - maybe I'll give colemak a try after I get used to the extend layer). Thanks for all your work on this, it's an incredible project!

Last edited by someguy (15-Sep-2015 03:29:15)
Offline
  • 0
  • Reputation: 210
  • From: Viken, Norway
  • Registered: 13-Dec-2006
  • Posts: 5,343

The Win+e mapping shouldn't be affected by my stuff. And when I say shouldn't, that means I have no idea whether it will be nor what to do about it. Run for the hills! :-D In general, Win is referred to as (or rather, mapped to) the 'Super' key in most Linux contexts. Not sure where Super mappings are handled, but it's not in the usual shift level hierarchy (which goes Shift>AltGr>Extend in my case; normally they use 4 levels but I've added another bit to get 8 levels which is also done by one or two other layouts like the Canadian International one but it's very rare otherwise).

You mean, Extend+Shift+Space? This, as you've seen by now, is what the Space key mapping in my Extend file looks like:

    key <SPCE> { symbols[Group1]=[ NoSymbol , NoSymbol , NoSymbol , NoSymbol ,
                   Return               , Return                , // Enter
                   space                , nobreakspace         ], // Space
                 actions[Group1]=[NoAction(),NoAction(),NoAction(),NoAction(),
                   Redirect(key=<RTRN>) , Redirect(key=<RTRN>)  , // <RTRN>
                   NoAction()           , NoAction()           ]
               };  // <SPCE>

So, I just make a Return keypress whether Shift is held or not, while Extend+AltGr(+Shift) is essentially unaffected. If you want something else, you'll have to change the second instance of 'Return' and '<RTRN>' to something else (see the rest of the Extend file for ideas).

Last edited by DreymaR (15-Sep-2015 09:06:45)

*** Learn Colemak in 2–5 steps with Tarmak! ***
*** Check out my Big Bag of Keyboard Tricks for Win/Linux/TMK... ***

Offline
  • 0