zsh가 CWD에서 별칭을 사용하지 못하도록 방지(프롬프트)

zsh가 CWD에서 별칭을 사용하지 못하도록 방지(프롬프트)

다음과 같은 맞춤 테마가 활성화되어 있습니다. oh-my-zshzsh( 및 의 최신 버전 oh-my-zsh):

local return_code="%(?..%{$fg[red]%}%? %{$reset_color%})"

local user_host='%{$terminfo[bold]$fg[green]%}%n @ %m%{$reset_color%}'
local current_dir='%{$terminfo[bold]$fg[cyan]%} %~%{$reset_color%}'
local rvm_ruby=''
local git_branch='$(git_prompt_info)%{$reset_color%}'

PROMPT="${user_host} %D{[%a, %b %d %I:%M:%S]} ${current_dir} ${rvm_ruby} ${git_branch}
%B$%b "
RPS1="${return_code}"

ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[yellow]%}‹"
ZSH_THEME_GIT_PROMPT_SUFFIX="› %{$reset_color%}"

프롬프트에서 디렉터리에 대한 별칭이 있을 때마다 실제 경로가 아닌 현재 디렉터리로 별칭 이름이 표시되는 것을 확인했습니다. 이것은 흥미로운 기능이지만 비활성화하고 싶습니다.

저는 을 처음 접했고 이것이 또는 기능 oh-my-zsh인지 확실하지 않습니다 . 그런데 어떻게 비활성화할 수 있습니까?oh-my-zshzsh

답변1

그만큼프롬프트 이스케이프 시퀀스 %~(에 포함됨 $current_dir)은 약어를 고려하여 현재 디렉토리로 확장됩니다. 약어는 다음과 같습니다.

  • ~홈 디렉토리의 경우
  • ~joe사용자의 홈 디렉토리에 대해 joe;
  • ~foofoo명명된 디렉토리의 경우: 로 별칭이 지정된 디렉토리 hash -d foo=…;
  • ~[bar]한 동안동적 명명된 디렉터리.

%/대신 사용할 수 있습니다 %~. 이것은 디렉토리 약어를 사용하지 않습니다.

좀 더 멋지게 만들고 싶다면 자신만의 코드를 실행하여 현재 디렉터리가 표시되는 방식을 결정할 수 있습니다. 한 가지 접근 방식은 프롬프트 문자열 내에서 매개변수 대체를 사용하는 것입니다. 이를 위해서는 다음이 필요합니다.prompt_substoh-my-zsh가 수행하는 옵션을 설정합니다(그렇지 않은 경우: setopt prompt_subst). 현재 디렉터리는 항상 매개변수에서 사용할 수 있습니다.PWD. 홈 디렉토리만 다음과 같이 단축하는 간단한 버전은 다음과 같습니다 ~.

local current_dir='%{$terminfo[bold]$fg[cyan]%} ${${PWD/#%$HOME/~}/#$HOME\//~/}%{$reset_color%}'

${${PWD/#%$HOME/\~}/#$HOME\//\~/}의미: 가 $PWD와 정확히 동일 하면 $HOME결과를 로 설정하고 ~, 그렇지 않으면 결과를 로 설정합니다 $PWD. 그런 다음 현재 결과가 로 시작하면 $HOME/이 접두어를 로 바꾸고 ~/, 그렇지 않으면 결과를 변경하지 않고 그대로 둡니다.

더 명확한 접근 방식은 현재 디렉터리의 보기 좋게 인쇄된 버전을 포함하는 매개 변수를 유지하는 것입니다. 다음에서 이 매개변수를 업데이트하세요.chpwd현재 디렉터리가 변경될 때마다 실행되는 후크 함수입니다. 또한 .zshrc.

함수 는 하나뿐이므로 chpwdoh-my-zsh를 재정의하지 마세요. Oh-my-zsh는 chpwd배열의 함수를 호출 chpwd_functions하므로 배열에 함수를 추가하세요.

function my_update_pretty_PWD {
  case $PWD in
    $HOME(/*)#) pretty_PWD=\~${PWD#$HOME};;
    *) pretty_PWD=$PWD;;
  esac
}
chpwd_functions+=(my_update_pretty_PWD)
my_update_pretty_PWD
local current_dir='%{$terminfo[bold]$fg[cyan]%} ${pretty_PWD}%{$reset_color%}'

사용자의 홈 디렉토리를 축약하고 디렉토리 이름을 지정하지 않으려면 하위 쉘에서 홈 디렉토리를 지우고 다음을 사용할 수 있습니다.% 매개변수 확장 플래그서브쉘에서 자동 약어를 수행합니다.

function my_update_pretty_PWD {
  pretty_PWD=$(hash -rd; print -lr -- ${(%)PWD})
}

또는 인라인 접근 방식을 선호하는 경우:

local current_dir='%{$terminfo[bold]$fg[cyan]%} $(hash -rd; print -lr -- ${(%)PWD})%{$reset_color%}'

답변2

옵션 auto_name_dirs이 이 동작을 담당합니다.

unsetopt auto_name_dirs비활성화하려면 명령을 사용하십시오 .

관련 정보