Tutorial: Membuka tab atau panel di direktori yang sama di Terminal Windows
Biasanya, tindakan "tab baru" dan "panel pemisah" akan selalu membuka tab/panel baru dalam apa pun profil tersebut startingDirectory
. Namun, pada platform lain, umum bagi tab baru untuk secara otomatis menggunakan direktori kerja tab saat ini sebagai direktori awal untuk tab baru. Ini memungkinkan pengguna untuk dengan cepat melakukan multitugas dalam satu direktori.
Sayangnya, di Windows, sulit untuk menentukan apa direktori kerja saat ini ("CWD") untuk sebuah proses. Bahkan jika kita dapat mencarinya, tidak semua aplikasi benar-benar mengatur CWD mereka saat mereka menavigasi. Terutama, Windows PowerShell tidak mengubah CWD-nya saat Anda cd
berada di sekitar sistem file! Menduplikasi CWD PowerShell secara otomatis hampir selalu salah.
Untungnya, ada solusinya. Aplikasi dapat memancarkan urutan escape khusus (khususnya "OSC 9; Format 9") untuk memberi tahu Terminal secara manual apa yang harus dilakukan CWD.
Dalam tutorial ini, Anda akan mempelajari cara:
- Mengonfigurasi shell untuk memberi tahu Terminal tentang direktori kerjanya saat ini
duplicateTab
Gunakan tindakan untuk membuka tab dengan CWD yang samasplitPane
Gunakan tindakan untuk membuka panel dengan CWD yang sama- Menggunakan menu konteks tab untuk membuka tab atau panel dengan CWD yang sama
Mengonfigurasi shell Anda
Untuk memberi tahu Terminal apa itu CWD, Anda harus memodifikasi shell untuk memancarkan urutan escape saat Anda menavigasi OS. Untungnya, sebagian besar shell memiliki mekanisme untuk mengonfigurasi "prompt", yang dijalankan setelah setiap perintah. Ini adalah tempat yang sempurna untuk menambahkan output tersebut.
Windows
Prompt Perintah: cmd.exe
cmd
%PROMPT%
menggunakan variabel lingkungan untuk mengonfigurasi perintah. Anda dapat dengan mudah menambahkan perintah dengan perintah untuk mengatur CWD dengan perintah berikut:
set PROMPT=$e]9;9;$P$e\%PROMPT%
Ini akan menambahkan $e]9;9;$P$e\
ke perintah Anda saat ini. Ketika cmd mengevaluasi perintah ini, cmd akan menggantikan
- dengan
$e
karakter escape $p
dengan direktori kerja saat ini
Perhatikan bahwa perintah di atas hanya akan berfungsi untuk sesi saat ini cmd.exe
. Untuk mengatur nilai secara permanen, SETELAH menjalankan perintah di atas, Anda harus menjalankan
setx PROMPT "%PROMPT%"
PowerShell: powershell.exe
atau pwsh.exe
Jika Anda belum pernah mengubah perintah PowerShell sebelumnya, Anda harus memeriksa about_Prompts terlebih dahulu.
Tambahkan yang berikut ini ke profil PowerShell Anda:
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
}
PowerShell dengan posh-git
Jika Anda menggunakan posh-git, maka itu sudah akan mengubah permintaan Anda. Dalam hal ini, Anda hanya ingin menambahkan output yang diperlukan ke perintah yang sudah dimodifikasi. Contoh berikut adalah versi yang dimodifikasi ringan dari contoh ini dari dokumen 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
}
PowerShell dengan Starship
Jika Anda menggunakan Starship, maka itu sudah akan mengubah perintah Anda. Dalam hal ini, Anda hanya ingin menambahkan output yang diperlukan ke perintah yang sudah dimodifikasi.
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
Subsistem Windows untuk Linux distribusi terutama menggunakan BASH sebagai shell baris perintah.
bash
Tambahkan baris berikut ke akhir file konfigurasi Anda .bash_profile
:
PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND "}'printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"'
Variabel PROMPT_COMMAND
dalam bash memberi tahu bash perintah apa yang harus dijalankan sebelum menampilkan prompt. Pernyataan printf
ini adalah apa yang kami gunakan untuk menambahkan urutan untuk mengatur direktori kerja dengan Terminal. Bit $(wslpath -w "$PWD")
akan memanggil wslpath
executable untuk mengonversi direktori saat ini ke jalur seperti Windows. Bit ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}
adalah beberapa sihir bash untuk memastikan kami menambahkan perintah ini ke perintah yang ada (jika Anda sudah mengatur PROMPT_COMMAND
di tempat lain.)
zsh
Tambahkan baris berikut ke akhir file Anda .zshrc
:
keep_current_path() {
printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"
}
precmd_functions+=(keep_current_path)
Hook precmd_functions
memberi tahu zsh perintah apa yang harus dijalankan sebelum menampilkan prompt. Pernyataan printf
ini adalah apa yang kami gunakan untuk menambahkan urutan untuk mengatur direktori kerja dengan Terminal. Bit $(wslpath -w "$PWD")
akan memanggil wslpath
executable untuk mengonversi direktori saat ini ke jalur seperti Windows. Menggunakan precmd_functions+=
pastikan kita menambahkan fungsi ke keep_current_path
fungsi yang ada yang sudah ditentukan untuk hook ini.
Ikan
Jika Anda menggunakan Fish shell, tambahkan baris berikut ke akhir file konfigurasi Anda yang terletak di ~/.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
Fungsi ini akan dipanggil setiap kali jalur saat ini diubah untuk mengonfirmasi sesi saat ini dibuka oleh Terminal Windows (memverifikasi $WT_SESSION) dan mengirim Perintah Sistem Operasi (OSC 9; 9;), dengan jalur setara Windows (wslpath -w
) dari jalur saat ini.
MINGW
Untuk MINGW, Git Bash dan Cygwin, Anda perlu memodifikasi PROMPT_COMMAND
untuk WSL: ganti wslpath
dengan cygpath
.
Tambahkan baris berikut ke akhir file Anda .bashrc
:
PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'printf "\e]9;9;%s\e\\" "`cygpath -w "$PWD" -C ANSI`"'
Catatan
Tidak melihat shell favorit Anda di sini? Jika Anda mengetahuinya, jangan ragu untuk membuka PR untuk berkontribusi solusi untuk shell pilihan Anda!
Menggunakan tindakan untuk menduplikasi jalur
Setelah Anda mengonfigurasi shell untuk memberi tahu Terminal apa direktori saat ini, membuka tab atau panel baru dengan jalur tersebut mudah.
Buka tab baru dengan duplicateTab
Untuk membuka tab baru dengan jalur (dan profil) yang sama dengan terminal yang saat ini aktif, gunakan tindakan "Tab Duplikat". Ini terikat secara default ke Ctrl+Shift+D, sebagai berikut:
{ "command": "duplicateTab", "keys": "ctrl+shift+d" },
(lihat duplicateTab
) untuk detail selengkapnya.
Buka panel baru dengan splitPane
Untuk membuka panel baru dengan jalur (dan profil) yang sama dengan terminal yang saat ini aktif, gunakan tindakan "Panel Duplikat". Ini TIDAK terikat secara default. Bentuk paling sederhana dari tindakan ini adalah:
{ "command": { "action": "splitPane", "splitMode": "duplicate" } },
(lihat splitPane
) untuk detail selengkapnya.
Menggunakan menu untuk menduplikasi jalur
tindakan di atas juga tersedia pada menu konteks tab, di bawah entri "Tab Duplikat" dan "Pisahkan Panel".
Windows Terminal