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 deactivate스크립트가 Xterm 제목 표시줄의 변경 사항을 포함하여 효과를 취소한다는 것입니다.

아래는 .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의 더 복잡한 측면 중 하나라는 것을 알고 있습니다.

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

이 변수는 이스케이프 시퀀스의 대체를 보유합니다. 이스케이프 시퀀스 자체가 대체되므로(아래 참조) 대체 텍스트에 포함되어야 하지만 어떤 이유로 이 변수는 평가되지 않으므로 preX추가 이스케이프가 필요하지 않습니다.

CONDA_PROMPT_MODIFIER변수는 활성화 스크립트에 의해 환경에 삽입되며 대괄호 사이에 환경 접두사가 포함됩니다.

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

드디어 여기서 작업이 완료되었습니다. 이것은 "간단한"bash 문자열 조작. 변수 preX내에서 변수 내용을 검색합니다 PS1. 발견되면 변수의 내용으로 대체됩니다 Xrepl. 찾을 수 없으면 프롬프트가 변경되지 않습니다. 이 효과로 인해 터미널이 xterm인지 확인하는 기능이 필요하지 않습니다.

놀랍게도 conda deactivate실행하면 프롬프트에서 접두어와 Xterm 제목 표시줄에 삽입된 환경이 제거됩니다. 원래 프롬프트를 캐시하기 때문인 것 같지만 확실하지 않습니다.

이것이 다른 사람에게 도움이 되기를 바랍니다. 저는 bash와 스크립팅 기능에 익숙하지 않기 때문에 이것은 저에게 학습 경험이었습니다. 프롬프트의 세부 사항과 프롬프트로 수행할 수 있는 모든 작업은 말할 것도 없습니다.

관련 정보