Cmder の Prompt を修正する方法

2016/11/12

Cmder のデフォルトのプロンプトのらむだが表示上邪魔になるときがある。以下はその際 にプロンプトを変える手順を記す。

Cmder の新しめのバージョンは内部で Clink の lua 処理で Prompt を設定している。そのため、 config\user-profile.cmdPrompt の設定をしてもうまく反映されない。

そのため、 config\*.lua として適当な Lua ファイルを作成し、そこで clink.prompt.register_filter(set_my_prompt_filter, 1) などとして適当に上書きすると良い。

僕は vendor\clink.lua から set_prompt_filter() を参照し、以下のようにし て config\prompt.lua ファイルを作成して対応している。

function set_my_prompt_filter()
    -- get_cwd() is differently encoded than the clink.prompt.value, so everything other than
    -- pure ASCII will get garbled. So try to parse the current directory from the original prompt
    -- and only if that doesn't work, use get_cwd() directly.
    -- The matching relies on the default prompt which ends in X:\PATH\PATH>
    -- (no network path possible here!)
    local old_prompt = clink.prompt.value
    local cwd = old_prompt:match('.*(.:[^>]*)>')
    if cwd == nil then cwd = clink.get_cwd() end

    -- environment systems like pythons virtualenv change the PROMPT and usually
    -- set some variable. But the variables are differently named and we would never
    -- get them all, so try to parse the env name out of the PROMPT.
    -- envs are usually put in round or square parentheses and before the old prompt
    local env = old_prompt:match('.*%(([^%)]+)%).+:')
    -- also check for square brackets
    if env == nil then env = old_prompt:match('.*%[([^%]]+)%].+:') end

    -- build our own prompt
    -- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m
    -- color codes: "\x1b[1;37;40m"
    local cmder_prompt = "\x1b[1;32;40m{cwd} {git}{hg} \n\x1b[1;30;40m{lamb} \x1b[0m"
    cmder_prompt = string.gsub(cmder_prompt, "{cwd}", cwd)
    if env == nil then
        lambda = ">"
    else
        lambda = "("..env..") >"
    end
    clink.prompt.value = string.gsub(cmder_prompt, "{lamb}", lambda)
end


clink.prompt.register_filter(set_my_prompt_filter, 1)