Cmder の Prompt を修正する方法¶
2016/11/12
Cmder のデフォルトのプロンプトのらむだが表示上邪魔になるときがある。以下はその際 にプロンプトを変える手順を記す。
Cmder の新しめのバージョンは内部で Clink の lua 処理で Prompt を設定している。そのため、 config\user-profile.cmd
で Prompt
の設定をしてもうまく反映されない。
そのため、 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)