Bagikan melalui


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 nama experimental.showMarksOnScrollbar, dan autoMarkPrompts diberi nama experimental.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 Jika ExitCode disediakan, maka Terminal akan memperlakukan 0 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

Buka tab baru di direktori kerja yang sama

Perlihatkan tanda untuk setiap perintah di bilah gulir

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.

Melompat di antara perintah secara otomatis

Pilih seluruh output perintah

Dalam gif ini, kita menggunakan tindakan yang selectOutput terikat untuk ctrl+g memilih seluruh output perintah. Pilih 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.

Pilih perintah menggunakan menu konteks klik kanan

Saran perintah terbaru

Dengan integrasi shell diaktifkan, UI Saran dapat dikonfigurasi untuk juga menampilkan perintah terbaru Anda.

Antarmuka pengguna saran memperlihatkan perintah terbaru di dalamnya

Anda dapat membuka menu ini dengan tindakan berikut:

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

(Untuk informasi selengkapnya, lihat Dokumentasi saran)

Sumber Daya Tambahan: