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 的原作有持續更新了一些功能,因此就順手整合一下。

  1. cmder-powerline-venv-prompt 為基礎,加入 Cmder-powerline-prompt 的環境變數修改內容

  2. 修改 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
      8
      function 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
      7
      function get_virtual_env(env_var)
      env_path = clink.get_env(env_var)
      if env_path then
      return env_path
      end
      return false
      end
  3. 修改 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')
  4. 調整 override the built-in filters 的順序
    - 若順序或優先權不對,也是會被蓋過而沒顯示。

    • From
      1
      2
      3
      4
      5
      clink.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
      5
      clink.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)

成果

後記

在 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
2
local function get_git_branch(git_dir)
local function get_hg_branch()

新增 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 了。

Author

Mo1cibo

Posted on

2018-02-22

Updated on

2020-10-31

Licensed under

Comments