Milkのメモ帳

日々の思いつきを忘れないようにのメモ用です。

Milkのメモ帳

【Ubuntu】カーソル移動を自分好みにカスタマイズしよう


以前、

www.milkmemo.com

として、Vim風のカーソル移動をWindows環境で再現しました。

(再現なんて言っても、フリーソフト入れるだけだし。)

今私は、メインで使っているのはUbuntuというOSを使用しています。

UbuntuってVim入ってんじゃん。って突っ込まれるのは百も承知。

でも、私がしたいのは”全てのアプリケーション”でVim風にカーソル移動操作がしたい!ってことなんです。


カーソル移動を実現する

今、それとなく動いているので忘れないようにメモを残します。

と言っても、以下のブログさんの内容を基本的に踏襲してます。

bearmini.hatenablog.com

とても助かりました。ありがとうございます。

Keycodeを調べる

キーバインドをいじるためには、そもそもキーに対して何の番号が割り振られているかを確認する必要があります。

では、そのキーの番号を探してみましょう。まずはターミナル(端末)を起動します。

Ubuntuの場合は、Ctrl+Alt+T です。ではターミナルに以下を打ち込みます。

$ xev

すると以下の様な状態になると思います。

f:id:maxminkun:20160523085508p:plain

この状態で、カーソル移動等で使用するキーを押してみましょう。

私の場合は、「h」キーをカーソルの左移動として使用したいので、押してみました。すると以下のように結果が帰ってきます。

KeyPress event, serial 37, synthetic NO, window 0x4600001,
    root 0x291, subw 0x0, time 27527236, (-735,-162), root:(420,279),
    state 0x10, keycode 43 (keysym 0x68, h), same_screen YES,
    XLookupString gives 1 bytes: (68) "h"
    XmbLookupString gives 1 bytes: (68) "h"
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x4600001,
    root 0x291, subw 0x0, time 27527316, (-735,-162), root:(420,279),
    state 0x10, keycode 43 (keysym 0x68, h), same_screen YES,
    XLookupString gives 1 bytes: (68) "h"
    XFilterEvent returns: False

keycode という文字が見えますねー。どうやら「h」キーはkeycode 43 として割り当てられているようです。

必要なキーはこの時に調べておきます.例えば、私は「無変換」キーを押しながら「h」を押すとしたいので、「無変換」キーも調べておきました。

.Xmodmapファイルを作成する

さて、この後に .Xmodmapファイルを作成します。作成場所は$HOMEの直下にします。因みに、ファイル名の前に"."をつけると隠しファイルになります。

.Xmodmap は基本的に以下のように記述します。

keycode XX = [キーを押した時] [Shift+キーを押した時] [Mode_switch+キーを押した時] [Mode_switch+Shift+キーを押した時]

つまりはこんな感じです。

clear Lock
remove Control = Mode_switch
keycode 102 = Mode_switch
keycode 100 = Mode_switch
keycode 66 = Mode_switch
keycode 29 = y Y Prior Prior
keycode 30 = u U Home Home
keycode 42 = g G BackSpace BackSpace
keycode 43 = h H Left Left
keycode 44 = j J Down Down
keycode 45 = k K Up Up
keycode 46 = l L Right Right
keycode 56 = b B Next Next
keycode 57 = n N End End
keycode 53 = x X Delete Delete
keycode 65 = space NoSymbol Return

Mode_switchキーは、一般的なキーボードには割り当てられていないようです。その部分を利用します。

Mode_switchの機能を、keycode 102 (無変換キー)に割り当てるのです。

後は、必要なキーに対して、Mode_switchが押された際に動作してほしい内容を列挙します。

.Xmodmapファイルをコマンドで読み込ませる

このファイルの準備が整えば、後はターミナルを起動し、コマンドで強制的に読み込ませキーバインドを一時的に変更させます。

$ sudo xmodmap ~/.Xmodmap 

こうすれば、無変換キーを押しっぱなしの時だけhjklで上下左右にカーソルが動く、なんちゃってVim操作が完成です。


最後に

少々面倒なのは、入力メソッドが変更されるとデフォルトに戻ってしまうことです。

残念ではありますが、その場合は先程のコマンドを打ち直して下さい。

幾分、Ubuntuの超初心者でありますので、何か間違い等ありましたら教えて下さい。

因みに、Ubuntuで推奨されているキーバンドの変更方法はxkbを操作するというものです。

これも一応試したのですが、Android Studioでは効かないと言う事象が出たので、今回紹介したXmodmapを利用する方法に戻しました。

ではでは!!