Linux

如何在單個腳本中添加多個魚功能?

  • August 19, 2021

我正在嘗試從 zsh 轉向釣魚。正如我所見,如果我使用alias ,魚的載入時間會增加。所以我想把我所有的別名都轉換成函式,但是為每個別名創建一個函式腳本有點忙。那麼如何在單個函式腳本中添加這些別名呢?

基於荒謬_fish的這個Stack Overflow 範例,我建議使用其中定義的函式創建一個文件,然後在文件中添加一行來獲取該文件。~/.config/fish/``~/.config/fish/config.fish

的範例內容~/.config/fish/all-my-functions.fish

function example-function1
 ls -l $argv
end

function example-function2
 ls -a $argv
end

# continues as needed ...

和行~/.config/fish/config.fish

source ~/.config/fish/all-my-functions.fish

或者,您可以將所有函式直接定義到 config.fish 文件中。

首先,aliasFish 中的命令只是創建帶有一點語法糖的函式的快捷方式。例如

> alias ls "ls -lh"
> functions ls
# Defined via `source`
function ls --description 'alias ls ls -lh'
command ls -lh $argv;
end

也許是正在創建/載入的函式的成本導致您的速度變慢。在這種情況下,將它們全部放入一個在啟動時(仍然)載入的單一文件可能不會有幫助。

有幾個簡單的解決方案甚至不涉及修改您的config.fish

  • 對於每個別名,只需funcsave <aliasname>. 這會將函式保存到~/.config/fish/functions. 恕我直言,這確實是正確的方法,因為該目錄中的函式是按需載入的,而不是在啟動時載入。這將為您提供最快的 shell 啟動時間。

例如:

> alias ls "ls -lh"
> funcsave ls
> ls -n ~/.config/fish/functions/
-rw-r--r-- 1 1000 100  95 Aug 18 14:30 ls.fish

同樣,這個文件在啟動時甚至沒有被觸及——它在需要時“延遲載入”。當您ls在會話中第一次呼叫時,Fish 將ls執行~/.config/fish/functions/ls.fish.

此外,只需要funcsave現有別名上。定義新別名時,只需使用alias -s. 中自動創建延遲載入函式文件即可~/.config/fish/functions

  • 編輯/更新:您提到希望這盡可能簡單,所以這裡有一個快速命令行,可以自動保存所有別名函式。執行後,您應該會看到其中每個別名的相應文件,~/.config/fish/functions並且您可以從啟動中刪除現有別名。
for f in (alias | awk '{print $2}'); funcsave $f; end
  • 如果你真的想為你的別名函式創建一個整體文件,並且你不介意增加的啟動時間(不管它是多少),那麼我仍然不會修改~/.config/fish/config.fish. 只需在其中創建該文件,~/.config/fish/conf.d它將作為啟動的一部分自動讀取。

每當某些說明說要修改您的config.fish. 時,請考慮改用文件conf.d。它使您可以更輕鬆地查看(和修改)啟動配置的每個部分正在做什麼,而無需通過單個config.fish.

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