Integrasi Shell
- Integrasi Shell
Mulai pratinjau Terminal 1.15, Terminal Windows telah mulai secara eksperimental mendukung beberapa fitur "integrasi shell". Fitur-fitur ini membuat baris perintah lebih mudah digunakan. Dalam rilis sebelumnya, kami mengaktifkan shell untuk memberi tahu Terminal apa direktori kerja saat ini. Sekarang, kami telah menambahkan dukungan untuk lebih banyak urutan untuk memungkinkan shell Anda menggambarkan bagian output terminal secara semantik sebagai "prompt", "command", atau "output". Shell juga dapat memberi tahu terminal apakah perintah berhasil atau gagal.
Ini adalah panduan untuk beberapa fitur integrasi shell yang telah kami luncurkan per Terminal v1.18. Kami berencana untuk membangun lebih banyak fitur di atasnya di masa depan, jadi kami ingin mendapatkan umpan balik tambahan tentang cara orang menggunakannya.
Catatan: Pada Terminal 1.21, tanda sekarang menjadi fitur yang stabil. Sebelum 1.21, tanda hanya diaktifkan untuk build Pratinjau Terminal. Jika Anda menggunakan versi Terminal sebelum 1.21,
showMarksOnScrollbar
pengaturan diberi namaexperimental.showMarksOnScrollbar
, danautoMarkPrompts
diberi namaexperimental.autoMarkPrompts
.
Bagaimana cara kerjanya?
Integrasi shell bekerja dengan memiliki shell (atau aplikasi baris perintah apa pun) menulis "urutan escape" khusus ke Terminal. Urutan escape ini tidak dicetak ke Terminal - sebagai gantinya, mereka menyediakan bit metadata yang dapat digunakan terminal untuk mengetahui lebih lanjut tentang apa yang terjadi dalam aplikasi. Dengan menempelkan urutan ini ke dalam prompt shell Anda, Anda dapat memiliki shell terus memberikan info ke terminal yang hanya diketahui shell.
Untuk urutan berikut:
OSC
adalah string"\x1b]"
- karakter escape, diikuti oleh]
ST
adalah "terminator string", dan dapat berupa\x1b\
(karakter ESC, diikuti oleh\
) atau\x7
(karakter BEL)- Spasi hanyalah ilustrasi.
- String in
<>
adalah parameter yang harus digantikan oleh beberapa nilai lain.
Urutan integrasi shell yang didukung yang relevan pada Terminal v1.18 adalah:
OSC 133 ; A ST
("FTCS_PROMPT") - Awal perintah.OSC 133 ; B ST
("FTCS_COMMAND_START") - Awal perintah (BACA: akhir perintah).OSC 133 ; C ST
("FTCS_COMMAND_EXECUTED") - Awal output perintah/akhir baris perintah.OSC 133 ; D ; <ExitCode> ST
("FTCS_COMMAND_FINISHED") - akhir perintah.ExitCode
JikaExitCode
disediakan, maka Terminal akan memperlakukan0
sebagai "sukses" dan apa pun sebagai kesalahan. Jika dihilangkan, terminal hanya akan meninggalkan tanda warna default.
Cara mengaktifkan tanda integrasi shell
Mendukung fitur-fitur ini membutuhkan kerja sama antara shell Anda dan Terminal. Anda harus mengaktifkan pengaturan di Terminal untuk menggunakan fitur baru ini, serta memodifikasi permintaan shell Anda.
Untuk mengaktifkan fitur-fitur ini di Terminal, Anda mungkin ingin menambahkan yang berikut ini ke pengaturan Anda:
"profiles":
{
"defaults":
{
// Enable marks on the scrollbar
"showMarksOnScrollbar": true,
// Needed for both pwsh, CMD and bash shell integration
"autoMarkPrompts": true,
// Add support for a right-click context menu
// You can also just bind the `showContextMenu` action
"experimental.rightClickContextMenu": true,
},
}
"actions":
[
// Scroll between prompts
{ "keys": "ctrl+up", "command": { "action": "scrollToMark", "direction": "previous" }, },
{ "keys": "ctrl+down", "command": { "action": "scrollToMark", "direction": "next" }, },
// Add the ability to select a whole command (or its output)
{ "command": { "action": "selectOutput", "direction": "prev" }, },
{ "command": { "action": "selectOutput", "direction": "next" }, },
{ "command": { "action": "selectCommand", "direction": "prev" }, },
{ "command": { "action": "selectCommand", "direction": "next" }, },
]
Bagaimana Anda mengaktifkan tanda-tanda ini di shell Anda bervariasi dari shell ke shell. Di bawah ini adalah tutorial untuk CMD, PowerShell, dan Zsh.
PowerShell (pwsh.exe
)
Jika Anda belum pernah mengubah perintah PowerShell sebelumnya, Anda harus memeriksa about_Prompts terlebih dahulu.
Kami harus mengedit Anda prompt
untuk memastikan kami memberi tahu Terminal tentang CWD, dan menandai prompt dengan tanda yang sesuai. PowerShell juga memungkinkan kita menyertakan kode kesalahan dari perintah sebelumnya dalam 133;D
urutan, yang akan memungkinkan terminal secara otomatis mewarnai tanda berdasarkan jika perintah berhasil atau gagal.
Tambahkan yang berikut ini ke profil PowerShell Anda:
$Global:__LastHistoryId = -1
function Global:__Terminal-Get-LastExitCode {
if ($? -eq $True) {
return 0
}
$LastHistoryEntry = $(Get-History -Count 1)
$IsPowerShellError = $Error[0].InvocationInfo.HistoryId -eq $LastHistoryEntry.Id
if ($IsPowerShellError) {
return -1
}
return $LastExitCode
}
function prompt {
# First, emit a mark for the _end_ of the previous command.
$gle = $(__Terminal-Get-LastExitCode);
$LastHistoryEntry = $(Get-History -Count 1)
# Skip finishing the command if the first command has not yet started
if ($Global:__LastHistoryId -ne -1) {
if ($LastHistoryEntry.Id -eq $Global:__LastHistoryId) {
# Don't provide a command line or exit code if there was no history entry (eg. ctrl+c, enter on no command)
$out += "`e]133;D`a"
} else {
$out += "`e]133;D;$gle`a"
}
}
$loc = $($executionContext.SessionState.Path.CurrentLocation);
# Prompt started
$out += "`e]133;A$([char]07)";
# CWD
$out += "`e]9;9;`"$loc`"$([char]07)";
# (your prompt here)
$out += "PWSH $loc$('>' * ($nestedPromptLevel + 1)) ";
# Prompt ended, Command started
$out += "`e]133;B$([char]07)";
$Global:__LastHistoryId = $LastHistoryEntry.Id
return $out
}
Pengaturan Oh My Posh
Menggunakan oh-my-posh? Anda mungkin ingin sedikit memodifikasi hal di atas, untuk menyimpan prompt asli, lalu menambahkannya kembali di tengah urutan escape integrasi shell.
# initialize oh-my-posh at the top of your profile.ps1
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\gruvbox.omp.json" | Invoke-Expression
# then stash away the prompt() that oh-my-posh sets
$Global:__OriginalPrompt = $function:Prompt
function Global:__Terminal-Get-LastExitCode {
if ($? -eq $True) { return 0 }
$LastHistoryEntry = $(Get-History -Count 1)
$IsPowerShellError = $Error[0].InvocationInfo.HistoryId -eq $LastHistoryEntry.Id
if ($IsPowerShellError) { return -1 }
return $LastExitCode
}
function prompt {
$gle = $(__Terminal-Get-LastExitCode);
$LastHistoryEntry = $(Get-History -Count 1)
if ($Global:__LastHistoryId -ne -1) {
if ($LastHistoryEntry.Id -eq $Global:__LastHistoryId) {
$out += "`e]133;D`a"
} else {
$out += "`e]133;D;$gle`a"
}
}
$loc = $($executionContext.SessionState.Path.CurrentLocation);
$out += "`e]133;A$([char]07)";
$out += "`e]9;9;`"$loc`"$([char]07)";
$out += $Global:__OriginalPrompt.Invoke(); # <-- This line adds the original prompt back
$out += "`e]133;B$([char]07)";
$Global:__LastHistoryId = $LastHistoryEntry.Id
return $out
}
perintah
Sumber Prompt Perintah, perintah dari PROMPT
variabel lingkungan. CMD.exe dibaca $e
sebagai ESC
karakter. Sayangnya, CMD.exe tidak memiliki cara untuk mendapatkan kode pengembalian perintah sebelumnya dalam perintah, jadi kami tidak dapat memberikan informasi keberhasilan / kesalahan dalam perintah CMD.
Anda dapat mengubah permintaan untuk instans CMD.exe saat ini dengan menjalankan:
PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\
Atau, Anda dapat mengatur variabel dari commandline untuk semua sesi mendatang:
setx PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\
Contoh-contoh ini mengasumsikan saat ini PROMPT
Anda hanya $P$G
. Anda dapat memilih untuk membungkus perintah Anda saat ini dengan sesuatu seperti:
PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\%PROMPT%$e]133;B$e\
Bash
Anda dapat menambahkan yang berikut ini ke akhir Anda ~/.bashrc
untuk mengaktifkan integrasi shell di bash:
PS1="\[\033]133;D;\007\]\[\033]133;A;\007\]$PS1\[\033]133;B;\007\]"
Ini akan membungkus Anda yang ada $PS1
dengan urutan yang diperlukan untuk mengaktifkan integrasi shell.
Catatan: Tidak melihat shell favorit Anda di sini? Jika Anda mengetahuinya, jangan ragu untuk berkontribusi solusi untuk shell pilihan Anda!
Fitur integrasi Shell
Buka tab baru di direktori kerja yang sama
Perlihatkan tanda untuk setiap perintah di bilah gulir
Melompat di antara perintah secara otomatis
Ini menggunakan tindakan seperti scrollToMark
yang telah kita tentukan di atas.
Pilih seluruh output perintah
Dalam gif ini, kita menggunakan tindakan yang selectOutput
terikat untuk ctrl+g
memilih seluruh output perintah.
Berikut ini menggunakan experimental.rightClickContextMenu
pengaturan untuk mengaktifkan menu konteks klik kanan di Terminal. Dengan mengaktifkan integrasi shell dan itu, Anda dapat mengklik kanan pada perintah untuk memilih seluruh perintah atau outputnya.
Saran perintah terbaru
Dengan integrasi shell diaktifkan, UI Saran dapat dikonfigurasi untuk juga menampilkan perintah terbaru Anda.
Anda dapat membuka menu ini dengan tindakan berikut:
{
"command": { "action": "showSuggestions", "source": "recentCommands", "useCommandline": true },
},
(Untuk informasi selengkapnya, lihat Dokumentasi saran)
Sumber Daya Tambahan:
Windows Terminal