sublimeをカスタマイズした

Sublime Textが気に入ってずっと使ってるんですが、今更ながらsublimeのカスタマイズをした。なんかMicrosoftが新しいエディタを出したのに触発されてやった。

とりあえずまず、Sublime Textの気に入ってる点と不満点を挙げます。(今朝の時点での)

気に入ってる点
  • シンプル
  • 欲しい機能(インデントとか)が大体揃っている
  • マルチプラットフォームだし、Windowsを突然渡されてもエディタに困らなさそう
  • マルチカーソル、"⌘d"がめちゃ便利
  • プラグインが作りやすいらしい
  • その他カスタマイズもしやすい
不満点
  • C++で「for (i=0;i<N;++i) sum+=i;」みたいに1行でfor文を書くとインデントがバグる
  • 保存するとたまに変なダイアログが出てくるバグがある
  • tabで補完が出来るんですが、日本語入力で予測変換でtabを使うと補完が発動してバグる
  • 検索パネルの閉じ方が分からない

で、不満点のうち3つ目以外を今日解消しました。

インデントのバグ

C++で「for (i=0;i<N;++i) sum+=i;」みたいに1行でfor文を書くとインデントがバグる、という件

メニューから「Preference」→「Sublime Text 2」→「Preferences」→「Browse Packages...」から"Package"フォルダを開いて、"C++"フォルダ内の"Indentation Rules.tmPreferences"ファイルを探して開く。

どうやら27行目が悪さをしてるようなので、コメントアウトしてみた。

//24~28行目
<key>bracketIndentNextLinePattern</key>
<string>(?x)
^ \s* \b(if|while|else)\b [^;]* $
<!--| ^ \s* \b(for)\b .* $-->
</string>

当然ですが、2行に分けてforを書きたいときとかでもインデントされないようになりましたΩ\ζ°)チーン

まぁそれでいいやと一瞬思ったけどやっぱり困る気がしたのでちょっと考えた結果こうなった。

<key>bracketIndentNextLinePattern</key>
<string>(?x)
^ \s* \b(if|while|else)\b [^;]* $
| ^ \s* \b(for)\b[^;]*;[^;]*; [^;]* $
</string>

いい感じに動いてくれました。

追記(2015/05/01 02:24):これでもまだ「for(;;)for(;;)\n」(二重forを一行に書いて次の行に処理を書く)というコーナーケースがありますね。これは諦めてforを2行に分けたりしてください。完璧な正規表現はかなり難しそうです。

追記(2015/05/10 16:09):range-based forに対応できていなかったので修正しました。

<key>bracketIndentNextLinePattern</key>
<string>(?x)
^ \s* \b(if|while|else)\b [^;]* $
| ^ \s* \b(for)\b([^;]*;[^;]*;|[^:;]*:[^:;]*) [^;]* $
</string>

ちなみにsublimeを再起動しないと更新されません。

Sublime Text 3での解決法は知りません。

変なダイアログ

保存するとたまに変なダイアログが出てくるバグがある、という件

お金で解決しました。70$でした。

補完と予測変換

tabで補完が出来るんですが、日本語入力で予測変換でtabを使うと補完が発動してバグる、という件

これはよくわからなかった。解決できるようにできる条件は多分、

  • 補完を別のキーにする
  • MacのデフォルトのIMEを使うのをやめる

のいずれかっぽいんですが、どっちも嫌なので諦めました。

検索パネルとかの閉じ方

検索パネルの閉じ方が分からない、という件

Sublime Text 3の検索パネルにはxボタンがあるのに他にはないせいで余計ハマっていましたが、解決法はシンプルでした。

Escキーで閉じれるそうです。