我正在使用 Fish,并且正在开发一个项目,其中包含一个经常为名为 的构建任务调用的脚本x.py
。我想创建一个映射x
到 的别名./x.py
。但是,我只希望这适用于该特定目录。
Fish 文档对如何创建各种别名/函数/等提供了相当详细的解释,但我找不到有关如何使它们特定于目录的任何内容。
任何帮助将非常感激
答案1
我能想到的三种可能性(除了达米尔建议的可能性)。首先,如果可能的话,我只是测试您是否位于“延迟加载”函数的目录中。这与 Damir 建议的类似,但它避免了启动配置或可执行脚本中的开销。
基于延迟加载函数的解决方案
创造~/.config/fish/functions/x.fish
:
function x
if [ (pwd) = "/path/to/project` ]
./x.py
else
command x
end
end
该函数仅在第一次通过 调用时才会加载x
。这避免了将其添加到启动配置中的开销。它仍然是一个函数,因此它在当前fish
shell 中执行,而不是像可执行脚本那样启动一个新 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
目录中。删除它即可返回正常的提示功能。
当然,如果可以的话,请选择第一个选项:-)
答案2
终于有人想要这个了!
如果您仍然感兴趣,我有一个名为“Dangerload”的小项目,我用它来根据您所在的目录动态加载/卸载函数。您可以复制这文件到你的./config/fish/functions
.或者只是运行fisher install redaphid/dangerload-fish
它还会检查磁盘上的函数是否已更改,并在执行之前自动更新函数。
它类似于 direnv,但用于 Fish 函数。
顾名思义,如果您不信任当前所在文件夹的来源,这会产生极端的影响。因此,您必须在每个终端会话中键入一次“dls”才能选择此行为。哈哈。
我曾经有过一个更高级的版本,但这个版本只是查看文件./scripts/dangerload.fish
并从那里提取您想要从 shell 中添加/删除的功能。 cd 出该目录会删除这些功能。
我长期以来一直对这个想法感到兴奋,因为您可以在 shell 中使用特定于域的语言,其范围仅限于您当前所在的文件夹。我为项目制作了 shell 脚本,您可以执行这些脚本来执行任务,或使用危险负载从所述 shell 脚本中提取所有功能。如果你/任何人觉得他们能从中获得价值,请在 Github 上联系我。我有更好的东西可以做到这一点。
答案3
我认为这不可能用别名来实现(如果单独使用别名)。
解决方案:
在 ~/.config/fish/config.fish 中创建函数
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
不要忘记使您的
x
文件可执行:chmod u+x ~/bin/x
答案4
我建议使用迪伦夫, 然后将direnv钩入鱼中根据文件夹设置自定义变量。
然后,在 Fish 函数中使用该变量。
direnv 是 shell 的扩展。它通过一项新功能增强了现有的 shell,该功能可以根据当前目录加载和卸载环境变量。