この記事を見たらできるようになること
- たぶんLinux全般
- どんなアプリケーション上でも、変換キー(任意のキーに変更可能)を押している間、Vimのノーマルモードを擬似的に再現できるようになる
- Vimだとホームポジションから遠いキーバインドはEmacsのものを採用しています
この記事の対象者
中途半端にVimの世界に足を踏み入れてしまい、以下のような状況の方
- Vimのキーバインドがないとイライラしちゃう
- でも、常にVimを起動させておいて、Vimで書いて他のアプリにヤンクする、というほどの中毒者ではない
- Vimで開発環境を完璧にするのも面倒でついついIDEを使っちゃう
- vscodeでvimバインドを使うと、vscode本体のキーバインドと食い合ってムキーってなっちゃう
とりあえずやってみたい人のための奴
①このレポジトリを適当な場所にクローンする
【迷ったらこれ】
ターミナル上で以下を入力
$ cd && git clone https://github.com/mojamozya/allapps-vimlike.git
②bashrcとかに以下を追記
【迷ったらこれ】
$ echo 'xkbcomp -I$HOME/allapps-vimlike/.xkb ~/allapps-vimlike/.xkb/keymap/mykbd $DISPLAY 2> /dev/null' >> ~/.bashrc
とりあえずこれでレポジトリのSimply mapped (Mapped with XKB)って書いてる奴はできるようになるよ
起動時にターミナル立ち上げる設定にしてない人は、起動させる度にターミナル立ち上げてください
③Autokeyをインストールする
$ sudo apt install autokey-gtk
Gnomeじゃない人はautokey-qtとかかも、しらんけど
④autokeyの画面を開く
$ autokey
⑤ダウンロードしたレポジトリをAutokeyで有効にする
Autokeyの仕様上、ここがちょっとややこしいです。
とりあえずautokeyにデフォルトで入っているフォルダとかフレーズとかは全部削除しちゃって構いません。
Autokeyの画面にて、メニューバーのFile -> New -> Folder を選んだ後、
Use Default を選択し、generalというフォルダをデフォルトの場所に作ってください。
~/.config/autokey/dataにgeneralというフォルダができている筈なので、
そこにallapps-vimlike/.autokey/general/vimlikeのシンボリックリンクを作ります。
【迷ったらこれ】
Autokeyの画面から上述の通りにgeneralというフォルダをデフォルトの場所に作ったあと、
$ ln -s ~/allapps-vimlike/.autokey/general/vimlike ~/.config/autokey/data/general
⑥動作チェックして問題なければ、autokeyを起動時に立ち上がるようにする
ubuntuとかならsessionに追加すればいいだけですが、
他のディストリビューションの人は自分で調べてみてください。
bashrcにautokeyとか追加してもいいかもしれませんが、
ターミナルが立ち上がる度にautokeyが再起動されるのは、ちょっとダルいかも
使い方
- Autokeyを起動させた状態
- xkbcompでxkbの設定ファイルを読み込んだ後
なら使えます。
変換キーがをHyperキーにマッピングしているので、
キーマッピングはHyper = 変換 と読んでください。
変換キー以外をHyperにする方法はまあたぶんxkbまわりのソースの雰囲気見れば分かるよ。
需要があれば具体的な方法も書きますが地味に面倒なので割愛します。
キーマップ紹介と補足
(単純なキーマップはレポジトリにも書いてあります)
シンプルなやつ
Vimと同じくカーソルはhjklです。
つまり変換キーとhjklを同時に押せば、それぞれカーソルキーになります。
EscはCtrl+[と、小指が届かなかったとき対策のCtrl+@にも振っています。
(僕はよく[と@を押し間違えます)
ポイントとしては、;と:にそれぞれBackSpaceとDeleteを振っているところでしょうか。
元来のVimほど削除の小回りが聞くわけではないので、
;を押すことで削除をすることによって、Vimっぽくはないものの普通に便利なショートカットにしています。
(ただ小指で;を連打すると疲れるので、iあたりをBackSpaceにするのもいいかもしれませんね。)
:はまあそのノリで、「Backspaceの右側を押したら、カーソルの右側が消えるよ」という感覚でしょうか。
Vimな気分が強いときはxを押します。どっちでもいいと思います。
a と e をEmacs風のキーバインドにしているのも特徴です。
変換キーと同時押しする都合上、
^を押すときにも多少のストレスがかかり、
Shift + $ を押すときには、
喫煙者が3時間タバコを吸えていないときぐらいストレスがかかります。
なので、ここにはEmacのキーバインドを採用してみました。
- aはアルファベットの先頭だから行頭、
- eはend of line のe
とでも覚えてみるのもいいかもしれませんね。
| Pushed keys | Mapped Keys | Like | Usage |
|---|---|---|---|
| Hyper + h | ← | Vim | Cursor key |
| Hyper + j | ↓ | Vim | Cursor key |
| Hyper + k | ↑ | Vim | Cursor key |
| Hyper + l | → | Vim | Cursor key |
| Hyper + ; | BackSpace | Original | Backspace |
| Hyper + x | BackSpace | Original | Backspace |
| Hyper + : | Delete | Original | Delete |
| Hyper + a | Home | Emacs | Move cursor to the head of line |
| Hyper + e | End | Emacs | Move cursor to the end of line |
| Hyper + m | Enter | Emacs | Enter key |
| Hyper + Ctrl + [ | Esc | Vim | Esc (Mapped with AutoKey) |
| Hyper + Ctrl + @ | Esc | Vim | Esc (Mapped with AutoKey) |
カーソルをマクロっぽい感じで動かすやつ
ここからはちょっとだけ複雑なことをしています。
{Ctrl + カーソルキーでなんかいい感じにカーソルを移動させてくれるのって、 IMEの機能?OSの機能? そんなことは知りませんが、ちょっとだけVimのeとかb`っぽい挙動になってくれるのです。
でもeをEmacsバインドで使っちゃってるので、
挙動がeに似ているwにCtrl + →を割り当ててみました。
Ctrl + →はどっちかというとeに近いんだけどね。
でも所詮eとも細かいところは違うから、どっちだっていいや。
同様にbに Ctrl + ←を割り当てています。
あとは、oとかね。
Endキーで行末に移動してからEnterキーを押すマクロを設定することで、
擬似的にVimのoを再現しています。
Shift + oの再現の仕方は難しい。
IDEのインデントをいい感じにしたいならこのまま。
一番上の行にいるときにも作動させたいなら、Home -> Enter -> ↑かな?
| Pushed keys | Mapped Keys | Like | Usage |
|---|---|---|---|
| Hyper + Shift + b | Ctrl + ← | Vim | Move cursor to the head of word |
| Hyper + Shift + w | Ctrl + Shift + → | Vim | Secelt the range from current cursor to the head of word |
| Hyper + w | Ctrl + → | Vim | Move cursor to the end of word |
| Hyper + Shift + w | Ctrl + Shift + → | Vim | Secelt the range from current cursor to the end of word |
| Hyper + o | End -> Enter | Vim | Make a line below current cursor |
| Hyper + Shift + o | ↑ -> End -> Enter | Vim | Make a line above current cursor |
Shortcut (Mapped with Autokey)
あとはショートカットですね。
個人的には、Ctrl + xとCtrl + cとCtrl + vが隣にあるのが
とても気に食わないんですよね。
コピーしようと思ったらペーストしてもうたやんけ!しばくぞ!
とよくなっちゃいます。
ということで、dやらyやらpやらに振っています。
ddやyyは再現するのが難しかったので、
Ctrl + dとCtrl + yというホットキーにしました。
そうすると、aで行頭に戻ってShift + d (y)で削除(ヤンク)できるのでまあいいかと。
EmacsでいうCtrl + a -> Ctrl + k的な? Emacs詳しくないから知らんけど。
あとCtrl + zは押すときに指が窮屈になるので好きくありません。
Ctrl + Shift + zでRedoも、押し間違えのリスクがあって好きくありません。
なのでuとCtrl * rで再現しました。
| Pushed keys | Mapped Keys | Like | Usage |
|---|---|---|---|
| Hyper + u | Ctrl + z | Vim | Undo |
| Hyper + Ctrl + r | Ctrl + Shift + z | Vim | Redo |
| Hyper + y | Ctrl + c | Vim | Copy |
| Hyper + Ctrl + d | Home -> Shift + End -> Ctrl + c -> ← | Vim | Cut |
| Hyper + Shift + y | Ctrl + End -> Ctrl + c -> → | Vim | Copy the range from current cursor to the end of line |
| Hyper + d | Ctrl + x | Vim | Cut |
| Hyper + Ctrl + d | Home -> Shift + End -> Ctrl + x -> Delete | Vim | Cut |
| Hyper + Shift + d | Ctrl + Shift + End -> Ctrl + x | Vim | Cut the range from current cursor to the end of line |
| Hyper + p | Ctrl + v | Vim | Paste |
vscode使いへ
vscodeで使うときはKeyboard: DispatchをkeyCodeにするといいと思うよ
こうするとvscodeの一部のショートカットの挙動がびみょくなるかもだから、
そのときはvscodeのkeyboard shortcutsをいじったら治るよ
その他
パソコンが物故割れても責任は取れませんTT
なにか質問があればどうぞ。