다음을 통해 공유


자습서: Windows 터미널의 동일한 디렉터리에서 탭 또는 창 열기

일반적으로 "새 탭" 및 "창 분할" 작업은 항상 해당 프로필에 대한 모든 startingDirectory에서 새 탭/창을 엽니다. 그러나 다른 플랫폼에서는 새 탭에서 현재 탭의 작업 디렉터리를 새 탭의 시작 디렉터리로 자동으로 사용하는 것이 일반적입니다. 이렇게 하면 사용자가 단일 디렉터리에서 여러 작업을 빠르게 수행할 수 있습니다.

아쉽게도 Windows에서는 프로세스의 "CWD"(현재 작업 디렉터리)를 확인하는 것이 어렵습니다. 조회할 수 있는 경우에도 모든 애플리케이션에서 탐색할 때 실제로 CWD를 설정하는 것은 아닙니다. 특히 Windows PowerShell은 파일 시스템 주위에서 cd를 수행하는 것처럼 CWD를 변경하지 않습니다! PowerShell의 CWD를 자동으로 복제하는 것은 거의 항상 잘못된 것입니다.

다행히도 해결 방법이 있습니다. 애플리케이션은 특별한 이스케이프 시퀀스(특히 "OSC 9; 9" 형식)을 사용하여 터미널에 CWD가 무엇인지 수동으로 알립니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 현재 작업 디렉터리에 대해 터미널에 알리도록 셸 구성
  • duplicateTab 작업을 사용하여 동일한 CWD의 탭 열기
  • splitPane 작업을 사용하여 동일한 CWD로의 창 열기
  • 탭 상황에 맞는 메뉴를 사용하여 동일한 CWD의 탭 또는 창 열기

셸 구성

터미널에 CWD를 알리려면 OS를 탐색할 때 이스케이프 시퀀스를 내보내도록 셸을 수정해야 합니다. 다행히 대부분의 셸에는 모든 명령 후에 실행되는 "프롬프트"를 구성하는 메커니즘이 있습니다. 이는 이러한 출력을 추가할 수 있는 완벽한 장소입니다.

Windows

명령 프롬프트: cmd.exe

cmd%PROMPT% 환경 변수를 사용하여 프롬프트를 구성합니다. 다음 명령을 사용하여 CWD를 설정하는 명령을 프롬프트 앞에 쉽게 추가할 수 있습니다.

set PROMPT=$e]9;9;$P$e\%PROMPT%

그러면 $e]9;9;$P$e\가 현재 프롬프트에 추가됩니다. cmd에서 이 프롬프트를 평가할 때 다음과 같이 바꿉니다.

  • $e를 이스케이프 문자로 바꿉니다.
  • $p를 현재 작업 디렉터리로 바꿉니다.

위의 명령은 현재 cmd.exe 세션에서만 작동합니다. 값을 영구적으로 설정하려면 위의 명령을 실행한 후 다음을 실행해야 합니다.

setx PROMPT "%PROMPT%"

PowerShell: powershell.exe 또는 pwsh.exe

이전에 PowerShell 프롬프트를 변경한 적이 없는 경우 먼저 about_Prompts를 확인해야 합니다.

다음을 PowerShell 프로필에 추가합니다.

function prompt {
  $loc = $executionContext.SessionState.Path.CurrentLocation;

  $out = ""
  if ($loc.Provider.Name -eq "FileSystem") {
    $out += "$([char]27)]9;9;`"$($loc.ProviderPath)`"$([char]27)\"
  }
  $out += "PS $loc$('>' * ($nestedPromptLevel + 1)) ";
  return $out
}

posh-git을 사용하는 PowerShell

posh-git을 사용하는 경우 프롬프트가 이미 수정되었을 것입니다. 이 경우 필요한 출력만 이미 수정된 프롬프트에 추가하려고 합니다. 다음 예제는 ConEmu 문서의 해당 예제를 약간 수정한 버전입니다.

function prompt
{
  $loc = Get-Location

  $prompt = & $GitPromptScriptBlock

  $prompt += "$([char]27)]9;12$([char]7)"
  if ($loc.Provider.Name -eq "FileSystem")
  {
    $prompt += "$([char]27)]9;9;`"$($loc.ProviderPath)`"$([char]27)\"
  }

  $prompt
}

Starship을 사용하는 PowerShell

Starship을 사용하는 경우 프롬프트가 이미 수정되었을 것입니다. 이 경우 필요한 출력만 이미 수정된 프롬프트에 추가하려고 합니다.

function Invoke-Starship-PreCommand {
  $loc = $executionContext.SessionState.Path.CurrentLocation;
  $prompt = "$([char]27)]9;12$([char]7)"
  if ($loc.Provider.Name -eq "FileSystem")
  {
    $prompt += "$([char]27)]9;9;`"$($loc.ProviderPath)`"$([char]27)\"
  }
  $host.ui.Write($prompt)
}

WSL

Linux용 Windows 하위 시스템 배포에서는 주로 BASH를 명령줄 셸로 사용합니다.

bash

.bash_profile 구성 파일 끝에 다음 줄을 추가합니다.

PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND "}'printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"'

bash의 PROMPT_COMMAND 변수는 프롬프트를 표시하기 전에 실행할 명령을 bash에 알려줍니다. printf 문은 터미널에서 작업 디렉터리를 설정하는 시퀀스를 추가하는 데 사용하는 것입니다. $(wslpath -w "$PWD") 비트는 wslpath 실행 파일을 호출하여 현재 디렉터리를 Windows와 비슷한 경로로 변환합니다. ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "} 비트는 이 명령을 기존 명령에 추가할 수 있도록 하는 일부 bash 매직입니다(PROMPT_COMMAND를 이미 다른 위치에 설정한 경우).

zsh

다음 줄을 .zshrc 파일의 끝에 추가합니다.

keep_current_path() {
  printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"
}
precmd_functions+=(keep_current_path)

precmd_functions 후크는 프롬프트를 표시하기 전에 실행할 명령을 zsh에 알려줍니다. printf 문은 터미널에서 작업 디렉터리를 설정하는 시퀀스를 추가하는 데 사용하는 것입니다. $(wslpath -w "$PWD") 비트는 wslpath 실행 파일을 호출하여 현재 디렉터리를 Windows와 비슷한 경로로 변환합니다. precmd_functions+=를 사용하면 이 후크에 대해 이미 정의된 기존 함수에 keep_current_path 함수를 추가해야 합니다.

Fish

Fish shell을 사용하는 경우 다음 줄을 ~/.config/fish/config.fish에 있는 구성 파일의 끝에 추가합니다.

function storePathForWindowsTerminal --on-variable PWD
    if test -n "$WT_SESSION"
      printf "\e]9;9;%s\e\\" (wslpath -w "$PWD")
    end
end

이 함수는 현재 경로가 변경될 때마다 현재 세션을 Windows 터미널에서 열었다는 것을 확인($WT_SESSION 확인)하기 위해 호출되며, 현재 경로와 동등한 Windows 경로(wslpath -w)를 사용하여 운영 체제 명령(OSC 9;9;)을 보냅니다.

MINGW

MINGW, Git Bash 및 Cygwin의 경우 WSL의 PROMPT_COMMAND를 다음과 같이 수정해야 합니다. wslpathcygpath로 바꿉니다.

다음 줄을 .bashrc 파일의 끝에 추가합니다.

PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'printf "\e]9;9;%s\e\\" "`cygpath -w "$PWD" -C ANSI`"'

참고 항목

즐겨찾는 셸이 여기에 표시되지 않나요? 알고 있는 경우 자유롭게 PR을 열어 즐겨찾는 셸에 대한 솔루션에 기여하세요!

경로 복제 작업 사용

현재 디렉터리를 터미널에 알리도록 구성된 셸이 있으면 해당 경로의 새 탭 또는 창을 쉽게 열 수 있습니다.

duplicateTab을 사용하여 새 탭 열기

현재 활성 터미널과 동일한 경로(및 프로필)의 새 탭을 열려면 "탭 복제" 작업을 사용합니다. 기본적으로 다음과 같이 Ctrl+Shift+D에 바인딩됩니다.

        { "command": "duplicateTab", "keys": "ctrl+shift+d" },

자세한 내용은 duplicateTab을 참조하세요.

splitPane을 사용하여 새 창 열기

현재 활성 터미널과 동일한 경로(및 프로필)의 새 창을 열려면 "창 복제" 작업을 사용합니다. 이 경우 기본적으로 바인딩되지 않습니다. 이 작업의 가장 간단한 형태는 다음과 같습니다.

        { "command": { "action": "splitPane", "splitMode": "duplicate" } },

자세한 내용은 splitPane을 참조하세요.

경로 복제 메뉴 사용

위의 작업은 탭 상황에 맞는 메뉴의 "탭 복제" 및 "창 분할" 항목 아래에서도 사용할 수 있습니다.

이미지 duplicate-tab-same-cwd이미지 분할 창 동일 cwd