如何在单个脚本中添加多个鱼类功能?

如何在单个脚本中添加多个鱼类功能?

我正在尝试从 zsh 转向 Fish。正如我所见,如果我使用,鱼的加载时间会增加别名。所以我想将所有别名转换为函数,但问题是为每个别名创建函数脚本有点忙。那么如何在单个函数脚本中添加这些别名呢?

答案1

首先,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自动创建.lazy-load函数文件即可~/.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,请考虑使用 in 中的文件conf.d来代替。它使您可以更轻松地查看(和修改)启动配置的每个部分正在执行的操作,而无需弄乱单个config.fish.

答案2

基于此堆栈溢出示例经过荒谬的鱼,我建议在下面创建一个~/.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 文件中。

相关内容