OSがLinuxのPCでキーボードマッピングを行う

# 2021/05/08
@shiracamus　さん ご教授ありがとうございます．
numlockに関しては一切考えてませんでした．
フルサイズキーボードではないから
ということで関係ないだろうと思ってました．
教えて頂きありがとう御座います．
BIOSを確認次第，他の方に参考になるような情報があれば追記いたします．

書き漏れがあったので追記
起動するたびに設定を読み込んでくれないと困るので，rc.localに記載します．

```
$ touch /etc/rc.local #無ければ作成
$ vi /etc/rc.local

xmodmap /home/your-username/.Xmodmap
```



# 設定PCのスペックやOSなど

メーカー：jumper
モデル：jumper-EZBOOK-X4
製品リンクは以下

https://www.amazon.co.jp/EZbook-X4-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3-14-1%E3%82%A4%E3%83%B3%E3%83%81-%E3%83%90%E3%83%83%E3%82%AF%E3%83%A9%E3%82%A4%E3%83%88%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89/dp/B07R586HD6

OS：Linux Mint 20 Ulyama
CPU:Intel celeron j3455
ストレージ：SSD(128GB)標準搭載です．
メモリ：４GB
キーボード配列：US

密林で3万円位で購入できます．
初期状態ではWin10が入ってますが，動きがモッサリで使い物になりません．

# 状況
キーボードのh,j,k,u,iを入力すると数字が入力される．
ログイン画面でパスワードが違いますという表示が出て初めて発覚．
いつもは無線のキーボードを使っていたため，気づかなかった．

#　じゃあ，直して行くよっと
大まかにやったことは２つ
①キー配列(ソフト側)を変更→結果的に失敗
②１から割り当てる

## キーボード配列(ソフト側)を変更する
まず最初に思い浮かぶのは，US配列に変えてしまえばいいんじゃね？
キーボード配列を確認，日本語配列となっている．
US配列にしてみる．
日本語入力のためにfcitx-mozcをインストールしているが，US配列だと動かない．
US配列だと日本語打てない．
日本語配列だと，そもそもキーボードの出力がおかしい．

はい，ダメ．

## 半ば強引に１から割り当てる
じゃあ，US配列で日本語打てるようにして，半角全角キー割り当てて，パイプ機能を使うために ｜ も割り当てればいいんでしょ！
くそだりぃなまじで．
やっていきましょう．

### まずはキー押下時の反応を探る
ターミナルを立ち上げます．
ディレクトリの場所はどこでもいいですが，最終的にホームディレクトリに設定ファイルを記述します．
xevと打ち込むと，白いウィンドウとターミナル上に変な出力が出てきます．
そこで試しにキーボードの **e** を押してみます
すると以下の出力が得られます． 
上のブロックはキーが押されたときの出力情報
**KeyPress event 〜〜〜**
下のブロックはキーが離されたときの出力情報 
**KeyRelease event　〜〜〜**

```
user@mint43 $ xev
KeyPress event, serial 38, synthetic NO, window 0x4a00001,
root 0x5e1, subw 0x0, time 1704948, (658,339), root:(1529,791),
state 0x10, keycode 26 (keysym 0x65, e), same_screen YES,
XLookupString gives 1 bytes: (65) "e"
XmbLookupString gives 1 bytes: (65) "e"
XFilterEvent returns: False
  
KeyRelease event, serial 38, synthetic NO, window 0x4a00001,
root 0x5e1, subw 0x0, time 1705098, (658,339), root:(1529,791),
state 0x10, keycode 26 (keysym 0x65, e), same_screen YES,
XLookupString gives 1 bytes: (65) "e"
XFilterEvent returns: False
```

上記の**keycode 26**という情報がほしかった情報である．
これをひたすら行い，すべてのキーに対して行います．
※私はすべて調べて，出力がおかしいキーだけ割り当てしなおしました．

### キー押下時の設定をファイルに記述していく
前段階で取得したキーコードを設定ファイルに書き込んでいく．

```
pwd
/home/your-username/
vi .Xmodmap
```
以下，.Xmodmap内部
※表示及び保存の関係上，テキスト形式でアップしています．

```text:xmodmap.txt
  keycode 11 = 2 quotedbl
  keycode 15 = 6 ampersand
  keycode 79 = 7 apostrophe
  keycode 80 = 8 parenleft
  keycode 81 = 9 parenright
  keycode 63 = 0
  keycode 83 = u U
  keycode 84 = i I
  keycode 85 = o O
  keycode 106 = p P
  keycode 34 = at grave
  keycode 35 = bracketleft braceleft
  keycode 51 = bracketright  braceright
  keycode 88 = k K
  keycode 89 = l L
  keycode 82 = semicolon plus 
  keycode 48 = colon asterisk
  keycode 90 = m M
  keycode 91 = period greater
  keycode 86 = slash 
  keycode 62 = backslash underscore
```

上記のように記入する．
読みかたは **keycode 106 = p P**ならば，
pを押すと，pを出力
Shift + p を押すと Pを出力

### キーマップの正式名称わからないよ．ぴえん．
アルファベットならわかるけど，キーボード上の記号とかの正式名称わからいよ．ぴえん．という方いると思います．

その場合の調べ方は以下の手順で調べます．

```
setxkbmap -print

xkb_keymap {
xkb_keycodes  { include "evdev+aliases(qwerty)"	};
xkb_types     { include "complete"	};
xkb_compat    { include "complete+japan"	};
xkb_symbols   { include "pc+jp+inet(evdev)"	};
xkb_geometry  { include "pc(pc105)"	};
};
```

この中の**symbols**が必要
これシンボル以外の情報はなんなのか知りません．
symbolsを見に行かなければいけません．
人によってディレクトリの場所が異なることは無いと思いますが，異なった場合は探してみて下さい．

```
cd /usr/share/x11/xkb/symbols
vi jp #エディタviでやってますが，nanoやgeditなど何でも可

cat jp #これだとすべてターミナル上に出力されます
```

以下，jp内部

```
default  partial alphanumeric_keys
  xkb_symbols "106" {
  
  include "jp(common)"
  name[Group1]= "Japanese";
  
  key <AE10> { [ 0, asciitilde	] };
  key <AE13> { [ backslash, bar	] };
  };
  
  hidden partial 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 <AE10> { [ 0,] };
  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 <AD13> { [ bracketright, braceright ] };
  
  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 <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		] };
```

この莫大なキーセットの中から探して下さい．

### この設定を反映します

```
usr@mint43 $ xmodmap .Xmodmap

以下のようなエラーが出なければ成功です．
xmodmap:  unknown command on line .Xmodmap:2
xmodmap:  1 error encountered, aborting.
```

大抵はスペルミス　or キーセット名が間違ってます．
根気強く設定して下さい．

USキーボードだと`|`のボタン無いじゃん！
そう思った方は`Shift + 0`に割り当てて下さい．

### 参考までにキーセット一覧表

| 文字 | キーセット | 文字 | キーセット |
|:-----------:|:------------:|:-----------:|:------------:|
| 全角半角 | Zenkaku_Hankaku | ! | exclam |
| " | quotedbl | # | numbersign |
| $ | dollar | % | percent |
| ' | ampersand | ( | parenleft |
| ) | parenright | - | minus |
| = | equal | ^ | asciicircum |
| ~ | asciitilde | 縦棒 | bar |
| @ | at | ` | grave |
| [ | bracketleft | { | braceleft |
| ; | semicolon | + | plus |
| : | colon | * | asterisk |
| ] | bracketright | } | braceright |
| , | comma | < | less |
| . | period | > | greater |
| / | slash | ? | question |
| \ | backslash | _ | underscore |


# 参考にしたサイト

https://qiita.com/jabberwocky0139/items/40b28406daa6769a9c4d#fn4


http://technique.sonots.com/?UNIX/%E8%A8%AD%E5%AE%9A%E3%80%81%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB/.Xmodmap