Sublime Text のキーボードショートカットにモードを導入する
文字や行を選択中の動作と、行選択なしで動作を切り替えたい時がありませんか。
わたしは、Ctrl+タブキーで、複数タブの切り替えとインデントをよく使います。
vim なら モードですよね。アレっぽいやつをやりたいです。
EmEditorなら、「選択行をインデント」とコマンドが別に用意されています。
Sublime Textで設定する方法
{ "keys": ["ctrl+tab"], "command": "indent", "context": [ { "key":"selection_empty", "operator": "equal", "operand": false } ] }, { "keys": ["ctrl+shift+tab"], "command": "unindent", "context": [ { "key":"selection_empty", "operator": "equal", "operand": false } ] },
と、キー設定(user defaults ) を記入すればおっけ。
これでCtrl+TABでウィンドウ中のタブ切り替え、選択行のインデントの両方を実現することが出来ます。もうね、コレができれば最高ですね。
解説
context でキーボードショートカットが発火する条件を設定する
{ "keys": ["ctrl+tab"], "command": "indent", "context": [ //ここに条件を列挙する ] },
context には 配列を入れる
[ { "key":"selection_empty", "operator": "equal", "operand": false } ]
context に入れる条件は、if文の中身を簡単にJSONと配列で列挙したものである
文字選択中だけCTRL+TABをインデントにした場合
selection_empty ( 選択範囲が空かどうか、空ならTrue)をチェックしている。
{ "key":"selection_empty", "operator": "equal", "operand": false }
JSでいうところの、次のような条件式だと解釈できる。
selection_empty() == false
複数の条件下でも大丈夫。
あとはこの条件が配列なので、ORで満たせばイイ。(正確にはちょっと違うけど
if ( (selection_empty() == false ) || ( 2つ目 ) || ( 3つ目 ) )
となるように設定してあげれば、特定状況下におけるキーボードショートカットを定義できる。
つまり、AutoComplete中とかなしとか、Panelにフォーカスがあるときか。それ以外とか、でショートカットを決められる。
context についての説明
Contextについても色々あるので、「◯◯のときだけ」のキーボードショートカットが作れる。
http://docs.sublimetext.info/en/latest/reference/key_bindings.html#context-reference
たとえば、hasMultipleSelectionsで複数箇所を選択してる時だけとかができる。
IME(日本語)入力中ってContextが作られたら、みんなが悩むIMEでの誤動作が一気に解決するんだろうな。
参考資料
Sublime Text - Contexts ( Sublime Text 2系はコッチ)
http://docs.sublimetext.info/en/latest/reference/key_bindings.html?highlight=selection_empty
どうでもいいけど、SublimeTextでぐぐったら、アレゲなまとめサイト山ほどあって頭痛くなる。