情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

Ubuntu:「無変換+○」にカーソル移動系ホットキーを設定する(xkb編)

AutoKey (3) Ubuntu (19) XKB (2)

Ubuntu 14.04 で xkb の設定を利用して、「無変換+○○」系のホットキーを設定しました。設定方法と、わかったこと、わかっていないこと、できなかったことなどを書いておきます。

設定したかったホットキー

今回設定したのは、以下のホットキーです(一部)。

  • 無変換+h:BackSpace
  • 無変換+j:Home
  • 無変換+k:Left
  • 無変換+l:Right
  • 無変換+;:End
  • 無変換+::Delete
  • 無変換+p:Up
  • 無変換+n:Down
  • 無変換+m:Enter

作成したファイル

作成したファイルは、以下の4つ。

~/.xkb/compat/mycompat

xkb_compatibility "muhenkan" {
  interpret Muhenkan { action = SetMods(modifiers=Mod5); };
};

~/.xkb/types/mytypes

xkb_types "muhenkan" {
  type "MUHENKAN" {
    modifiers = Shift+Control+Mod5;
    map[Shift] = Level2;
    map[Mod5] = Level3;
    map[Mod5+Control] = Level3;
    map[Mod5+Shift] = Level3;
    map[Mod5+Shift+Control] = Level3;

    preserve[Mod5+Control] = Control;
    preserve[Mod5+Shift] = Shift;
    preserve[Mod5+Shift+Control] = Shift+Control;

    level_name[Level1] = "Base";
    level_name[Level2] = "Shift";
    level_name[Level3] = "Muhenkan";
  };
};

~/.xkb/symbols/mysymbols

xkb_symbols "muhenkankeys" {

key.type = "MUHENKAN";
//  key <AE01> { [ 1, exclam      ] };
//  key <AE02> { [ 2, quotedbl        ] };
//  key <AE03> { [ 3, numbersign  ] };
//  key <AE04> { [ 4, dollar      ] };
//  key <AE05> { [ 5, percent     ] };
//  key <AE06> { [ 6, ampersand       ] };
//  key <AE07> { [ 7, apostrophe  ] };
//  key <AE08> { [ 8, parenleft       ] };
//  key <AE09> { [ 9, parenright  ] };
//  key <AE11> { [ minus, equal       ] };
//  key <AE12> { [ asciicircum,   asciitilde] };
 
//  key <AD01> { [ q, Q           ] };
//  key <AD02> { [ w, W           ] };
  key <AD03> { [ e, E, Escape ] };
//  key <AD04> { [ r, R           ] };
//  key <AD05> { [ t, T           ] };
//  key <AD06> { [ y, Y           ] };
//  key <AD07> { [ u, U           ] };
//  key <AD08> { [ i, I           ] };
//  key <AD09> { [ o, O           ] };
  key <AD10> { [ p, P, Up ] };
//  key <AD11> { [ at, grave      ] };
//  key <AD12> { [ bracketleft,   braceleft ] };
 
//  key <CAPS> { [ Eisu_toggle, Caps_Lock ] };


//  key <AC01> { [ a, A           ] };
//  key <AC02> { [ s, S           ] };
//  key <AC03> { [ d, D           ] };
//  key <AC04> { [ f, F           ] };
//  key <AC05> { [ g, G           ] };
  key <AC06> { [ h, H, BackSpace] };
  key <AC07> { [ j, J, Home ] };
  key <AC08> { [ k, K, Left ] };
  key <AC09> { [ l, L, Right ] };
  key <AC10> { [ semicolon, plus, End ] };
  key <AC11> { [ colon, asterisk, Delete ] };

  key <AB01> { [ z, Z, Return ] };
  key <AB02> { [ x, X, BackSpace ] };
  key <AB03> { [ c, C, Delete ] };
//  key <AB04> { [ v, V           ] };
//  key <AB05> { [ b, B           ] };
  key <AB06> { [ n, N, Down ] };
  key <AB07> { [ m, M, Return ] };
//  key <AB08> { [ comma,  less       ] };
//  key <AB09> { [ period, greater    ] };
//  key <AB10> { [ slash, question    ] };
//  key <AB11> { [ backslash, underscore] };
};

~/.xkb/keymap/mykbd

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete+mytypes(muhenkan)"  };
    xkb_compat    { include "complete+japan+mycompat(muhenkan)"   };
    xkb_symbols   { include "pc+jp+inet(evdev)+mysymbols(muhenkankeys)"   };
    xkb_geometry  { include "pc(pc105)" };
};

設定反映(有効化)

設定の反映は、次のコマンドを実行します。

xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY

設定にミスがあると、出力の冒頭にErrorが出るので、エラーチェックにもなります。また、再起動・ログオフ不要で反映されます(/usr/share/X11/xkb/ を直接変更する場合とは違って楽)。

通常の利用にあたっては、起動時にこのコマンドが実行されるようにしておきます(「自動起動するアプリケーション」アプリから、シェルスクリプトを登録)。

TIPS

以下、ポイントを。

「無変換+○」で、「Ctrl+○」「Shift+○」を送信する

「無変換+k」を「Left(←)」にしたので、「無変換+Shift+k」を「Shift+Left」にして、カーソル移動に加えて文字選択をしようと考えました。

しかし、xkb_symbolsの中のkeyの指定で、ShiftやCtrlを押しながら○○のような送信方法がわかりませんでした(出来ないかも)。

ただし、「無変換+Shift+K」としたときに、「Shift」を透過させる方法はわかったので、今回はそれを使用しています。

ポイントは、xkb_types内の「map[Mod5+Shift]=Level3」と「preserve[Mod5+Shift]=Shift」です。

前者でまず、「無変換+k」だけでなく、「無変換+Shift+k」も、「Left」を送信するようになります(これを設定しないと、「無変換+Shift+k」でホットキーが発動しない)。

そして後者で、Shiftがホットキーの送信時にも継続されて送信され、その結果として「Shift+Left」が送られるようになります。

AutoKeyで再変換したい→難しそう

例えば、xkbの設定で、「無変換+s」を「Hyper+s」にして、ということを考えているのですが、preserveが個別のキーの組み合わせではなく、修飾キーの組み合わせに対する共通設定であるため、出来るにしても大掛かりになるため断念しています。

また、先ほど設定した「無変換+Shift+k」で送信される「Shift+Left」をAutoHotkeyのトリガとして登録しようとしましたが、「Press to Set」では無変換キーが反応してしまい、直接「Shift」を選択した上で「<Left>」を設定しても、「無変換+Shift+k」では反応してくれませんでした。

直接物理キーで「Shift+Left」とする分には反応します。フックしている場所が思ったより深いようです(難題)。

「無変換+s」で「Alt+Shift+Tab」を送信したい

というわけで、この表題の「Alt+Shift+Tab」は断念中です。修飾キーの送信は厳しいです。

「Henkan_Mode」って?

無変換キーではなく、変換キーをModifier(修飾キー)として使うのなら、「Muhenakan」を「Henkan_Mode」にするのですが、この記法は「/usr/share/X11/xkb/symbols/sun_vndr/jp」に登場します。

Levelの上限

Levelの上限はLevel8まで。Level9は無い。 までであって

Virtual Modifierの使い方が謎

無変換と変換の両方を設定するために、Mod5以外のMod4やMod3、Mod2を使っても何かとうまく行かず、Virtual Modifierにも手を出しましたが、粘ったものの情報が少なすぎて断念することになりました。

「virtual_modifiers」「virtualMod (virtualModifier?)」「modMapMods」いまひとつよくわからないまま。

無変換キー自体が送信されてしまう

もう一つ面倒な問題が、「無変換+○」時に、無変換キーそのものが送信されてしまうというものです。

より厳密に言えば、無変換キーのkey down時に送信されてしまうので、ホットキーが発動するかどうかにかかわらず、送信されてしまいます。理想は、ホットキーを使用しなかった場合のkey up時なので。

Windows+AutoHotkey同様、うまく無変換の key up をIME ONにしたいのですが、現状できていません(key downに発動してしまうため、IME OFFが発動し、日本語入力を維持したままカーソル移動できない←Mozcの設定を切ればこの状態自体をとりあえずは解決可能)。

参考

キーの参考

設定時に、キーボードに印刷された表記を設定するのではなく、わかりにくいため、参考資料を貼っておきます。

symbol/jp

// Symbols for Japanese 106-keys keyboards (by tsuka@kawalab.dnj.ynu.ac.jp).

default  partial alphanumeric_keys
xkb_symbols "106" {

    include "jp(common)"
    name[Group1]= "Japanese";

    key <AE10> { [ 0, asciitilde	] };
    key <AE13> { [ backslash, bar	] };
};

partial hidden alphanumeric_keys
xkb_symbols "common" {
    // "Common" keys for jp 106/109A layouts.

    key <HZTG> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
    };

    key <AE01> { [ 1, exclam		] };
    key <AE02> { [ 2, quotedbl		] };
    key <AE03> { [ 3, numbersign	] };
    key <AE04> { [ 4, dollar		] };
    key <AE05> { [ 5, percent		] };
    key <AE06> { [ 6, ampersand		] };
    key <AE07> { [ 7, apostrophe	] };
    key <AE08> { [ 8, parenleft		] };
    key <AE09> { [ 9, parenright	] };
    key <AE11> { [ minus, equal		] };
    key <AE12> { [ asciicircum,	asciitilde] };

    key <AD01> { [ q, Q			] };
    key <AD02> { [ w, W			] };
    key <AD03> { [ e, E			] };
    key <AD04> { [ r, R			] };
    key <AD05> { [ t, T			] };
    key <AD06> { [ y, Y			] };
    key <AD07> { [ u, U			] };
    key <AD08> { [ i, I			] };
    key <AD09> { [ o, O			] };
    key <AD10> { [ p, P			] };
    key <AD11> { [ at, grave		] };
    key <AD12> { [ bracketleft,	braceleft ] };

    key <CAPS> { [ Eisu_toggle, Caps_Lock ] };

    key <AC01> { [ a, A			] };
    key <AC02> { [ s, S			] };
    key <AC03> { [ d, D			] };
    key <AC04> { [ f, F			] };
    key <AC05> { [ g, G			] };
    key <AC06> { [ h, H			] };
    key <AC07> { [ j, J			] };
    key <AC08> { [ k, K			] };
    key <AC09> { [ l, L			] };
    key <AC10> { [ semicolon, plus	] };
    key <AC11> { [ colon, asterisk	] };
    key <AC12> { [ bracketright, braceright ] };

    key <AB01> { [ z, Z			] };
    key <AB02> { [ x, X			] };
    key <AB03> { [ c, C			] };
    key <AB04> { [ v, V			] };
    key <AB05> { [ b, B			] };
    key <AB06> { [ n, N			] };
    key <AB07> { [ m, M			] };
    key <AB08> { [ comma,  less		] };
    key <AB09> { [ period, greater	] };
    key <AB10> { [ slash, question	] };
    key <AB11> { [ backslash, underscore] };
    key <LCTL> { [ Control_L		] };

    key <NFER> { [ Muhenkan		] };

    key <XFER> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Henkan, Mode_switch ]
    };

    key <HKTG> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Hiragana_Katakana, Romaji ]
    };

    key <EISU> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Eisu_toggle ]
    };

    key <KANA> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Hiragana_Katakana ]
    };

    key <PRSC> {
	type[Group1]= "PC_ALT_LEVEL2",
	symbols[Group1]= [ Print, Execute ]
    };
};

partial alphanumeric_keys
xkb_symbols "OADG109A" {

    include "jp(common)"
    name[Group1]= "Japanese (OADG 109A)";

    key <AE10> { [ 0		] };
    key <AE13> { [ yen, bar	] };
};

// 86 keys with kana map
partial alphanumeric_keys
xkb_symbols "kana86" {

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(numoperdecsep)"
    include "altwin(menu)"
    include "jp(kana)"
    include "jp(OADG109A)"
    name[Group1]= "Japanese (Kana 86)";

    key  <ESC> {	[ Escape	]	};
    key <NMLK> {	[ Num_Lock, Pointer_EnableKeys ] };
    key <BKSP> {	[ BackSpace	]	};
    key  <TAB> {	[ Tab, ISO_Left_Tab ]	};
    key <RTRN> {	[ Return	]	};
    key <LFSH> {	[ Shift_L	]	};
    key <RTSH> {	[ Shift_R	]	};
    key <LWIN> {	[ Super_L	]	};
    key <LALT> {	[ Alt_L		]	};
    key <SPCE> {	[ space		]	};
    key <RALT> {	[ Alt_R		]	};
    // For compatibility with other keyboards connected at the same time:
    key <RWIN> {	[ Super_R	]	};
    key <RCTL> {	[ Control_R	]	};
};

partial alphanumeric_keys
xkb_symbols "kana" {

    name[Group1]= "Japanese (Kana)";

    key <HZTG> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
    };

    key <AE01> { [ kana_NU		]	};
    key <AE02> { [ kana_FU		]	};
    key <AE03> { [ kana_A, kana_a	]	};
    key <AE04> { [ kana_U, kana_u	]	};
    key <AE05> { [ kana_E, kana_e	]	};
    key <AE06> { [ kana_O, kana_o	]	};
    key <AE07> { [ kana_YA, kana_ya	]	};
    key <AE08> { [ kana_YU, kana_yu	]	};
    key <AE09> { [ kana_YO, kana_yo	]	};
    key <AE10> { [ kana_WA, kana_WO	]	};
    key <AE11> { [ kana_HO		]	};
    key <AE12> { [ kana_HE		]	};
    key <AE13> { [ prolongedsound	]	};

    key <AD01> { [ kana_TA		]	};
    key <AD02> { [ kana_TE		]	};
    key <AD03> { [ kana_I, kana_i	]	};
    key <AD04> { [ kana_SU		]	};
    key <AD05> { [ kana_KA		]	};
    key <AD06> { [ kana_N		]	};
    key <AD07> { [ kana_NA		]	};
    key <AD08> { [ kana_NI		]	};
    key <AD09> { [ kana_RA		]	};
    key <AD10> { [ kana_SE		]	};
    key <AD11> { [ voicedsound		]	};
    key <AD12> { [ semivoicedsound, kana_openingbracket ] };

    key <CAPS> { [ Eisu_toggle, Caps_Lock ]	};
    key <AC01> { [ kana_CHI		]	};
    key <AC02> { [ kana_TO		]	};
    key <AC03> { [ kana_SHI		]	};
    key <AC04> { [ kana_HA		]	};
    key <AC05> { [ kana_KI		]	};
    key <AC06> { [ kana_KU		]	};
    key <AC07> { [ kana_MA		]	};
    key <AC08> { [ kana_NO		]	};
    key <AC09> { [ kana_RI		]	};
    key <AC10> { [ kana_RE		]	};
    key <AC11> { [ kana_KE		]	};
    key <AC12> { [ kana_MU, kana_closingbracket ] };

    key <AB01> { [ kana_TSU, kana_tsu	]	};
    key <AB02> { [ kana_SA		]	};
    key <AB03> { [ kana_SO		]	};
    key <AB04> { [ kana_HI		]	};
    key <AB05> { [ kana_KO		]	};
    key <AB06> { [ kana_MI		]	};
    key <AB07> { [ kana_MO		]	};
    key <AB08> { [ kana_NE, kana_comma ]	};
    key <AB09> { [ kana_RU, kana_fullstop ]	};
    key <AB10> { [ kana_ME, kana_middledot ]	};
    key <AB11> { [ kana_RO		]	};
    key <LCTL> { [ Control_L		]	};

    key <NFER> { [ Muhenkan		]	};

    key <XFER> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Henkan, Mode_switch ]
    };
    key <HKTG> {
	type[Group1]="PC_ALT_LEVEL2",
	symbols[Group1]= [ Hiragana_Katakana, Romaji ]
    };

    key <PRSC> {
	type[Group1]= "PC_ALT_LEVEL2",
	symbols[Group1]= [ Print, Execute ]
    };
};

partial alphanumeric_keys
xkb_symbols "nicola_f_bs" {
    key <BKSP> {
	type="",
	symbols[Group1]= [ bracketright, braceright ]
    };
    key <AE10> { [ 0, underscore        ] };
    key <AD11> { [ colon, asterisk      ] };
    key <AC11> { [ BackSpace, BackSpace ] };
    key <AC12> { [ Escape               ] };
    key <AB11> { [ at, grave            ] };
};

// Copied from macintosh_vndr/jp
partial alphanumeric_keys
xkb_symbols "mac" {
    name[Group1]= "Japanese (Macintosh)";
    include "jp(kana)"

    replace key <CAPS> { [ Caps_Lock ] };
};

partial alphanumeric_keys
xkb_symbols "hztg_escape" {
    replace key <HZTG> { [ Escape ] };
};

partial alphanumeric_keys
xkb_symbols "dvorak" {
    name[Group1]= "Japanese (Dvorak)";
    include "jp(OADG109A)"

    key <AE11> { [ at, grave		] };

    key <AD01> { [ colon, asterisk	] };
    key <AD02> { [ comma, less		] };
    key <AD03> { [ period, greater	] };
    key <AD04> { [ p, P			] };
    key <AD05> { [ y, Y			] };
    key <AD06> { [ f, F			] };
    key <AD07> { [ g, G			] };
    key <AD08> { [ c, C			] };
    key <AD09> { [ r, R			] };
    key <AD10> { [ l, L			] };
    key <AD11> { [ slash, question	] };

    key <AC02> { [ o, O			] };
    key <AC03> { [ e, E			] };
    key <AC04> { [ u, U			] };
    key <AC05> { [ i, I			] };
    key <AC06> { [ d, D			] };
    key <AC07> { [ h, H			] };
    key <AC08> { [ t, T			] };
    key <AC09> { [ n, N			] };
    key <AC10> { [ s, S			] };
    key <AC11> { [ minus, equal		] };

    key <AB01> { [ semicolon, plus	] };
    key <AB02> { [ q, Q			] };
    key <AB03> { [ j, J			] };
    key <AB04> { [ k, K			] };
    key <AB05> { [ x, X			] };
    key <AB06> { [ b, B			] };
    key <AB08> { [ w, W			] };
    key <AB09> { [ v, V			] };
    key <AB10> { [ z, Z			] };
};

// EXTRAS:

partial alphanumeric_keys
	xkb_symbols "sun_type6_suncompat" {
	include "sun_vndr/jp(sun_type6_suncompat)"
};

partial alphanumeric_keys
	xkb_symbols "sun_type6" {
	include "sun_vndr/jp(sun_type6)"
};

partial alphanumeric_keys
	xkb_symbols "sun_type7_suncompat" {
	include "sun_vndr/jp(sun_type7_suncompat)"
};

partial alphanumeric_keys
	xkb_symbols "suncompat" {
	include "sun_vndr/jp(suncompat)"
};

partial alphanumeric_keys
	xkb_symbols "sun_type7" {
	include "sun_vndr/jp(sun_type7)"
};

symbol/pc

default  partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {

    key <ESC>  {	[ Escape		]	};

    // The extra key on many European keyboards:
    key <LSGT> {	[ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {	[ backslash,	bar	]	};
    key <SPCE> {	[ 	 space		]	};

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {	[ BackSpace, BackSpace	]	};

    key  <TAB> {	[ Tab,	ISO_Left_Tab	]	};
    key <RTRN> {	[ Return		]	};

    key <CAPS> {	[ Caps_Lock		]	};
    key <NMLK> {	[ Num_Lock 		]	};

    key <LFSH> {	[ Shift_L		]	};
    key <LCTL> {	[ Control_L		]	};
    key <LWIN> {	[ Super_L		]	};

    key <RTSH> {	[ Shift_R		]	};
    key <RCTL> {	[ Control_R		]	};
    key <RWIN> {	[ Super_R		]	};
    key <MENU> {	[ Menu			]	};

    // Beginning of modifier mappings.
    modifier_map Shift  { Shift_L, Shift_R };
    modifier_map Lock   { Caps_Lock };
    modifier_map Control{ Control_L, Control_R };
    modifier_map Mod2   { Num_Lock };
    modifier_map Mod4   { Super_L, Super_R };

    // Fake keys for virtual<->real modifiers mapping:
    key <LVL3> {	[ ISO_Level3_Shift	]	};
    key <MDSW> {	[ Mode_switch 		]	};
    modifier_map Mod5   { <LVL3>, <MDSW> };

    key <ALT>  {	[ NoSymbol, Alt_L	]	};
    include "altwin(meta_alt)"

    key <META> {	[ NoSymbol, Meta_L	]	};
    modifier_map Mod1   { <META> };

    key <SUPR> {	[ NoSymbol, Super_L	]	};
    modifier_map Mod4   { <SUPR> };

    key <HYPR> {	[ NoSymbol, Hyper_L	]	};
    modifier_map Mod4   { <HYPR> };
    // End of modifier mappings.

    key <OUTP> { [ XF86Display ] };
    key <KITG> { [ XF86KbdLightOnOff ] };
    key <KIDN> { [ XF86KbdBrightnessDown ] };
    key <KIUP> { [ XF86KbdBrightnessUp ] };
};

partial hidden alphanumeric_keys
xkb_symbols "editing" {
    key <PRSC> {
	type= "PC_ALT_LEVEL2",
	symbols[Group1]= [ Print, Sys_Req ]
    };
    key <SCLK> {	[  Scroll_Lock		]	};
    key <PAUS> {
	type= "PC_CONTROL_LEVEL2",
	symbols[Group1]= [ Pause, Break ]
    };
    key  <INS> {	[  Insert		]	};
    key <HOME> {	[  Home			]	};
    key <PGUP> {	[  Prior		]	};
    key <DELE> {	[  Delete		]	};
    key  <END> {	[  End			]	};
    key <PGDN> {	[  Next			]	};

    key   <UP> {	[  Up			]	};
    key <LEFT> {	[  Left			]	};
    key <DOWN> {	[  Down			]	};
    key <RGHT> {	[  Right		]	};
};

コメント(1)

  1. mac嫌いのウィンドウズユーザー
    2016年10月7日(金) 08:15

    貴重な記事と設定の公開ありがとうございます
    autohotkeyぐらいキー設定の敷居が下がればlinuxに移行するのですが、、、

    linuxを触る人達がこう言った効率化に力を入れないのが不思議でなりません。

新しいコメントを投稿




  • カテゴリ ナビ
  • 著者紹介

    ブログが趣味で、 月間1,000万PV を達成しました。

    自分が困ったことをブログに書けば、次に困る人の参考になって、みんながみんな同じ苦労をせずに済む、というのが原点です。

    最近の関心は、スマホやパソコンに詳しくない人の行動や思考、 そしてそんな人を手助けする方法や枠組み。 また、それに関連するような、"身近な"セキュリティ。

    ※SNS(特にTwitter)でシェアされた記事は、内容の追加・更新を行っています。 必ず、ではありませんが、気に入った記事は積極的にシェアしてみてください。

    RSS | Facebook | Twitter | About