#!/usr/bin/env ruby1.8.5 require "readline" require "pathname" require "fileutils" require "nkf" SHELL_CMD_FILE = "/tmp/cs3-command-in" SHELL_RES_FILE = "/tmp/cs3-command-out" FileUtils.touch([SHELL_CMD_FILE, SHELL_RES_FILE]) def command(c) cmd = Pathname.new(SHELL_CMD_FILE) res = Pathname.new(SHELL_RES_FILE) res.truncate(0) cmd.open("w") do |f| f.puts c end sleep 0.14 while res.zero? NKF.nkf("-w", res.read) end @cache = {} Readline.completion_proc = proc {|word| words = word.split(".", -1) word = words.pop cmd = "__completion__(#{words.empty? ? "global" : words.join(".")})" comp = @cache[cmd] unless comp comp = command(cmd) @cache[cmd] = comp end if comp =~ / : / [] else comp.split(",").grep(/\A#{Regexp.quote(word || "")}/i).map {|c| words.empty? ? c : words.join(".") + "." + c } end } Readline.completion_append_character = "" Readline.completion_case_fold = true command File.read("init.js") while l = Readline.readline("> ", true) cmd = l.chomp if cmd == "exit" break else puts command(cmd).gsub(/\\n/, "\n") @cache.clear end end