Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
- 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,
showMarksOnScrollbarpengaturan diberi namaexperimental.showMarksOnScrollbar, danautoMarkPromptsdiberi 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:
-
OSCadalah string"\x1b]"- karakter escape, diikuti oleh] -
STadalah "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.ExitCodeJikaExitCodedisediakan, maka Terminal akan memperlakukan0sebagai "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
Command Prompt mengambil permintaannya 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 menyertakan skrip berikut ke shell aktif dengan source atau . perintah bawaan bash atau menambahkannya ke akhir ${HOME}/.bash_profile Anda (untuk shell login) atau ${HOME}/.bashrc (untuk shell non-login) untuk mengaktifkan integrasi shell lengkap dengan bash versi lebih besar atau sama dengan bash-4.4 (di mana PS0 variabel bawaan diimplementasikan awalnya).
Integrasi shell lengkap berarti bahwa setiap fitur terminal yang diumumkan berfungsi seperti yang dirancang.
Nota
Harus ditunjukkan bahwa jika ada variabel PROMPT_COMMAND, PS0, PS1, atau PS2 yang sudah ditetapkan ke nilai non-default, hal itu dapat menyebabkan hasil yang tidak dapat diprediksi. Akan lebih baik untuk menguji skrip dengan shell "bersih" terlebih dahulu dengan mengeksekusi env --ignore-environment bash --noprofile --norc dan menjalankan file yang dijelaskan seperti yang telah ditunjukkan sebelumnya.
# .bash_profile | .bashrc
function __set_ps1() {
local PS1_TMP="${__PS1_BASE}"
if [ ! -z "${__IS_WT}" ]; then
local __FTCS_CMD_FINISHED='\e]133;D;'"${1}"'\e\\'
PS1_TMP="\[${__FTCS_CMD_FINISHED}\]${__PS1_BASE}"
fi
printf '%s' "${PS1_TMP}"
}
function __prompt_command() {
# Must be first in the list otherwise the exit status will be overwritten.
local PS1_EXIT_STATUS=${?}
PS1="$(__set_ps1 ${PS1_EXIT_STATUS})"
}
# ---------------------------------------------------------------------------
# PROMPT (PS0..PS2).
# The given variable might be linked to a function detecting whether `bash`
# actually runs under `Microsoft Terminal` otherwise unexpected garbage might
# be displayed on the user screen.
__IS_WT='true'
printf -v __BASH_V '%d' ${BASH_VERSINFO[*]:0:2}
if [ ${__BASH_V} -ge 44 ]; then
__PS0_BASE=''
fi
# The following assignments reflect the default values.
__PS1_BASE='\s-\v\$ '
__PS2_BASE='> '
if [ ! -z "${__IS_WT}" ]; then
__FTCS_PROMPT='\e]133;A\e\\'
__FTCS_CMD_START='\e]133;B\e\\'
if [ ${__BASH_V} -ge 44 ]; then
__FTCS_CMD_EXECUTED='\e]133;C\e\\'
__PS0_BASE="\[${__FTCS_CMD_EXECUTED}\]"
fi
__PS1_BASE="\[${__FTCS_PROMPT}\]${__PS1_BASE}\[${__FTCS_CMD_START}\]"
# Required, otherwise the `PS2` prefix will split and corrupt a long
# command.
__PS2_BASE=''
fi
PROMPT_COMMAND=__prompt_command
if [ ${__BASH_V} -ge 44 ]; then
PS0="${__PS0_BASE}"
fi
# `PS1` is set with the `__prompt_command` function call.
PS2="${__PS2_BASE}"
Mengemas berbagai variabel prompt bash (PS0, PS1 dan PS2) dengan rangkaian yang diperlukan untuk mengaktifkan integrasi shell lengkap.
Selain itu, ${HOME}/.inputrc mungkin juga memerlukan penyesuaian untuk menghapus tanda "pemberitahuan mode pengeditan" dan "garis yang dimodifikasi":
# .inputrc
set mark-modified-lines Off
set show-mode-in-prompt Off
Seperti itulah tampilannya jika semuanya dilakukan dengan benar:
$ env --ignore-environment bash --noprofile --norc
bash-5.2$ . /tmp/msft-terminal-bash.sh
bash-5.2$ echo "|${PS0}|"
|\[\e]133;C\e\\\]|
bash-5.2$ echo "|${PS1}|"
|\[\e]133;D;0\e\\\]\[\e]133;A\e\\\]\s-\v\$ \[\e]133;B\e\\\]|
bash-5.2$ echo "|${PS2}|"
||
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