NYAOS 3000でいろんなコマンドのサブコマンドを補完する

NYAOSでhgやgemなどのサブコマンドを補完するスクリプト、の修正版 - メモ:wantoraに修正版があります。

NYAOS-3000 2.98_0が公開された。今回の更新には個人的に嬉しい機能がある。

一つはバッチファイルの拡張子を省略出来るようになったこと、もう一つはnyaos.completeに第三引数が追加され、コマンドラインの文字列が取得できるようになったこと。

特にnyaos.completeの第三引数追加はnyaos.keyhookを併用する必要がなくなった。

NYAOS 3000でMercurialのサブコマンドを補完する - メモ:wantoraのサブコマンド補完はMercurialだけだが、今回のスクリプトは変数completesにテーブルを返す関数をコマンド名のキーに追加すれば、様々なコマンドに対応できる。

-- MIT License (http://d.hatena.ne.jp/wantora/20101212/1292141801)

local completes_cache = {}
local completes = {
	hg = function()
		local cmds = {}
		local function insert_cmd(str)
			for line in (str:match('\nlist of commands:\n\n(.-)\n\n') or ''):gmatch('[^\n]+') do
				local name = line:match('^ ([^%s:,]+)')
				if name then table.insert(cmds, name) end
			end
		end
		local HGPLAIN = os.getenv('HGPLAIN') or ''
		nyaos.exec('set HGPLAIN=1')
		
		h = nyaos.eval('hg help -v')
		insert_cmd(h)
		for line in (h:match('\nenabled extensions:\n\n(.-)\n\n') or ''):gmatch('[^\n]+') do
			insert_cmd(nyaos.eval('hg help '..line:match('^ ([^%s]*)')..' -v'))
		end
		
		nyaos.exec('set HGPLAIN='..HGPLAIN)
		return cmds
	end,
	gem = function()
		local cmds = {}
		for line in nyaos.eval('gem help commands'):gmatch('[^\n]+') do
			local name = line:match('^    ([^%s]*)')
			if #cmds > 0 and (not name) then break end
			if name and #name > 0         then table.insert(cmds, name) end
		end
		return cmds
	end,
}

function nyaos.complete(basestring, pos, misc)
	local cmd = misc.text:sub(1, pos):gsub('%s+$', ''):gsub('^(%S+)%.[^/\\.]+$', '%1')
	
	for name, comp in pairs(completes) do
		if cmd == name then
			if not completes_cache[name] then completes_cache[name] = comp() end
			return completes_cache[name]
		end
	end
	
	return nyaos.default_complete(basestring, pos)
end