それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Sublime Text でCtrl+tab でインデント(行選択中)とタブ切替(行選択なし)を同時に設定するモード

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でぐぐったら、アレゲまとめサイト山ほどあって頭痛くなる。

その他 Sublimetext について書いた記事

SublimeText でファイルのパスをコピーする - それマグで!

Sublimteテキストに貼り付ける時、フルパスで貼り付けたい - それマグで!