Cmder-powerline-env-prompt for conda
紀錄一下修改 Cmder-powerline-prompt 的過程
起因
原先使用 Cmder-powerline-prompt 時,發現一個缺點,就是這個設定不能像一般 prompt,能在 prompt symbol 前顯示 anaconda 的環境名稱。
順便一提,cmder 本身已經支援此功能,但是對於使用者自訂的主題來說,通常會 override 原本的 prompt setting,所以還是要做一些修改。另外一個需要動手修改原因就是主題的擁有者似乎已經不更新了。
本修改 Cmder-powerline-env-prompt for conda 是融合兩版本結果
- Cmder-powerline-prompt: 原作者
- cmder-powerline-venv-prompt: 修改原作且有環境變數的版本,但也因為太久沒更新而出現了一些 BUG
修改的內容
先說個題外話,因為我本身完全不懂 lua
,所以我的貢獻只是讓他正常工作而已,並沒有修改其中的功能。
另外,cmder-powerline-venv-prompt 的作者在完成之後,Cmder-powerline-prompt 的原作有持續更新了一些功能,因此就順手整合一下。
以 cmder-powerline-venv-prompt 為基礎,加入 Cmder-powerline-prompt 的環境變數修改內容
修改
function get_virtual_env(env_var)
- 因為使用原先的版本會造成一個 BUG,而且 env_path 已經是我們要的環境名稱了,所以就直接 return。BUG: attempt to index global ‘exports’ (a nil value)
- From
1
2
3
4
5
6
7
8function get_virtual_env(env_var)
env_path = clink.get_env(env_var)
if env_path then
basen = exports.basename(env_path)
return basen
end
return false
end - To
1
2
3
4
5
6
7function get_virtual_env(env_var)
env_path = clink.get_env(env_var)
if env_path then
return env_path
end
return false
end
- From
修改
function conda_prompt_filter()
- 原先的作法不管怎樣輸出都是nil
,查了一下才發現使用'CONDA_DEFAULT_ENV'
才會正確回傳環境變數名稱。- From
1
local python_env = get_virtual_env('DEFAULT_ENV')
- To
1
local python_env = get_virtual_env('CONDA_DEFAULT_ENV')
- From
調整
override the built-in filters
的順序
- 若順序或優先權不對,也是會被蓋過而沒顯示。- From
1
2
3
4
5clink.prompt.register_filter(conda_prompt_filter, 20)
clink.prompt.register_filter(lambda_prompt_filter, 55)
clink.prompt.register_filter(colorful_hg_prompt_filter, 60)
clink.prompt.register_filter(colorful_git_prompt_filter, 60)
clink.prompt.register_filter(venv_prompt_filter, 65) - To
1
2
3
4
5clink.prompt.register_filter(lambda_prompt_filter, 55)
clink.prompt.register_filter(conda_prompt_filter, 58)
clink.prompt.register_filter(venv_prompt_filter, 58)
clink.prompt.register_filter(colorful_hg_prompt_filter, 60)
clink.prompt.register_filter(colorful_git_prompt_filter, 60)
- From
成果
- Github repo:
- Cmder-powerline-env-prompt for conda
後記
在 Cmder 最新的 v1.3.5 版本,這個主題會完全不能使用,Cmder v1.3.4 卻可以正常工作。感覺是這個主題的 .lua
檔完全看不到 clink.lua
的內容所產生的 BUG,之後有空再找個時間發個 issue 問問看是怎麼回事。以下是發生的 BUG:
BUG in Cmder v1.3.5
- attempt to call global ‘get_git_branch’ (a nil value)
20180203 Update
結果就用一個很簡單的做法就搞定了,就是把缺的 funciotn 從 clink.lua
複製過來就好。
缺的有下列兩個 function:
1 | local function get_git_branch(git_dir) |
新增 function 後,就可以正常在 Cmder v1.3.5 下使用了。
20180409 Update
原先在 vscode terminal 使用 cmder 時會有一個 bug,就是會在 prompt symbol λ
後面隨機產生一些空白,它會讓鼠標動畫和實際位置搭不上,而且這個情況是隨機發生的,因此我也沒有太理它,就只是讓人很煩躁而已。
直到今天意外在改 git-bash prompt 的時候發現,我使用 λ
當作 prompt symbol 也會發生這個情況,所以很直覺判斷說應該是編碼的問題。果不其然,當我把 λ
改成 ASCII 內的符號時 ($, #, @, …),那個隨機空白情況就消失了。
完全不知道為什麼使用 utf-8 的符號會有這個問題,也有使用 Active code page: 65001
,不過至少意外地解決掉這個 bug 了。
Cmder-powerline-env-prompt for conda
https://mousyball.github.io/2018/02/23/Cmder-powerline-env-prompt-for-conda/