Alias

fish shell別名僅在特定目錄中

  • April 15, 2022

我正在使用fish,並且正在使用一個經常為建構任務呼叫的腳本開發一個項目,該腳本稱為x.py. 我想創建一個映射x./x.py. 但是,我只希望它適用於該特定目錄。

魚文件對如何製作各種別名/函式/等給出了相當詳細的解釋,但我找不到任何關於如何使它們特定於目錄的資訊。

任何幫助將非常感激

我能想到的三種可能性(除了達米爾建議的可能性)。首先,如果可能的話,我只是測試您是否在“延遲載入”功能的目錄中。這與 Damir 推薦的類似,但它避免了在啟動配置或可執行腳本中的成本。

基於延遲載入函式的解決方案

創建~/.config/fish/functions/x.fish

if [ (pwd) = "/path/to/project` ]
   ./x.py
else
   command x
end

此函式僅在第一次通過 呼叫時才會載入x。這避免了將其添加到啟動配置的成本。它仍然是一個函式,所以它在目前fishshell 中執行,而不是像可執行腳本那樣啟動一個新的 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

當然,如果可以的話,請選擇第一個選項:-)

引用自:https://unix.stackexchange.com/questions/673526