Eu encontrei uma solução decente para isso e o envolvi como um script simples: is_mosh :
#!/bin/bash
has_ancestor_mosh() {
pstree -ps $1 | grep mosh-server
}
is_mosh() {
# argument handling
for arg in "$@"; do
case $arg in
-v|--verbose) local VERBOSE=YES ;;
*) ;;
esac
done
if [[ -n "$TMUX" ]]; then
# current shell is under tmux
local tmux_current_session=$(tmux display-message -p '#S')
local tmux_client_id=$(tmux list-clients -t "${tmux_current_session}" -F '#{client_pid}')
# echo $tmux_current_session $tmux_client_id
local pid="$tmux_client_id"
else
local pid="$$"
fi
local mosh_found=$(has_ancestor_mosh $pid) # or empty if not found
if [[ -z "$mosh_found" ]]; then
return 1; # exit code 1: not mosh
fi
test -n "$VERBOSE" && echo "mosh"
return 0; # exit code 0: is mosh
}
sourced=0
if [ -n "$ZSH_EVAL_CONTEXT" ]; then
case $ZSH_EVAL_CONTEXT in *:file) sourced=1;; esac
elif [ -n "$BASH_VERSION" ]; then
[ "$0" != "$BASH_SOURCE" ] && sourced=1
else
case ${0##*/} in sh|dash) sourced=1;; esac
fi
if [[ $sourced == 0 ]]; then
is_mosh $@
fi
A idéia é bem simples: (i) encontrar o cliente tmux que está anexado à sessão tmux atual e, em seguida, (ii) procurar seus processos ancestrais para descobrir se existe um processo mosh.
Pode não estar completo, dependendo dos ambientes, mas eu consegui detectar e aplicar com êxito o recurso de cores de 24 bits somente se não estiver sendo executado em mosh (como mosh não suporta cores de 24 bits ). Aqui está uma solução (adicione estas linhas ao seu ~/.vimrc
):
" 24-bit true color: neovim 0.1.5+ / vim 7.4.1799+
" enable ONLY if TERM is set valid and it is NOT under mosh
function! s:is_mosh()
let output = system("is_mosh -v")
if v:shell_error
return 0
endif
return !empty(l:output)
endfunction
function s:auto_termguicolors()
if !(has("termguicolors"))
return
endif
if (&term == 'xterm-256color' || &term == 'nvim') && !s:is_mosh()
set termguicolors
else
set notermguicolors
endif
endfunction
call s:auto_termguicolors()