mirror of
https://github.com/cmderdev/cmder.git
synced 2025-01-10 16:29:08 +08:00
Parse the original prompt for cwd and env names
clink.get_cwd() is returning a string which is differently encoded than what clink.prompt.value expects. This results in garbled path names if the path condains non-ASCII chars. The (arguable hacky) solution is to parse the old prompt for the current directory (which breaks if the user sets a PROMPT env var which is incompatible to the regex used here...). Also parse out a environment name set by systems like virtualenv or conda: this could be done more specifically by targeting each such system and using the usually set environment variable but this would mean that we would have to do that for each and every such system out there and that is probably not a sane idea...
This commit is contained in:
parent
13fd41eb82
commit
6b10771312
30
vendor/clink.lua
vendored
30
vendor/clink.lua
vendored
@ -18,12 +18,34 @@ dofile(clink_lua_file)
|
||||
-- which echo) don't get the ugly '{lamb}' shown.
|
||||
---
|
||||
function set_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"
|
||||
cwd = clink.get_cwd()
|
||||
prompt = "\x1b[1;32;40m{cwd} {git}{hg} \n\x1b[1;30;40m{lamb} \x1b[0m"
|
||||
new_value = string.gsub(prompt, "{cwd}", cwd)
|
||||
clink.prompt.value = string.gsub(new_value, "{lamb}", "λ")
|
||||
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
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user