Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5657

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

$
0
0

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

  • たぶん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 keysMapped KeysLikeUsage
Hyper + hVimCursor key
Hyper + jVimCursor key
Hyper + kVimCursor key
Hyper + lVimCursor key
Hyper + ;BackSpaceOriginalBackspace
Hyper + xBackSpaceOriginalBackspace
Hyper + :DeleteOriginalDelete
Hyper + aHomeEmacsMove cursor to the head of line
Hyper + eEndEmacsMove cursor to the end of line
Hyper + mEnterEmacsEnter key
Hyper + Ctrl + [EscVimEsc (Mapped with AutoKey)
Hyper + Ctrl + @EscVimEsc (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 keysMapped KeysLikeUsage
Hyper + Shift + bCtrl + ←VimMove cursor to the head of word
Hyper + Shift + wCtrl + Shift + →VimSecelt the range from current cursor to the head of word
Hyper + wCtrl + →VimMove cursor to the end of word
Hyper + Shift + wCtrl + Shift + →VimSecelt the range from current cursor to the end of word
Hyper + oEnd -> EnterVimMake a line below current cursor
Hyper + Shift + o↑ -> End -> EnterVimMake a line above current cursor

Shortcut (Mapped with Autokey)

あとはショートカットですね。
個人的には、Ctrl + xCtrl + cCtrl + vが隣にあるのが
とても気に食わないんですよね。
コピーしようと思ったらペーストしてもうたやんけ!しばくぞ!
とよくなっちゃいます。
ということで、dやらyやらpやらに振っています。

ddyyは再現するのが難しかったので、Shift + dShift + yだけ再現しました。
(Shift + yは標準にはなかったっけ?勝手に.vimrcに追加してるだけかも)

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

あとCtrl + zは押すときに指が窮屈になるので好きくありません。
Ctrl + Shift + zでRedoも、押し間違えのリスクがあって好きくありません。
なのでuCtrl * rで再現しました。

Pushed keysMapped KeysLikeUsage
Hyper + uCtrl + zVimUndo
Hyper + Ctrl + rCtrl + Shift + zVimRedo
Hyper + yCtrl + cVimCopy
Hyper + Shift + yCtrl + End -> Ctrl + c -> →VimCopy the range from current cursor to the end of line
Hyper + dCtrl + xVimCut
Hyper + Shift + dCtrl + Shift + End -> Ctrl + xVimCut the range from current cursor to the end of line
Hyper + pCtrl + vVimPaste

vscode使いへ

vscodeで使うときはKeyboard: DispatchをkeyCodeにするといいと思うよ
こうするとvscodeの一部のショートカットの挙動がびみょくなるかもだから、
そのときはvscodeのkeyboard shortcutsをいじったら治るよ

その他

パソコンが物故割れても責任は取れませんTT
なにか質問があればどうぞ。


Viewing all articles
Browse latest Browse all 5657

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>