자습서: 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
를 다음과 같이 수정해야 합니다. wslpath
를 cygpath
로 바꿉니다.
다음 줄을 .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
을 참조하세요.
경로 복제 메뉴 사용
위의 작업은 탭 상황에 맞는 메뉴의 "탭 복제" 및 "창 분할" 항목 아래에서도 사용할 수 있습니다.
Windows Terminal