Fish shell 别名仅在特定目录中

Fish shell 别名仅在特定目录中

我正在使用 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。这避免了将其添加到启动配置中的开销。它仍然是一个函数,因此它在当前fishshell 中执行,而不是像可执行脚本那样启动一个新 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,该功能可以根据当前目录加载和卸载环境变量。

相关内容