特定のディレクトリにのみフィッシュシェルエイリアスがあります。

特定のディレクトリにのみフィッシュシェルエイリアスがあります。

私はFishを使用しており、というビルド操作のために頻繁に呼び出されるスクリプトを含むプロジェクトを作業していますx.pyxにマップされるエイリアスを作成したいと思います./x.py。しかし、私はこれがその特定のディレクトリでのみ機能したいと思います。

Fishドキュメントは、さまざまなエイリアス/関数/などを生成する方法の非常に詳細な説明を提供しますが、それをディレクトリごとに作成する方法については何も見つかりません。

どんな助けでも大変感謝します。

答え1

私が考える可能性は3つあります(Damielが提案したものに加えて)。まず、可能であれば、「遅延ロード」機能のディレクトリにあるかどうかをテストします。これはDamirが提案したものと似ていますが、起動設定や実行可能スクリプトのオーバーヘッドを防ぎます。

遅延ローディング機能ベースのソリューション

作る~/.config/fish/functions/x.fish

function x
    if [ (pwd) = "/path/to/project` ]
        ./x.py
    else
        command x
    end
end

この関数は最初に呼び出されたときにのみロードされますx。これにより、実行構成に追加するオーバーヘッドが防止されます。これはまだ関数なので、fish実行可能スクリプトのように新しいシェルを起動するのではなく、現在のシェルで実行されます。

xそのディレクトリにない場合は、システムにインストールされている他のコマンドに置き換えられます。必要でない場合は、elseブロックを削除してください。

プロジェクトディレクトリに入ったときに生成される関数

もしあなたなら本物この機能は、そのディレクトリにある場合にのみ必要で、2つのオプションがあります。まず、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

メッセージが表示されるたびにプロジェクトディレクトリに存在することを確認し、該当する場合にのみ関数を生成します。

funcsavefish_promptディレクトリに「一般」コピーを保存します~/.config/fish/functions。一般的なプロンプト機能に戻るには、それを削除してください。

もちろん、可能であれば最初のオプションを選択してください:-)

答え2

ついに誰かがこれをしたい!

それでも興味がある場合は、現在のディレクトリに従って関数を動的にロード/アンロードするために使用する「Dangerload」という小さなプロジェクトがあります。コピーできますこれ。にファイルを保存する./config/fish/functionsか、単に実行してください。fisher install redaphid/dangerload-fish

また、ディスクの関数が変更されていることを確認し、実行前に自動的に関数を更新します。

direnvに似ていますが、Fish機能に使用されます。

名前が示すように、現在存在するフォルダのソースを信頼しないと、これは極端な結果になります。したがって、この動作を選択するには、端末セッションごとに1回ずつ「dls」と入力する必要があります。笑。

以前はもう少し高度なバージョンがありましたが、このバージョンではファイルを見て、そこ./scripts/dangerload.fishからシェルに追加/削除したい機能を抽出しました。このディレクトリからCDを取り出すと、これらの機能は削除されます。

私はこのアイデアに長い間興味を持ってきました。これは、範囲が現在存在するフォルダに制限され、シェルでドメイン固有の言語を使用できるためです。タスクを実行するか、危険なペイロードを使用して、そのシェルスクリプトからすべての機能を抽出するために実行できるプロジェクト用のシェルスクリプトを作成しました。あなたや誰かがこれから価値を得ることができると思うなら、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次のコードを使用して、名前付きスクリプト/ファイルを作成します。

    #!/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はシェル拡張です。現在のディレクトリに基づいて環境変数をロードおよびアンロードする新機能で、既存のシェルを強化します。

関連情報