見出し画像

ChromebookでEmacsキーバインドを使う

こんにちは、junkawaです。

Colaboratoryを使うようになって、あらためて実感したのが、ブラウザの入力フィールドでEmacsキーバインドを使いたい!です。

文字移動や行移動のために、いちいちカーソルキーまで手を動かすのがムダでしょうがない。

Ctrl-n や Ctrl-p で新しいウィンドウが開いたり、印刷画面になったりでうっとおしい。

以前から、ChromebookでEmacsキーバインドを使う方法を調べていたのですが、今まで見つけられませんでした。

ところが昨日、急に見つけることができました。

自分の検索力の無さを実感した次第です。

使い方

entoさんのリポジトリをフォークさせていただいて、日本語キーボード用にマニフェストファイルを変更したものをGitHubに上げました。

1. 拡張機能をダウンロードする

「Clone or download」から「Download ZIP」でダウンロードします。

ダウンロードしたzipファイルを解凍します。

2. 拡張機能を読み込む

chrome://extensions/ を開きます。

右上の「デベロッパーモード」を有効にして、「パッケージ化されていない拡張機能を読み込む」をクリックします。

先程解凍した、zipファイルフォルダ chromeos-key-remapper-master の中にある remapper フォルダを選択します。

3. 入力方法を選択します

chrome://settings/languages を開いて「入力方法を管理」をクリックします。

Google 日本語入力 と JP x emacs を選択します。

これで、Ctrl-スペースで、Google日本語入力とJP x emacsを切り替えることができます。

JP x emacs に切り替えた状態で、Emacsキーバインドを使うことができます。

英字キーボードの人

英字キーボードの場合はこうなります。

Google日本語入力(USキーボード)と US x emacsを選択しています。

それ以外のキーボードの人

chromeos-key-remapper-master / remapper / manifest.json を編集します。

    {
     "name": "JP x emacs",
     "type": "ime",
     "id": "io.github.ento.cros_key_remapper_jp",
     "description": "JP keyboard with emacs-like cursor movement",
     "language": "ja",
     "layouts": ["jp"]
   }

上記は日本語キーボード用の設定です。

変更する箇所は最低3箇所 (id、language、layouts)です。

idは入力方法の中で一意に決まる文字列でなければならないので、_jpの部分を適当な値(例えばドイツならdeなど)に変えます。

languageは言語設定です。ドイツならde。

layoutsはキーボードレイアウト設定です。ドイツならde。

その他、nameやdescriptionをお好みで変えても構いません。

機能

const keymap = [
  {'match': 'C-a', 'emit': ['Home']}, // cursor: beginning of line
  {'match': 'C-e', 'emit': ['End']}, // cursor: end of line
  {'match': 'C-f', 'emit': ['ArrowRight']}, // cursor: forward one character
  {'match': 'C-b', 'emit': ['ArrowLeft']}, // cursor: back one character
  {'match': 'C-p', 'emit': ['ArrowUp']}, // cursor: previous line
  {'match': 'C-n', 'emit': ['ArrowDown']}, // cursor: next line
  {'match': 'C-k', 'emit': ['S-End', 'Backspace']}, // cursor: cut to end of line
  {'match': 'C-h', 'emit': ['Backspace']}, // cursor: backspace
  {'match': 'C-d', 'emit': ['Delete']}, // cursor: delete one char
  {'match': 'M-a', 'emit': ['C-KeyA']}, // C-a replacement: for select all
  {'match': 'M-b', 'emit': ['C-KeyB']}, // C-b replacement: for boldening text on paper
  {'match': 'M-n', 'emit': ['C-KeyN']}, // C-n replacement: for opening a new window
  {'match': 'M-k', 'emit': ['C-KeyK']} // C-k replacement: for Slack channel switcher
];

chromeos-key-remapper-master / remapper / keymap.js の中身です。
これを編集すれば、好きなキーバインディングを設定できます。

C-a は、Ctrlキーとaキーの同時押しを意味します。
M- は、Altキーです。

あとがき

paizaの機械学習入門(CV上坂すみれさん)の動画を見ながら、JupyterNotebookを編集していて、編集のやりにくさにウガーとなったのが、Emacsキーバインドを本気で探すことになったきっかけです。

最初に見つかったのが、こちらのページです。

IMEを使って入力をフックするという発想に気づいてからは、芋づる式に検索できました。

上記を参考に、自作のIMEをちょろっと作って動作確認ができた後に、entoさんのプログラムを見つけ、結局乗り換えることにしました。

termux、crosh、caretなどがどうやってEmacsキーバインディングしているのか気になっていたのですが、おそらく独自のIMEを使っているのでしょう。それが理由で、日本語入力が使えないのかな。

ご覧下さりありがとうございます。いただいたサポートは図書館への交通費などに使わせていただきます。