スポンサーリンク
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の設定を切ればこの状態自体をとりあえずは解決可能)。
参考
基本的に設定はここを参考にしました:xkbを使って修飾キー有のキーバインドを設定する - jou4のブログ
- [xkb] Ubuntu 14.04 で Caps Lock を別のキーにする方法 - ill-identified diary(xkbの設定の概要など。やり始める前に読むと良かったかも)
- x11 - Declare a new modifier key with XKB - Unix & Linux Stack Exchange
- X KeyBoard extension - ArchWiki
- The X Keyboard Extension: Protocol Specification
- Ivan Pascal (Homepage)
- Xorg でのキーボード設定 - ArchWiki
- remapping - XKB - remap arrow keys and preserve shift behaviour to select text - Super User(preserve)
- x11 - Declare a new modifier key with XKB - Unix & Linux Stack Exchange(virtual modifiers)
- theqvd/pc at master · theqvd/theqvd(modMapMods)
- /usr/share/X11/xkb/compat/misc(modMapMods)
- [GNU/Linux][xkb] Remapper une touche dont on ne connait pas le nom (Page 1) / Coin des bidouilleurs / Forum bépo
- /usr/share/X11/xkb/types/pc
- x11 - How to set up XKB to work with 3 modifier keys and 2 switchable layouts? - Unix & Linux Stack Exchange
キーの参考
設定時に、キーボードに印刷された表記を設定するのではなく、わかりにくいため、参考資料を貼っておきます。
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)
新しいコメントを投稿
スポンサーリンク
|HOME|
『vimのsudo忘れで保存できないときの対策メモ』 OLD >>
2016年10月7日(金) 08:15
貴重な記事と設定の公開ありがとうございます
autohotkeyぐらいキー設定の敷居が下がればlinuxに移行するのですが、、、
linuxを触る人達がこう言った効率化に力を入れないのが不思議でなりません。