#はじめに
Sublime Text3 ではEmmetの展開は ctrl + e と Tab に設定されています。しかし、ctrl + e は行末への移動に使いますし、Tabも別の用途で使っているケースがあると思います(私はオートコンプリートの候補選択に割り当てています)。
解決策として、 ctrl + e を無効化して Tab だけで展開する方法(参考: EmmetとSublime Textとctrl+e)や、別のキーに割り当てる方法(参考:【技術メモ】SublimeTextでEmmetの展開をcommand+eにする)などがありますが、
- なるべくデフォルトのキーを使いたい
- ショートカットで使うキーを増やしたくない
と言う理由で、ctrl + e での展開と行末への移動を両立させることを考えてみます。
環境
OS: MacOS High Sierra
Sublime Text3: Version 3.0, Build 3143
Emmet: VERSION 2017.03.23.21.16.14
#方法
少し考えてみると
- Emmetで展開したいとき、大抵の場合カーソルは行末にある。
- 行末にカーソルがあるときは行末に移動する必要はない。
ということで、カーソルが行末にあるかどうかで条件分けをすれば良さそうです。
まず、Emmetのデフォルトの ctrl + e での展開を無効にします。
メニューから
Sublime Text -> Preferences -> Package Settings -> Emmet -> Setting - Users
を開き、以下のように記述します。
{
"disabled_keymap_actions": "expand_abbreviation"
}
なお、Tabによる展開も無効にしたい場合は
{
"disabled_keymap_actions": "expand_abbreviation, expand_abbreviation_by_tab"
}
とすればよいはずなのですが、私の環境ではなぜか無効にできませんでした。今のところ特に困っていないのでそのままにしています。
次に、カーソルが行末にあるときだけEmmetの展開を行うようにします。
メニューから
Sublime Text -> Preferences -> Key Bindings
を選択すると Default と User の2つの keymap ファイルが開きますが、 User の方に以下の記載を追加します。
{
"keys": ["ctrl+e"],
"args": {
"action": "expand_abbreviation"
},
"command": "run_emmet_action",
"context": [
{ "key": "following_text", "operator": "regex_match", "operand": "$" }
]
}
"context" で、カーソルの後が行末かどうかを正規表現で調べています。
これで、カーソルが行末にないときは行末に移動、行末にあるときはEmmetで展開ができるようになりました。
#終わりに
ちょっとした小ネタですが、自前のショートカットを設定する際、カーソルの位置や状態に応じて処理を分けるのは色々と応用が利くのではないかと思います。