fish shell別名僅在特定目錄中
我正在使用fish,並且正在使用一個經常為建構任務呼叫的腳本開發一個項目,該腳本稱為
x.py
. 我想創建一個映射x
到./x.py
. 但是,我只希望它適用於該特定目錄。魚文件對如何製作各種別名/函式/等給出了相當詳細的解釋,但我找不到任何關於如何使它們特定於目錄的資訊。
任何幫助將非常感激
我能想到的三種可能性(除了達米爾建議的可能性)。首先,如果可能的話,我只是測試您是否在“延遲載入”功能的目錄中。這與 Damir 推薦的類似,但它避免了在啟動配置或可執行腳本中的成本。
基於延遲載入函式的解決方案
創建
~/.config/fish/functions/x.fish
:if [ (pwd) = "/path/to/project` ] ./x.py else command x end
此函式僅在第一次通過 呼叫時才會載入
x
。這避免了將其添加到啟動配置的成本。它仍然是一個函式,所以它在目前fish
shell 中執行,而不是像可執行腳本那樣啟動一個新的 shell。
x
如果您不在該目錄中,它還會回退到系統上可能安裝的任何其他命令。如果您不需要這個,只需刪除該else
塊。進入項目目錄時創建的函式
如果您確實需要該功能僅在您位於該目錄中時才存在,還有另外兩種選擇。首先,fish 函式可以觀察變數的變化,並且只在它發生變化時執行。該變數可以
$PWD
用於監視目錄更改。在 中添加以下內容
~/.config/fish/conf.d/create_x.fish
:function create_x --on-variable PWD if [ "$PWD" = "/path/to/project" ] function x ./x.py end else functions --erase x end end
這確實需要
create_x.fish
在啟動時載入該函式,但它只會在您更改目錄時執行。它肯定比第一個選項效率低。基於提示的功能
最後,您可以修改您的提示功能以檢查目前目錄。這似乎很浪費,但是:
funced fish_prompt
- 在底部添加以下內容:
functions --erase x if [ (pwd) = "/path/to/project" ] function x ./x.py end end
funcsave fish_prompt
這將檢查您是否在每個提示符下的項目目錄中,並且僅在您存在時才創建該函式。
在您的目錄中
funcsave
放置“正常”的副本。刪除它以返回正常的提示功能。fish_prompt``~/.config/fish/functions
當然,如果可以的話,請選擇第一個選項:-)