何言ってるか分からない?
nyagosとはzetamattaさんが開発中のWindowsで動作するGo製のシェルです。
僕自身は現在は旧バージョンであるnyaosを使用しているのですが、乗り換えも視野に入りつつある状況です。
さて、nyaosのPROMPTでは**$Wn(nは整数)という特殊文字が使用できます。
これは「カレントディレクトリの最下層n**個を表示する」というもので
カレントディレクトリがC:\foo\bar\hoge\fuga\moge
で$W2の場合、
プロンプトの表示はC:...\fuga\moge
となります。素敵ですね。
しかしながら、nyagosでは(まだ?)実装されていませんので代替案を考えてみました。
代替案
手順は以下です。
-
cdコマンド
を差し換える - ディレクトリ移動後にカレントディレクトリを取得しLuaで整形
- 環境変数PROMPTを設定する
1.の部分を変更すればVimのタブに表示されるような
C:\f\b\h\f\moge
と各ディレクトリの先頭文字だけ表示することも可能でしょう。
コード
通常のドライブ、HOMEディレクトリ、UNCパスの場合で条件分けたらスパゲッティになってきました…が、まぁこんな感じです。
nyagos.lua
alias{
_cd='cd', -- cdコマンドの再帰呼び出しを回避
cd=function(args)
if #args == 0 then
nyagos.exec('_cd ~')
else
r, err = nyagos.exec('_cd "' .. args[1] .. '"')
if (err ~= nil) then
print(err)
end
end
nyagos.setenv('PROMPT', makePrompt())
end
}
function makePrompt()
return '$e[36;40;1m' .. getCompressedPath(3):gsub('\\', '/') .. '>' .. '$e[37;1m'
end
-- num:表示する階層数
function getCompressedPath(num)
local path = chomp(nyagos.eval('pwd'))
local buff = path
local drive = nil
-- HOME以下の場合
local home = nyagos.getenv('USERPROFILE')
if (path:match(home))then
drive = '~'
path = path:gsub(home, '~')
buff = path
end
-- 通常のドライブ
if drive == nil then
drive = buff:match('(%w+:)\\')
buff = buff:gsub('%w+:\\', '')
end
-- UNCパス
if drive == nil then
drive = buff:match('(\\\\.-)\\')
buff = buff:gsub('\\\\.-\\', '')
end
local tbl = split(buff, "[\\/]")
if #tbl > num then
buff = "/..."
for i = #tbl - (num - 1), #tbl do
buff = buff .. '/' .. tbl[i]
end
path = drive .. buff
end
return path
end
-- code from 'http://lua-users.org/wiki/SplitJoin'
function split(str, pat)
local t = {} -- NOTE: use {n = 0} in Lua-5.0
local fpat = "(.-)" .. pat
local last_end = 1
local s, e, cap = str:find(fpat, 1)
while s do
if s ~= 1 or cap ~= "" then
table.insert(t,cap)
end
last_end = e+1
s, e, cap = str:find(fpat, last_end)
end
if last_end <= #str then
cap = str:sub(last_end)
table.insert(t, cap)
end
return t
end
function chomp(src)
return string.gsub(src, "[\r\n]+$", "")
end