Programmers spend a lot of time on the command line, and all of us have our favorite Linux shells, or debate the merits of MS-DOS vs. PowerShell (hint: use PowerShell), but there is a niche area in the open source community dedicated to building better terminal emulators with bells, whistles, and plugins, and some of them can change the way you approach command line interfaces.

Many months ago I came across Hyper, which is a fully extensible terminal emulator written in Electron by the same people who brought you Zeit. It is built on open standards, you can customize key mappings, colors, and behaviors, and you can even install plugins for added bells and whistles. It also allows for multiple tabs.

Hyper lets you pick between DOS, PowerShell, and Bash (which includes Bash on Windows), but you need to select your shell in the configuration file. There currently isn't a way to switch shells easily and intuitively, and one of the most requested features is to be able to choose your shell per tab, so you can have multiple tabs open, but with different shells.

Luckily, there's a script for that. GitHub user legowerewolf put together a batch script that can be used in conjunction with Hyper in order to prompt the user for their preferred shell on a per window/per tab basis.

@ECHO off
:top
CLS
ECHO Choose a shell:
ECHO [1] cmd
ECHO [2] bash
ECHO [3] PowerShell
ECHO [4] Python
ECHO.
ECHO [5] restart elevated
ECHO [6] exit
ECHO.

CHOICE /N /C:123456 /M "> "
CLS
IF ERRORLEVEL ==6 GOTO end
IF ERRORLEVEL ==5 powershell -Command "Start-Process hyper -Verb RunAs"
IF ERRORLEVEL ==4 python
IF ERRORLEVEL ==3 powershell
IF ERRORLEVEL ==2 bash
IF ERRORLEVEL ==1 cmd

CLS
ECHO Switch or exit?
ECHO [1] Switch
ECHO [2] Exit

CHOICE /N /C:12 /D 2 /T 5 /M "> "
IF ERRORLEVEL ==2 GOTO end
IF ERRORLEVEL ==1 GOTO top

:end
view rawhyperstart.bat hosted with ? by GitHub
$knownshells = @(
    @{
        Name       = "CMD"
        Executable = "$env:SystemRoot\System32\cmd.exe"
    },
    @{
        Name       = "Powershell 5.1"
        Executable = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
    },
    @{
        Name       = "Powershell 6 (Core)"
        Executable = "$env:ProgramFiles\PowerShell\6\pwsh.exe"
    },
    @{
        Name       = "Powershell 7 (Core)"
        Executable = "$env:ProgramFiles\PowerShell\7\pwsh.exe"
    },
    @{
        Name       = "Bash on Ubuntu"
        Executable = "$env:ProgramFiles\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_1804.2020.5.0_x64__79rhkp1fndgsc\ubuntu.exe"
    },
    @{
        Name       = "Git Bash"
        Executable = "$env:ProgramFiles\Git\git-bash.exe"
    }
) | Where-Object { Test-Path -Path $_.Executable }

"Choose a shell:"

$index = 1; $teststring = ""
foreach ($shell in $knownshells) {
    "[$index] $($shell.Name)"
    $teststring += $index++
}

""

do { $keyPress = [System.Console]::ReadKey() } until ($teststring.Contains($keyPress.Key));

$choice = $knownshells[($keyPress.KeyChar.ToString() -as [int]) - 1]

Start-Process -Path $choice.Executable -NoNewWindow -Wait -ArgumentList $choice.ArgumentList

exit
view rawhyperstart.ps1 hosted with ? by GitHub
Hyperstart
Short script for Windows that allows you to select which shell you want when Hyper starts. As flexible as the windows command line.

Install
Grab the script from below.
Save it wherever you want.
Set your shell to '' (meaning CMD on Windows) and your shellArgs to ["/C", "path\\to\\your\\hyperstart.bat"]
Additional steps
To enable the "launch elevated" line, Hyper needs to be on the PATH.
Customize
Add a shell
Add another ECHO line with a new number: ECHO [4] Python
Add the corresponding number to the CHOICE line: CHOICE /N /C:1234
Add the corresponding IF ERRORLEVEL line below the CLS line: IF ERRORLEVEL ==4 python
Fix up the other numbers, if necessary.