Shells
Bash
A recent version of Bash is preferable. Bash 5.1 or later is recommended.
MisTTY works best with shells that support bracketed paste. Without bracketed paste support, MisTTY will still work, but might behaves unexpectedly when yanking text containing special characters.
Bash 4.5 to 5.0 supports bracketed paste, but it must be turned
on in your .inputrc, as follows:
set enable-bracketed-paste on
Bash versions older than 4.5 don’t support bracketed paste.
Additionally, Bash versions older than 4.4 require extra setup to enable directory tracking, as documented in Directory tracking in Bash.
Multi-line prompts in Bash
When you press RET on an incomplete command, bash has the annoying habit of starting a secondary prompt which doesn’t let you go back to the previous line with the default keybindings.
To work around that, type S-<return> instead of RET while on the terminal zone of a MisTTY buffer. This sends a newline without running the command. You’ll then end up with one multi-line prompt that you can edit normally. This requires Bash 5.1 or an earlier version with bracketed paste mode turned on.
You’ll get the same effect if you yank a multi-line command while in a prompt or go up the command history to a previous multi-line command.
Please be aware that when editing a multi-line command in Bash, MisTTY may leave trailing spaces at the end of some lines. In situations where these are significant, you will need to remove trailing spaces using C-d or DEL.
Directory tracking in Bash
Recent versions of bash already send the current directory
when they detects that it’s called from Emacs with
TERM=eterm-color. This works fine for local shell as well as remote
shells run with TRAMP.
If you ssh into a host from an existing MisTTY buffer, however, bash will not send the remote directory. If you want this use case to work, extend your prompt to send out an OSC7 sequence to have bash send the current directory and hostname to MisTTY.
To do that, you might add the following to ~/.bashrc:
if [ "$TERM" = "eterm-color" ]; then
PS1='\[\e]7;file://$HOSTNAME$PWD\e\\\\\]'$PS1
fi
Such sequence are either ignored or understood by most terminals, so you don’t absolutely need to check TERM.
Versions of bash older than 4.4 only enable directory
tracking if the env variable EMACS is set. You can have MisTTY set
this env variable when it starts a shell by going to M-x
customize-option mistty-set-EMACS. mistty-set-EMACS also
works as a connection-local variable, to set the EMACS env variable
only on some hosts that use an old version of bash.
For example:
(connection-local-set-profile-variables
'profile-old-bash
'((mistty-set-EMACS . t)
(mistty-shell-command . ("/bin/bash" "-i"))))
(connection-local-set-profiles '(:machine "oldhost.example.com")
'profile-old-bash)
(connection-local-set-profiles '(:protocol "docker")
'profile-old-bash)"
VI mode in Bash
To communicate with bash, MisTTY requires the shell to be in its default editing mode, that is, the emacs mode. Please make sure you haven’t put readline or bash in vi mode before trying out MisTTY.
To turn on vi mode in readline everywhere but MisTTY, you can add
something like the following into ~/.inputrc:
$if term=eterm
set editing-mode emacs
$else
set editing-mode vi
$endif
Or, in bash ~/.bashrc:
if [ "$TERM" != "eterm-color" ]; then
set -o vi
fi
Fancy prompts in Bash
MisTTY is compatible with stylized prompts, such as those produced by powerline-go. However, given the numerous variations in how these prompts are created, issues may arise.
If you suspect that your shell prompt may be causing problems, try configuring your shell to send out OSC 133 codes to help MisTTY correctly identify your prompt. Assuming you have a working PS1 already, OSC 133 support can be added with:
PS1='\[\e]133;A\007\]'$PS1'\[\e]133;B\007\]'
If you forget to put the OSC sequences in PS1 within \[...\], Bash
might be confused by the OSC sequences and you might have strange
issues when exiting reverse-i-search.
Fish
A recent version of Fish is preferable. MisTTY relies on bracketed paste mode, on by default, so it should not be turned off.
Autosuggestions in Fish
fish autosuggestions work normally in MisTTY. However, the usual way of accepting an autosuggestion, pressing the right arrow key, is very inconvenient as this is bound to an Emacs point movement.
The recommended way of accepting an autosuggestion in MisTTY is to type C-e. This works in normal terminals as well.
Command History in Fish
To make full use of fish command history, you’ll want to forward some additional shortcuts to fish:
(keymap-set mistty-prompt-map "M-<up>" #'mistty-send-key)
(keymap-set mistty-prompt-map "M-<down>" #'mistty-send-key)
(keymap-set mistty-prompt-map "M-<left>" #'mistty-send-key)
(keymap-set mistty-prompt-map "M-<right>" #'mistty-send-key)
This can also be done by calling use-package as shown in
Installation.
When in reverse history search mode, fish enters a mode that lets you select an option using the arrow keys. To send up/down/left/right directly to fish, you can:
use M-p to go up and M-n to go down, or, if you prefer
use C-q <up> C-q <down> C-q <left> C-q <right>, or even
C-c C-q to temporarily send all send key presses to fish
Directory tracking in Fish
Starting with version 4.0.0, Fish sends out an OSC7 sequence by default, so directory tracking doesn’t require any configuration.
For older versions of fish, extend your prompt to send out an OSC7
sequence to have fish send the current directory and
hostname to MisTTY. To do that, you might add the following to
~/.local/config/fish/config.fish:
if [ "$TERM" = "eterm-color" ]
function osc7_send_pwd --on-event fish_prompt
printf "\e]7;file://%s%s\e\\\\" (hostname) "$PWD"
end
end
such sequence are either ignored or understood by most terminals. You might already have it set up.
Multi-line prompts in Fish
fish automatically detects when a command is incomplete when you type RET and launches a multi-line prompt, which MisTTY knows to navigate.
The cursor jumps over indent space while on such a prompt, just like in a normal terminal. M-x customize-option mistty-skip-empty-spaces allows you to turn that on or off in a MisTTY buffer.
VI mode in Fish
To communicate with fish, MisTTY requires the shell to be in its default editing mode, that is, the emacs mode. Please make sure you haven’t put readline or bash in vi mode before trying out MisTTY.
To turn on vi mode in readline everywhere but in MisTTY, you can add
something like the following in ~/.zshrc:
if [ "$TERM" != "eterm-color" ]
fish_vi_key_bindings
end
Fancy prompts in Fish
MisTTY is known to work with powerline-shell prompts or Tide, on Fish, including right prompts.
If you suspect that your shell prompt may be causing problems, try configuring your shell to send out OSC 133 codes to help MisTTY correctly identify your prompt.
Zsh
A recent version of Zsh is preferable.
Zsh supports bracketed paste, which MisTTY relies on, since version 5.1. Older versions will work, but with limitations, and you might get unexpected results if you yank text containing special characters.
Autosuggestions in Zsh
Fish-like zsh autosuggestions work normally in MisTTY, if you’ve turned these on. However, the usual way of accepting an autosuggestion, pressing the right arrow key, is very inconvenient as this is normally bound to an Emacs point movement.
The recommended way of accepting an autosuggestion in MisTTY is to type C-e. This works in normal terminals as well.
Directory tracking in Zsh
Extend your prompt to send out an OSC7 sequence to have
zsh send the current directory and hostname to MisTTY. To
do that, you might add the following to ~/.zshrc:
function osc7_precmd() {
printf "\e]7;file://%s%s\e\\\\" "$HOSTNAME" "$PWD"
}
precmd_functions+=(osc7_precmd)
Such sequence are either ignored or understood by any well-behaved terminals, so you shouldn’t need to check the terminal.
Multi-line prompts in Zsh
When you press RET on an incomplete command, zsh has the annoying habit of starting a secondary prompt. MisTTY doesn’t know how to go back to the previous prompt from such a prompt.
To work around that, type S-<return> instead of RET while on the terminal zone of a MisTTY buffer. This sends a newline without running the command. You’ll then end up with one multi-line prompt that you can edit normally. This requires a version of Zsh that supports bracketed paste mode, 5.1 or later.
You’ll get the same effect if you yank a multi-line command while in a prompt or go up the command history to a previous multi-line command.
Please be aware that when editing a multi-line command in Zsh, MisTTY may leave trailing spaces at the end of some lines. In situations where these are significant, you will need to remove trailing spaces using C-d or DEL.
VI mode in Zsh
To communicate with zsh, MisTTY requires the shell to be in its default editing mode, that is, the emacs mode. Please make sure you haven’t put readline or bash in vi mode before trying out MisTTY.
To turn on vi mode in readline everywhere but in MisTTY, you can add
something like the following in ~/.zshrc:
if [ "$TERM" != "eterm-color" ]; then
bindkey -v
fi
Fancy prompts in Zsh
MisTTY is compatible with right prompts and fancy multi-line prompts, such as the ones created by powerlevel10k, though there are some limitations.
Transient prompts can interfere with MisTTY’s commands, such as mistty-previous-output (C-c C-p) and mistty-create-buffer-with-output (C-c C-r). If these commands are important to you, disable transient prompts when TERM is set to eterm-color.
When using a multi-line prompt, to ensure proper functionality, configure your shell to send OSC 133 (Final Term) codes, at least A and C, so MisTTY correctly recognizes the beginning and end of the prompt. See OSC 133
The minimum configuration that would help MisTTY might look like this:
function osc133_precmd() {
printf '\033]133;A\007'
}
precmd_functions+=(osc133_precmd)
function osc133_preexec() {
printf '\033]133;C\007'
}
preexec_functions+=(osc133_preexec)
If you suspect that your shell prompt may be causing problems, try configuring your shell to send out OSC 133 codes to help MisTTY correctly identify your prompt.
IPython
Editing, and cursor movements should work out of the box with ipython, even in multi-line commands, provided you use the default prompts.
If you modified the ipython prompts, you’ll need to teach MisTTY about these prompts for multi-line movement and editing to work.
Go to M-x configure-option mistty-move-vertically-regexps and add to the list a regular expression that matches your prompt. Make sure that your regular expression is specific to your IPython prompt, as mistakenly matching with bash or zsh would have rather catastrophic results.
Go to M-x configure-option mistty-multi-line-continue-prompts and add to the list a regular expression that matches your IPython continue prompt, that is, the prompt that IPython adds to the second and later lines of input. Again, be specific. The regular expression shouldn’t match any other prompts. You don’t need to do anything here if you configured IPython to not output any continue prompt.