Vintage mode
Sublime TextをVim風に扱えるプラグイン。
有効化
初めから入っているプラグインだが、無効化されている。
{ ... "ignored_packages": ["Vintage"], ... }ユーザー設定で、ignored_packagesを上書きし、無効の対象から外す。
{ ... "ignored_packages": [], ... }
キーバインド設定
Vimとの違い
元来のVimでのキー設定変更は.vimrcに記述することで可能になる。 一方、Sublime Textではキーバインド設定ファイルに記述する。
.vimrcでは、キーを主体として記述できる。つまり、「Aを押したらBを押したのと同等の操作にする」というような記述ができる。各キーのデフォルト機能を把握していればあまり迷う余地なく自由に記述でき、機能の組み合わせもしやすい。
一方、Sublime Textの設定ファイルは、キーを押下した時の挙動を直接アプリケーションのAPI名で記述する。逐一APIを調べる必要があるため面倒だが、エミュレーションの宿命か。
設定方法
どんなAPIをどのように使えるかは、(Sublime Text)\Packages\Vintage.sublime-package
の中身を見る。
.sublime-packageは拡張子を.zipに変更すると解凍できる。解凍すると、Default.sublime-keymap
というファイルが見つかる。テキストエディタで開くとずらっと設定が並んでいるので、似たような機能を探し、Sublime Text\Data\Packages\User\Default (Windows).sublime-keymap
にコピーして編集する。
下は、vimでFの機能に当たる、「続けて入力した文字の位置まで前方にカーソル移動」をJにも割り当てた例。
- command: 大まかな機能を指定
- args: commandによって変わる。機能に引き渡す設定群
- context: どのようなモードのときに使うか
... { "keys": ["j", "<character>"], "command": "set_motion", "args": { "motion": "vi_move_to_character", "motion_args": {"extend": true }, "inclusive": true, "clip_to_line": true }, "context": [{"key": "setting.command_mode"}] }, ...
自分で作る
しかし、一部の機能はキーバインドファイルの編集だけでは動かない。上の例で言うと、例えば「Jを押しただけで、同じ行の':'の位置までカーソル移動」などはできない。“vi_move_to_character”というモーションが、続けて入力した文字“character”を引数として渡すように作られているからだ。この引数を好きな文字にすることは、キーバインド設定からだけではできない。
プラグインを自作し、それをキーバインドのcommandに設定すれば、できるようになる。
(Sublime Text)\Data\Packages\User\MyVintageEx.py
などのファイルを作成し、Pythonで記述する。どんな風に記述すればよいかは、先ほど解凍したsublime-packageの中のvintage.py
を参考にする。
import sublime, sublime_plugin from Vintage.vintage import g_input_state from Vintage.vintage import update_status_line class SetRegisterBlackhall(sublime_plugin.TextCommand): def run_(self, edit_token, args): return self.run() def run(self): g_input_state.register = '_' update_status_line(self.view)上は、レジスタに“_”(ブラックホールレジスタ、このレジスタにヤンクなどしても捨てられる)を設定するプラグインの例。
1行目はSublime Textのプラグインなら(Vintageに限らず)お決まりのimport。2行目から、自作プラグインの中で使いたいクラスや変数をimportする。
まずrun_()が呼ばれる。argsには、sublime_plugin.TextCommandを継承した場合、続けて入力された文字が入っていると思われる(たぶん)。でも今回は使わないのでそのままrun()をコール。run()でメイン処理を行う。
プラグインは保存したら自動的に再読み込みされる。デバッグには、コンソールを表示させるとログが吐き出されている。
そしてキーバインドに戻る。コマンド名は、自動的にクラス名のスネークケース(全部小文字、単語の切れ目は“_”)が使えるようになっている。
{ "keys": ["-"], "command": "set_register_blackhall", "context": [ { "key": "setting.command_mode" } ] },
これで「現在行のテキストを削除したいけど、今ヤンクされてる文書は残しておきたい」なんて時、「“_dd」とするところを「-dd」と、レジスタの切り替えを意識せず楽に削除できる。