LoginSignup
9
6

More than 5 years have passed since last update.

【Sublime Text3】 Emmet使用時に ctrl + e での展開と行末への移動を両立させる

Last updated at Posted at 2018-01-14

はじめに

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
を開き、以下のように記述します。

Emmet.sublime-settings
{
    "disabled_keymap_actions": "expand_abbreviation"
}

なお、Tabによる展開も無効にしたい場合は

Emmet.sublime-settings
{
    "disabled_keymap_actions": "expand_abbreviation, expand_abbreviation_by_tab"
}

とすればよいはずなのですが、私の環境ではなぜか無効にできませんでした。今のところ特に困っていないのでそのままにしています。

次に、カーソルが行末にあるときだけEmmetの展開を行うようにします。

メニューから
Sublime Text -> Preferences -> Key Bindings
を選択すると Default と User の2つの keymap ファイルが開きますが、 User の方に以下の記載を追加します。

Default.sublime-keymap
{
    "keys": ["ctrl+e"],
    "args": {
        "action": "expand_abbreviation"
    },
    "command": "run_emmet_action",
    "context": [
        { "key": "following_text", "operator": "regex_match", "operand": "$" }
    ]
}

"context" で、カーソルの後が行末かどうかを正規表現で調べています。

これで、カーソルが行末にないときは行末に移動、行末にあるときはEmmetで展開ができるようになりました。

終わりに

ちょっとした小ネタですが、自前のショートカットを設定する際、カーソルの位置や状態に応じて処理を分けるのは色々と応用が利くのではないかと思います。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6