Fish:有条件地自动加载功能子集

时间:2018-04-19 18:07:53

标签: function fish

我正在测试fish shell,我正在寻找一种方法来实现我之前使用.bash_profile做的事情。我使用switch语句来区分主机名,允许我有1个集中/同步.bash_profile,它包含一组独立的别名和函数,用于它所处理的每台机器(例如与工作相关的东西)我的工作电脑,以及与我个人电脑上的人员相关的东西。)

我知道~/.config/fish/functions中的自动加载功能fish相当于bash.bash_profile的无条件定义函数。但有没有办法指定自动加载这些函数的子集?

谢谢!

3 个答案:

答案 0 :(得分:3)

我做同样的事情:我的〜/ .config / fish / config.fish包含

set host_config ~/.config/fish/config.(hostname).fish
test -r $host_config; and source $host_config
set -e host_config

然后config。(hostname).fish包含我的函数和该机器的变量设置。

要注意的一件事是要记住,你 想要强制执行某些功能。

答案 1 :(得分:2)

Fish在变量fish_function_path中搜索目录中的自动加载函数并加载它找到的第一个。在我的系统上,默认为

$fish_function_path: set in global scope, unexported, with 4 elements
$fish_function_path[1]: length=36 value=|/Users/krader/.config/fish/functions|
$fish_function_path[2]: length=29 value=|/usr/local/etc/fish/functions|
$fish_function_path[3]: length=40 value=|/usr/local/share/fish/vendor_functions.d|
$fish_function_path[4]: length=31 value=|/usr/local/share/fish/functions|

所以我要做的是预先添加一个名称包含主机名的目录,并将所有特定于机器的功能放在该目录中。并继续在〜/ .config / fish / functions 中添加通用的,非机器特定的功能。

答案 2 :(得分:0)

受到Krutis Raderanswer $fish_function_path知识的启发,我在~/.config/fish/functions中创建了以下文件夹结构:

$ tree -FC ~/.config/fish/functions/
├── PersonalComputer1/
│   └── PersonalComputer1_only_function.fish
├── PersonalComputer2/
│   └── PersonalComputer2_only_function.fish
├── WorkComputer1/
│   └── WorkComputer1_only_function.fish
├── WorkComputer2/
│   └── WorkComputer2_only_function.fish
├── personal/
│   └── personal_only_function.fish
├── work/
│   └── work_only_function.fish
└── common_function.fish

我将$fish_function_path添加到我的~/.config/fish/config.fish

,然后设置了# Set up work/personal autoload function path switch (hostname) WorkComputer1 WorkComputer2 set -gx fish_function_path "/Users/USERNAME/.config/fish/functions/work" $fish_function_path case PersonalComputer1 PersonalComputer2 set -gx fish_function_path "/Users/USERNAME/.config/fish/functions/personal" $fish_function_path end # Set up host-specific autoload function path set -gx fish_function_path "/Users/USERNAME/.config/fish/functions/"(hostname) $fish_function_path
$fish_function_path

导致/Users/USERNAME/.config/fish/functions/WorkComputer1 /Users/USERNAME/.config/fish/functions/work /Users/USERNAME/.config/fish/functions /usr/local/Cellar/fish/2.7.1/etc/fish/functions /usr/local/share/fish/vendor_functions.d /usr/local/Cellar/fish/2.7.1/share/fish/functions 看起来像:

 public async Task<HttpResponseMessage> GetWidget(String id, String widgetType)
        {
            if (widgetType.Equals("WidgetA"))
            {
                DocumentDbRepository<WidgetA> repo = new DocumentDbRepository<WidgetA>();
                var widget = await repo.GetItemAsync(id);
                return (ControllerContext.Request.CreateResponse(HttpStatusCode.OK, widget));
            }
            else if (resourceBase.SystemType.Equals("WidgetB"))
            {
                DocumentDbRepository<WidgetB> repo = new DocumentDbRepository<WidgetB>();
                var widget = await repo.GetItemAsync(id);
                return (ControllerContext.Request.CreateResponse(HttpStatusCode.OK, widget));
            }

        ...
     }