Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
- Shell-integratie
Vanaf Terminal 1.15 Preview is de Windows Terminal begonnen met het experimenteel ondersteunen van enkele 'shell-integratie'-functies. Deze functies maken de opdrachtregel gemakkelijker te gebruiken. In eerdere versies hebben we shell ingeschakeld om de Terminal te laten weten wat de huidige werkmap is. Nu hebben we ondersteuning toegevoegd voor meer reeksen, zodat uw shell delen van de terminaluitvoer semantisch kan beschrijven als een 'prompt', een 'opdracht' of 'uitvoer'. De shell kan ook de terminal vertellen of een opdracht is geslaagd of mislukt.
Dit is een handleiding voor enkele van de shell-integratiefuncties die we hebben geïmplementeerd vanaf Terminal v1.18. We zijn van plan om in de toekomst nog meer functies op te bouwen, dus we willen graag aanvullende feedback krijgen over hoe mensen ze gebruiken.
Opmerking: vanaf Terminal 1.21 zijn markeringen nu een stabiele functie. Vóór 1.21 werden alleen markeringen ingeschakeld voor Preview-builds van de Terminal. Als u vóór 1.21 een versie van Terminal gebruikt, heeft de instelling de
showMarksOnScrollbarnaamexperimental.showMarksOnScrollbarenautoMarkPromptsde naamexperimental.autoMarkPrompts.
Hoe werkt dit?
Shell-integratie werkt door de shell (of een opdrachtregeltoepassing) speciale escape-reeksen naar de Terminal te laten schrijven. Deze escapereeksen worden niet afgedrukt naar de Terminal. In plaats daarvan bieden ze bits van metagegevens die de terminal kan gebruiken om meer te weten te komen over wat er in de toepassing gebeurt. Als u deze reeksen in de prompt van uw shell plakt, kunt u de shell continu informatie geven aan de terminal die alleen de shell kent.
Voor de volgende reeksen:
-
OSCis de tekenreeks"\x1b]"- een escape-teken, gevolgd door] -
STis de "tekenreekseindteken" en kan (een ESC-teken, gevolgd door\) of\x7(het BEL-teken) zijn\x1b\ - Spaties zijn slechts illustratief.
- Tekenreeksen in
<>zijn parameters die moeten worden vervangen door een andere waarde.
De relevante ondersteunde shell-integratiereeksen vanaf Terminal v1.18 zijn:
-
OSC 133 ; A ST("FTCS_PROMPT"): het begin van een prompt. -
OSC 133 ; B ST('FTCS_COMMAND_START'): het begin van een opdrachtregel (READ: het einde van de prompt). -
OSC 133 ; C ST('FTCS_COMMAND_EXECUTED'): het begin van de opdrachtuitvoer/het einde van de opdrachtregel. -
OSC 133 ; D ; <ExitCode> ST("FTCS_COMMAND_FINISHED") - het einde van een opdracht.ExitCodeAlsExitCodedit is opgegeven, wordt de Terminal als0'geslaagd' en als een fout behandeld. Als u dit weglaat, laat de terminal de standaardkleur staan.
Shell-integratiemarkeringen inschakelen
Voor het ondersteunen van deze functies is samenwerking tussen uw shell en de Terminal vereist. U moet beide instellingen inschakelen in de Terminal om deze nieuwe functies te kunnen gebruiken, en de prompt van uw shell wijzigen.
Als u deze functies in de Terminal wilt inschakelen, moet u het volgende toevoegen aan uw instellingen:
"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" }, },
]
Hoe u deze markeringen in uw shell inschakelt, verschilt van shell tot shell. Hieronder volgen zelfstudies voor CMD, PowerShell en Zsh.
PowerShell (pwsh.exe)
Als u de PowerShell-prompt nog nooit eerder hebt gewijzigd, moet u eerst about_Prompts uitchecken.
We moeten uw prompt bewerking bewerken om ervoor te zorgen dat we de Terminal over de CWD vertellen en de prompt markeren met de juiste markeringen. Met PowerShell kunnen we ook de foutcode van de vorige opdracht in de 133;D reeks opnemen, zodat de terminal de markering automatisch kan kleuren als de opdracht is geslaagd of mislukt.
Voeg het volgende toe aan uw PowerShell-profiel:
$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
}
Mijn posh-installatie
Gebruikt u oh-my-posh? U wilt het bovenstaande enigszins wijzigen om de oorspronkelijke prompt weg te laten en deze vervolgens weer in het midden van de escapereeksen voor shell-integratie toe te voegen.
# 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
}
Opdrachtprompt
Met de opdrachtprompt wordt de prompt uit de PROMPT omgevingsvariabele opgehaald. CMD.exe wordt gelezen $e als het ESC teken. Helaas heeft CMD.exe geen manier om de retourcode van de vorige opdracht in de prompt op te halen, dus we kunnen geen geslaagde/foutinformatie opgeven in CMD-prompts.
U kunt de prompt voor het huidige CMD.exe exemplaar wijzigen door het volgende uit te voeren:
PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\
U kunt de variabele ook instellen vanaf de opdrachtregel voor alle toekomstige sessies:
setx PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\
In deze voorbeelden wordt ervan uitgegaan dat uw huidige PROMPT alleen $P$Gis. U kunt er in plaats daarvan voor kiezen om uw huidige prompt in te pakken met bijvoorbeeld:
PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\%PROMPT%$e]133;B$e\
Bash (een Unix-shell en programmeertaal)
U kunt het volgende script aan een actieve shell met source of . ingebouwde bash opdrachten toevoegen of toevoegen aan het einde van uw ${HOME}/.bash_profile (voor aanmeldingsshells) of ${HOME}/.bashrc (voor niet-aanmeldingsshells) om een volledige shell-integratie in te schakelen in bash versies die groter of gelijk zijn aan bash-4.4 (waarbij de PS0 ingebouwde variabele in eerste instantie is geïmplementeerd).
Volledige shell-integratie betekent dat elke aangekondigde terminalfunctie werkt zoals ontworpen.
Opmerking
Er moet op worden gewezen dat als er al variabelen PS0PS1PS2 zijn PROMPT_COMMANDtoegewezen aan niet-standaardwaarden die tot onvoorspelbare resultaten kunnen leiden. Het is beter om het script eerst te testen met de 'schone' shell door het beschreven bestand uit te env --ignore-environment bash --noprofile --norc voeren en te sourcen zoals eerder is aangegeven.
# .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}"
Hiermee verpakt u alle soorten bash promptvariabelen (PS0PS1enPS2) met de benodigde reeksen om de volledige shell-integratie mogelijk te maken.
Daarnaast ${HOME}/.inputrc moet mogelijk ook een aanpassing nodig zijn om de "meldingsmodus voor bewerkingsmodus" en "gewijzigde regels" tekens te verwijderen:
# .inputrc
set mark-modified-lines Off
set show-mode-in-prompt Off
Dat is hoe het eruit moet zien als alles correct wordt uitgevoerd:
$ 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}|"
||
Opmerking: Ziet u hier uw favoriete shell niet? Als u het uitzoekt, kunt u gerust een oplossing bijdragen voor uw favoriete shell!
Shell-integratiefuncties
Nieuwe tabbladen openen in dezelfde werkmap
Markeringen weergeven voor elke opdracht in de schuifbalk
Automatisch schakelen tussen opdrachten
Hierbij worden de scrollToMark acties gebruikt zoals hierboven is gedefinieerd.
De volledige uitvoer van een opdracht selecteren
In dit GIF-bestand gebruiken we de selectOutput actie die is gebonden om de volledige uitvoer van een opdracht te ctrl+g selecteren.
Hieronder wordt de experimental.rightClickContextMenu instelling gebruikt om een snelmenu in te schakelen in de Terminal. Als deze en shell-integratie zijn ingeschakeld, kunt u met de rechtermuisknop op een opdracht klikken om de volledige opdracht of de uitvoer ervan te selecteren.
Recente opdrachtsuggesties
Als shell-integratie is ingeschakeld, kan de gebruikersinterface voor suggesties worden geconfigureerd om ook recente opdrachten weer te geven.
U kunt dit menu openen met de volgende actie:
{
"command": { "action": "showSuggestions", "source": "recentCommands", "useCommandline": true },
},
(Zie de documentatie voor suggesties voor meer informatie)
Aanvullende bronnen
Windows Terminal