sublコマンドをちょっとだけ便利にする
僕は普段Mac + Sublime Text 3でコーディングしている。今回はエディタ宗教戦争をしたいわけではない。ちょっとSublime Text 3を便利にしたよというお話。
Sublime Textには、コンソールからGUIを起動するためのサポートコマンドが付録でついていて、コンソールから全ての作業を開始するタイプの開発者としては、よくこいつを使うことになる。しかし、この subl
コマンドは、引数の受け取り方が、素直すぎる。
- 引数なし: Sublime Textを起動(既に起動していたら何もしない)
- 引数にディレクトリを指定: そのディレクトリをrootとしたSublime Text Windowを新規作成(ただしディレクトリ内の
*.sublime-project
ファイルは読んでくれない) - 引数に
*.sublime-project
ファイルを指定: sublime-projectとして新規Windowを作成
素直でわかりやすいことは良いことなのだが、毎日使うコマンドとしては、もう少し賢くなって欲しい。
- カレントディレクトリに
*.sublime-project
ファイルがあればそれを読む - なければ、カレントディレクトリをrootにして開く
- 引数を指定したら、カレントディレクトリの代わりにそのディレクトリを読む
ぐらいの方が、使うのが楽だよね。
というわけで作ったスクリプトがこちら。
#!/usr/bin/env ruby SUBL_COMMAND = '/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl' require 'pathname' def base_dir return @base_dir if @base_dir return @base_dir = Pathname.new('.') if ARGV.empty? input = Pathname.new(ARGV[0]) return @base_dir = input if input.directory? parent = input.parent return @base_dir = parent if parent.directory? puts 'WARN: target directory does NOT exist' @base_dir = Pathname.new('.') end def detected_target base_dir.each_child(false) do |file| return @detected_target = file if file.fnmatch?('*.sublime-project') end @detected_target = base_dir end system(SUBL_COMMAND, detected_target.to_s)
僕はこのスクリプトを $HOME/bin/subl
として置いてパスを通し、いつも開発を始めるときは
$ cd /path/to/project
$ subl
と打っている。