Kabuk Tümleştirmesi

Terminal 1.15 Preview'dan başlayarak, Windows Terminali deneysel olarak bazı "kabuk tümleştirmesi" özelliklerini desteklemeye başlamıştır. Bu özellikler komut satırının kullanımını kolaylaştırır. Önceki sürümlerde, terminale geçerli çalışma dizininin ne olduğunu bildirmek için kabuğu etkinleştirdik. Şimdi, kabuğunuzun terminal çıkışının bölümlerini "istem", "komut" veya "çıkış" olarak semantik olarak tanımlamasını sağlamak için daha fazla dizi desteği ekledik. Kabuk, terminale bir komutun başarılı mı yoksa başarısız mı olduğunu da söyleyebilir.

Bu, Terminal v1.18'de kullanıma sunduğumuz kabuk tümleştirme özelliklerinden bazıları için bir kılavuzdur. Gelecekte bunların üzerine daha da fazla özellik derlemeyi planlıyoruz, bu nedenle insanların bunları nasıl kullandığı hakkında ek geri bildirim almak istiyoruz.

Not: Terminal 1.21 itibarıyla işaretler artık kararlı bir özellik. 1.21'in öncesinde işaretler yalnızca Terminalin Önizleme derlemeleri için etkinleştirildi. Terminal'in 1.21'den önceki bir sürümünü kullanıyorsanız, showMarksOnScrollbar ayar olarak adlandırılmış experimental.showMarksOnScrollbarve autoMarkPrompts olarak adlandırılmıştır experimental.autoMarkPrompts.

Bu nasıl çalışır?

Kabuk tümleştirmesi, kabuğun (veya herhangi bir komut satırı uygulamasının) Terminale özel "kaçış dizileri" yazmasını sağlayarak çalışır. Bu kaçış dizileri Terminal'e yazdırılmaz. Bunun yerine, terminalin uygulamada neler olduğu hakkında daha fazla bilgi edinmek için kullanabileceği meta veri bitleri sağlar. Bu dizileri kabuğunuzun istemine yapıştırarak, kabuğun terminale yalnızca kabuğun bildiği bilgileri sürekli olarak sağlamasını sağlayabilirsiniz.

Aşağıdaki diziler için:

  • OSC dizedir "\x1b]" - bir kaçış karakteri ve ardından ]
  • ST"dize sonlandırıcısı"dır ve (esc karakteri, ardından \) veya \x7 (BEL karakteri) olabilir \x1b\
  • Boşluklar yalnızca açıklayıcıdır.
  • içindeki <> dizeler, başka bir değerle değiştirilmesi gereken parametrelerdir.

Terminal v1.18 itibarıyla desteklenen ilgili kabuk tümleştirme sıraları şunlardır:

  • OSC 133 ; A ST ("FTCS_PROMPT") - bir istem başlangıcı.
  • OSC 133 ; B ST ("FTCS_COMMAND_START") - Komut satırının başlangıcı (OKUMA: istemin sonu).
  • OSC 133 ; C ST ("FTCS_COMMAND_EXECUTED") - Komut çıkışının başlangıcı / komut satırının sonu.
  • OSC 133 ; D ; <ExitCode> ST ("FTCS_COMMAND_FINISHED") - komutun sonu. ExitCode Sağlanırsa ExitCode , Terminal "başarılı" ve diğer her şeyi hata olarak ele 0 alır. Atlanırsa, terminal yalnızca varsayılan rengi işaretle seçeneğini bırakır.

Kabuk tümleştirme işaretlerini etkinleştirme

Bu özelliklerin desteklenmesi için kabuğunuzla Terminal arasında işbirliği yapılması gerekir. Bu yeni özellikleri kullanmak için hem Terminal'deki ayarları etkinleştirmeniz hem de kabuğunuzun istemini değiştirmeniz gerekir.

Terminalde bu özellikleri etkinleştirmek için ayarlarınıza aşağıdakileri eklemek istersiniz:

"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" }, },
]

Kabuğunuzda bu işaretleri nasıl etkinleştirdiğiniz kabuktan kabuğa farklılık gösterir. Aşağıda CMD, PowerShell ve Zsh öğreticileri yer almaktadır.

PowerShell (pwsh.exe)

PowerShell isteminizi daha önce hiç değiştirmediyseniz, önce about_Prompts göz atmalısınız.

CWD hakkında Terminal'e bilgi vermek ve istemleri uygun işaretler ile işaretlemek için öğesini prompt düzenlememiz gerekir. PowerShell ayrıca, komutun başarılı veya başarısız olmasına bağlı olarak terminalin işareti otomatik olarak renklendirmesine olanak tanıyan önceki komuttan 133;D gelen hata kodunu sıralamaya eklememizi sağlar.

PowerShell profilinize aşağıdakileri ekleyin:

$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
}

Oh My Posh kurulumu

oh-my-posh mu kullanıyorsunuz? Yukarıdakini biraz değiştirmek, özgün istemleri saklamak ve ardından kabuk tümleştirme kaçış dizilerinin ortasına geri eklemek isteyeceksiniz.

# 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
}

Komut İstemi

Komut İstemi, istemini ortam değişkeninden PROMPT kaynaklar. CMD.exe karakter olarak ESC okur$e. Ne yazık ki, CMD.exe komut isteminde önceki komutun dönüş kodunu almak için bir yolu yoktur, bu nedenle CMD istemlerinde başarı / hata bilgilerini sağlayamıyoruz.

Şu komutu çalıştırarak geçerli CMD.exe örneğinin istemini değiştirebilirsiniz:

PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\

Alternatif olarak, değişkeni gelecekteki tüm oturumlar için komut satırından ayarlayabilirsiniz:

setx PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\

Bu örneklerde, geçerlinizin PROMPT yalnızca $P$Golduğu varsayılır. Bunun yerine, geçerli isteminizi şöyle bir şeyle kaydırmayı seçebilirsiniz:

PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\%PROMPT%$e]133;B$e\

Bash

Aşağıdaki betiği etkin bir kabuğa veya yerleşik bash komutlarla .source kaynaklayabilir ya da (oturum açma kabukları için) veya ${HOME}/.bashrc (oturum açma dışı kabuklar için) sonuna ekleyerek ${HOME}/.bash_profile daha büyük veya buna eşit bash-4.4 sürümlerle tam bir kabuk tümleştirmesi bash etkinleştirebilirsiniz (yerleşik değişkenin PS0başlangıçta uygulandığı yer). Tam kabuk tümleştirmesi, duyurulan her terminal özelliğinin tasarlandığı gibi çalıştığı anlamına gelir.

Uyarı

Tahmin edilemeyen sonuçlara yol açabilecek varsayılan olmayan değerlere zaten atanmış , PS0PS1 veya PS2 değişkenleri varsaPROMPT_COMMAND, buna işaret edilmelidir. Betiği önce "temiz" kabukla test etmek için daha önce belirtildiği gibi açıklanan dosyayı yürütür env --ignore-environment bash --noprofile --norc ve kaynak oluşturur.

# .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}"

Bu, PS1 tüm komut istemi değişkenlerini bash (PS0ve PS2) tüm kabuk tümleştirmesini etkinleştirmek için gerekli dizilerle sarmalar.

Ayrıca, ${HOME}/.inputrc "düzenleme modu bildirimi" ve "değiştirilen satırlar" işaretlerini kaldırmak için de bir ayarlama gerekebilir:

# .inputrc

set mark-modified-lines Off
set show-mode-in-prompt Off

Her şey doğru şekilde yapılırsa bu şekilde görünmelidir:

$ 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}|"
||

Not: Sık kullandığınız kabuğu burada göremiyor musunuz? Bunu anlayabilirseniz tercih ettiğiniz kabuk için bir çözüme katkıda bulunabilirsiniz!

Kabuk tümleştirme özellikleri

Aynı çalışma dizininde yeni sekmeler açma

Aynı çalışma dizininde yeni sekmeler açma

Kaydırma çubuğundaki her komut için işaretleri göster

Kaydırma çubuğundaki her komut için işaretleri göster

Komutlar arasında otomatik olarak atlama

Bu, scrollToMark yukarıda tanımladığımız eylemleri kullanır.

Komutlar arasında otomatik olarak atlama

Komutun tüm çıkışını seçme

Bu gif'te, komutun selectOutput tüm çıkışını seçmek için öğesine ctrl+g bağlı eylemi kullanırız. Komutun tüm çıkışını seçme

Aşağıda, Terminal'de experimental.rightClickContextMenu sağ tıklama bağlam menüsünü etkinleştirmek için ayarı kullanılır. Bu ve kabuk tümleştirmesi etkinleştirildiğinde, komutun tamamını veya çıktısını seçmek için bir komuta sağ tıklayabilirsiniz.

Sağ tıklama bağlam menüsünü kullanarak komutu seçin

Son komut önerileri

Kabuk tümleştirmesi etkinleştirildiğinde Öneriler kullanıcı arabirimi, son komutlarınızı da gösterecek şekilde yapılandırılabilir.

en son komutları gösteren öneriler kullanıcı arabirimi

Bu menüyü aşağıdaki eylemle açabilirsiniz:

{
    "command": { "action": "showSuggestions", "source": "recentCommands", "useCommandline": true },
},

(Daha fazla bilgi için Öneriler belgelerine bakın)

Ek kaynaklar