function x
set desired_dir "/home/student/test_x" # Set your absolute path to your desired directory
if test (pwd) = $desired_dir
./x.py
else
echo '"Alias" x :) is not allowed here! You are not in $desired_dir directory.'
end
end
如果您没有 config.fish 文件,请使用上面的代码创建它。
x使用以下代码在 ~/bin 目录下创建具有名称的脚本/文件:
#!/usr/bin/fish
set desired_dir "/home/student/test_x" # Set your absolute path to your desired directory
if test (pwd) = $desired_dir
./x.py
else
echo '"Alias" x :) is not allowed here! You are not in $desired_dir directory.'
end
我能想到的三种可能性(除了达米尔建议的可能性)。首先,如果可能的话,我只是测试您是否在“延迟加载”功能的目录中。这与 Damir 推荐的类似,但它避免了在启动配置或可执行脚本中的开销。
基于延迟加载函数的解决方案
创建
~/.config/fish/functions/x.fish
:此函数仅在第一次通过 调用时才会加载
x
。这避免了将其添加到启动配置的开销。它仍然是一个函数,所以它在当前fish
shell 中执行,而不是像可执行脚本那样启动一个新的 shell。x
如果您不在该目录中,它还会回退到系统上可能安装的任何其他命令。如果您不需要这个,只需删除该else
块。进入项目目录时创建的函数
如果您确实需要该功能仅在您位于该目录中时才存在,还有另外两种选择。首先,fish 函数可以观察变量的变化,并且只在它发生变化时运行。该变量可以
$PWD
用于监视目录更改。在 中添加以下内容
~/.config/fish/conf.d/create_x.fish
:这确实需要
create_x.fish
在启动时加载该函数,但它只会在您更改目录时运行。它肯定比第一个选项效率低。基于提示的功能
最后,您可以修改您的提示功能以检查当前目录。这似乎很浪费,但是:
funced fish_prompt
在底部添加以下内容:
funcsave fish_prompt
这将检查您是否在每个提示符下的项目目录中,并且仅在您存在时才创建该函数。
在您的目录中
funcsave
放置“正常”的副本。删除它以返回正常的提示功能。fish_prompt
~/.config/fish/functions
当然,如果可以的话,请选择第一个选项:-)
我认为这不可能与别名有关(如果仅使用别名)。
解决方案:
在 ~/.config/fish/config.fish 中创建函数
如果您没有 config.fish 文件,请使用上面的代码创建它。
x
使用以下代码在 ~/bin 目录下创建具有名称的脚本/文件:不要忘记使您的
x
文件可执行:我建议使用direnv,然后将 direnv挂钩到 fish以根据文件夹设置自定义变量。
然后,在您的 fish 函数中使用该变量。
终于有人想要这个了!
如果您仍然感兴趣,我有一个名为“Dangerload”的小项目,我使用它来根据您所在的目录动态加载/卸载函数。您可以将此文件复制到您的
./config/fish/functions
. 或者只是运行fisher install redaphid/dangerload-fish
它还将检查磁盘上的功能是否已更改,并在执行前自动更新功能。
它就像 direnv,但用于鱼功能。
顾名思义,如果您不信任当前所在文件夹的来源,这会产生极端影响。因此,您必须在每个终端会话中输入一次“dls”才能选择加入此行为。哈哈。
我曾经有一个更高级的版本,但这个版本只是查看文件
./scripts/dangerload.fish
并从那里提取您想要从 shell 中添加/删除的功能。cd'ing 出目录会删除这些功能。很长一段时间以来,我一直对这个想法感到兴奋,因为你可以在你的 shell 中使用一种特定于域的语言,范围仅限于你当前所在的文件夹。我为项目制作了 shell 脚本,你可以执行这些脚本来执行一项任务,或在危险负载中使用从所述 shell 脚本中提取所有功能。如果您/任何人觉得他们会从中获得价值,请在 Github 上联系我。我有更好的东西可以做到这一点。