Bagikan melalui


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 sama
  • splitPane 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".

Gambar duplikat-tab-same-cwdGambar split-pane-same-cwd