Conda環境プレフィックスを使用したXtermタイトルバーの更新

Conda環境プレフィックスを使用したXtermタイトルバーの更新

その端末のアクティブなconda環境を示すために、gnome端末タブを更新したいと思います。私は通常、同時に多くのタブと環境を有効にするので、正しいタブを見つけるのは難しいです。

Condaは、環境に切り替えるとプロンプトを更新し(プロンプトの前に環境プレフィックスを追加して)、source activate environment-prefix環境を無効にするとプロンプトを復元しますconda deactivate

しかし、condaを強制的に更新する方法はないようです。xterm タイトルバープロンプトを更新するとき。更新後も残るアクティベーションスクリプトを編集する方法はないようです。また、condaスクリプトとactivateスクリプトのロジックによれば、この機能を追加するための明確な場所を提供しません(少なくとも私が理解できる限り)。見つからない2017年の古い投稿にこの問題が言及されていますが、アクティブ化スクリプト編集ソリューションはもはや適用されていないようで、検索結果ソリューションは出ていません。

私は自動的に動作し、プロンプトの他の部分を変更せずにすべてのターミナル/シェル(テーマホスト)で動作し、condaとシームレスに動作するソリューションが必要です。

答え1

結局私がしたことは、.bashrcファイルに関数を作成することでした。この関数は、通常どおりプロンプトに環境を追加する一般的なconda activateスクリプトを実行します。その後、関数はプロンプト変数を編集してXtermタイトルバーに環境を追加します。

利点は、通常のconda activateスクリプトが変更されずに実行され、スクリプトがconda deactivateXtermタイトルバーの変更を含む効果をキャンセルすることです。

以下は.bashrcファイルの関数定義で、以下はそのデザインの詳細です。

# function to replace a call to the activate script in conda and set 
#+ Xterm title bar to include environment by
#+ replacing "source activate" with the following "activate" function

activate () {
# run the normal conda activate script first
#+ passing all arguments
    . activate $* 

# the activate script creates some Anaconda variables, including
# CONDA_PROMPT_MODIFIER which has the environment prefix in parens
# create a couple of temporary variables

    preX='\\[\\e\]0\;'
    Xrepl="\[\e]0;${CONDA_PROMPT_MODIFIER} "
# no need to test for xterm, since no match if no xterm title bar
# no need to check for no matches, since PS1 will remain unchanged

    PS1=${PS1/${preX}/${Xrepl}}
}

機能を使用して特定の環境を有効にするには、 を入力するだけです activate env-name。この機能は、スクリプトを実行して(「インポート」アクションなしで)環境が直接アクティブになるAnacondaのWindowsインストールをミラーリングします。

一行ずつ:

. activate $*

この行はデフォルトで Anaconda と共にインストールされたアクティベーションスクリプトを実行します。 Anacondaは独自のbinディレクトリをパスに追加するため、場所を正規化する必要はありません。 $ *にはすべての関数パラメータが含まれており、それをアクティブ化スクリプトに送信します。

preX='\\[\\e\]0\;'

この変数はプロンプト変数(PS1)に保存され、Xtermタイトルバーの先頭にエスケープシーケンスを定義します。 Xtermタイトルバーから取得したエスケープシーケンス6.3章。 Xtermタイトルバーの操作。私が得たプロンプト変数とそのコンポーネントに関する詳細BashプロンプトHOWTO。さらに、このフォーラムの投稿はもともと素晴らしいリソースでした。端末コマンドプロンプトでユーザー、ホスト、ディレクトリ情報の色を変更する

変数定義の一重引用符は文字が一度解釈されるのを防ぎますが、バックスラッシュ、角かっこ、およびセミコロンは以下の検索式で評価されるため、エスケープする必要があります。私は試行錯誤と(多くの)エラーを通してこれを見つけなければなりませんでした。私はこれがbashのより複雑な側面の1つであることを知っています。

Xrepl="\[\e]0;${CONDA_PROMPT_MODIFIER} "

この変数はエスケープシーケンスの置換を保持します。エスケープシーケンス自体が置き換えられるので(以下を参照)、代替テキストに含める必要がありますが、何らかの理由でこの変数は評価されないため、追加のpreXエスケープは必要ありません。

このCONDA_PROMPT_MODIFIER変数はアクティベーションスクリプトによって環境に挿入され、角かっこの間に環境接頭辞が含まれます。

PS1=${PS1/${preX}/${Xrepl}}

ついにここで作業が完了しました。これは「簡単」bash 文字列操作。変数preX内で変数の内容を検索しますPS1。見つかった場合は、変数の内容に置き換えられますXrepl。見つからない場合、プロンプトは変更されません。この効果により、端末がxtermであることを確認する機能は不要です。

驚くべきことにconda deactivate、プロンプトからプレフィックスとXtermタイトルバーに挿入された環境が削除されます。元のプロンプトをキャッシュするためだと思いますが、わかりません。

これが他の人に役立つことを願っています。私はbashとスクリプト機能に慣れていないので、これは私にとって学習経験でした。プロンプトの詳細とプロンプトで実行できるすべてのことは言うまでもありません。

関連情報