sublコマンドをちょっとだけ便利にする

僕は普段Mac + Sublime Text 3でコーディングしている。今回はエディタ宗教戦争をしたいわけではない。ちょっとSublime Text 3を便利にしたよというお話。

Sublime Textには、コンソールからGUIを起動するためのサポートコマンドが付録でついていて、コンソールから全ての作業を開始するタイプの開発者としては、よくこいつを使うことになる。しかし、この subl コマンドは、引数の受け取り方が、素直すぎる。

  1. 引数なし: Sublime Textを起動(既に起動していたら何もしない)
  2. 引数にディレクトリを指定: そのディレクトリをrootとしたSublime Text Windowを新規作成(ただしディレクトリ内の *.sublime-project ファイルは読んでくれない)
  3. 引数に *.sublime-project ファイルを指定: sublime-projectとして新規Windowを作成

素直でわかりやすいことは良いことなのだが、毎日使うコマンドとしては、もう少し賢くなって欲しい。

ぐらいの方が、使うのが楽だよね。

というわけで作ったスクリプトがこちら。

#!/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

と打っている。