5

如果你在 Windows 上运行 Anaconda,你有一个activate.bat以这一行结尾的文件,将你当前的 conda env 放在提示符上:

set PROMPT=[%CONDA_DEFAULT_ENV%] $P$G

如果你在 windows 上运行 cmder,有一个很好的 lua 脚本可以自定义你的提示:

function lambda_prompt_filter()
    clink.prompt.value = string.gsub(clink.prompt.value, "{lamb}", "λ")
end

clink.prompt.register_filter(lambda_prompt_filter, 40)

这两个脚本不能很好地相互配合。 Clink 有一个 API,看起来我可以用来合并来自 的更改activate.bat,但我不知道如何从批处理文件中调用它。

我的总体目标是将这两个提示合并到更好的 Cmder 样式中。我的想法是创建一个环境变量,更改activate.bat以检查变量是否存在,如果存在,则调用 Clink API 来更改提示而不是set PROMPT. 那时我想我可以创建一个新的过滤器来干净地合并值。不过,我不知道如何从批处理文件中调用 API。

欢迎其他解决方案。

编辑:部分,非工作解决方案

require "os" -- added to top of file, rest in filter function
local sub = os.getenv("CONDA_DEFAULT_ENV")
if sub == nil then
    sub = ""
end
print(sub)
clink.prompt.value = string.gsub(clink.prompt.value, "{conda}", sub)

我在一开始的提示定义中添加了一个{conda};从 中删除提示语句activate.bat,并将其添加到git_prompt_filter. 在使用激活之前,一切都很好 -{conda}''. 但是,如果我使用 activate 并切换到带有 git repo 的文件夹来触发更改,我会看到:

{conda}C:\...

没有os.getenv得到用户设置的变量?不知道还有什么问题。我也尝试添加一个打印,它不会打印出CONDA...任何一个的内容。

4

3 回答 3

3

这是我重置提示并将 conda env 名称添加到提示中的操作:

---
 -- Find out the basename of a file/directory (last element after \ or /
 -- @return {basename}
---
function basename(inputstr)
        sep = "\\/"
        local last = nil
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                --t[i] = str
                --i = i + 1
                last = str
        end
        return last
end

---
 -- Find out current conda env
 -- @return {false|conda env name}
---
function get_conda_env()
    env_path = clink.get_env('CONDA_DEFAULT_ENV')
    if env_path then
        basen = basename(env_path)
        return basen
    end
    return false
end

---
 -- after conda activate: reset prompt and add conda env name 
---
function conda_prompt_filter()
    -- reset to original, e.g. after conda activate destroyed it...
    if string.match(clink.prompt.value, "{lamb}") == nil then
        -- 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 = new_value
    end
    -- add in conda env name
    local conda_env = get_conda_env()
    if conda_env then
        clink.prompt.value = string.gsub(clink.prompt.value, "{lamb}", "["..conda_env.."] {lamb}")
    end
end

clink.prompt.register_filter(conda_prompt_filter, 10)
于 2015-12-03T12:30:34.590 回答
3

我想以@Jan-Schulz 的回答为基础,因为它在 2017 年 4 月并不适合我。

  1. 我没有进行编辑,而是cmder/vendor/clink/clink.lua添加了升级时不会覆盖的自定义代码cmder/config/prompt.lua(您也可以使用 clink lua api 在此文件中向 cmder 提示添加其他修改)

  2. 我遇到了一个问题,{lamb}没有用正确的λ字符替换,所以我添加了另一个过滤器以在所有处理结束时运行。

---
 -- Find out the basename of a file/directory (last element after \ or /
 -- @return {basename}
---
function basename(inputstr)
        sep = "\\/"
        local last = nil
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                --t[i] = str
                --i = i + 1
                last = str
        end
        return last
end

---
 -- Find out current conda env
 -- @return {false|conda env name}
---
function get_conda_env()
    env_path = clink.get_env('CONDA_DEFAULT_ENV')
    if env_path then
        basen = basename(env_path)
        return basen
    end
    return false
end

---
 -- after conda activate: reset prompt and add conda env name 
---
function conda_prompt_filter()
    -- reset to original, e.g. after conda activate destroyed it...
    if string.match(clink.prompt.value, "{lamb}") == nil then
        -- 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 = new_value
    end
    -- add in conda env name
    local conda_env = get_conda_env()
    if conda_env then
        clink.prompt.value = string.gsub(clink.prompt.value, "{lamb}", "["..conda_env.."] {lamb}")
    end
end


function fix_lamb()
    if string.match(clink.prompt.value, "{lamb}") ~= nil then
        clink.prompt.value = string.gsub(clink.prompt.value, "{lamb}", "λ")
    end
end

clink.prompt.register_filter(conda_prompt_filter, 1)
clink.prompt.register_filter(fix_lamb, 999)
于 2017-04-06T18:12:53.660 回答
0

activate.bat为什么不从您的 cmder 配置文件中删除该行并执行所有逻辑?如果没有环境处于活动状态,则 CONDA_DEFAULT_ENV 将为空。

于 2014-08-05T15:46:38.843 回答