Help us understand the problem. What is going on with this article?

nyagosのPROMPTでもnyaosの$Wn的なことがしたい

More than 5 years have passed since last update.

何言ってるか分からない?

nyagosとはzetamattaさんが開発中のWindowsで動作するGo製のシェルです。
僕自身は現在は旧バージョンであるnyaosを使用しているのですが、乗り換えも視野に入りつつある状況です。

さて、nyaosのPROMPTでは$Wn(nは整数)という特殊文字が使用できます。
これは「カレントディレクトリの最下層n個を表示する」というもので
カレントディレクトリがC:\foo\bar\hoge\fuga\mogeで$W2の場合、
プロンプトの表示はC:...\fuga\mogeとなります。素敵ですね。

しかしながら、nyagosでは(まだ?)実装されていませんので代替案を考えてみました。

代替案

手順は以下です。

  1. cdコマンドを差し換える
  2. ディレクトリ移動後にカレントディレクトリを取得しLuaで整形
  3. 環境変数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
nocd5
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away