LoginSignup
5
2

More than 3 years have passed since last update.

Vimライトユーザーのための「Vim以外でVimする」

Last updated at Posted at 2020-05-16

この記事を見たらできるようになること

  • たぶん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に似ているwCtrl + →を割り当ててみました。

Ctrl + →はどっちかというとeに近いんだけどね。
でも所詮eとも細かいところは違うから、どっちだっていいや。

同様にbCtrl + ←を割り当てています。

あとは、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 + xCtrl + cCtrl + vが隣にあるのが
とても気に食わないんですよね。
コピーしようと思ったらペーストしてもうたやんけ!しばくぞ!
とよくなっちゃいます。
ということで、dやらyやらpやらに振っています。

ddyyは再現するのが難しかったので、
Ctrl + dCtrl + yというホットキーにしました。

そうすると、aで行頭に戻ってShift + d (y)で削除(ヤンク)できるのでまあいいかと。
EmacsでいうCtrl + a -> Ctrl + k的な? Emacs詳しくないから知らんけど。

あとCtrl + zは押すときに指が窮屈になるので好きくありません。
Ctrl + Shift + zでRedoも、押し間違えのリスクがあって好きくありません。
なのでuCtrl * 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
なにか質問があればどうぞ。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2