Uma versão recente do vim introduziu o :terminal
comando, que inicia um terminal em um novo painel de edição.
Existe uma maneira de identificar esses shells lançados a partir de shells vim vs. regulares lançados pelo xterm / urxvt / gnome-terminal?
Uma versão recente do vim introduziu o :terminal
comando, que inicia um terminal em um novo painel de edição.
Existe uma maneira de identificar esses shells lançados a partir de shells vim vs. regulares lançados pelo xterm / urxvt / gnome-terminal?
Respostas:
Desde o patch do Vim 8.1.049 , o Vim exporta a VIM_TERMINAL
variável de ambiente com o valor de v:version
. Antes disso, você só poderia contorná-lo obtendo as informações da árvore de processos ou, possivelmente, mas não à prova de erros, testando as variáveis $VIM
e de $VIMRUNTIME
ambiente.
ps
Você precisa investigar se o processo pai do shell é vim
. Isso funciona no meu Debian 9:
pid=1234 # specify PID of the shell in question
ps -o comm= "$(ps -o ppid= "$pid")"
onde ps -o ppid= "$pid"
retorna o ID do processo pai. Note que se não houver um processo com PID de $pid
, o comando inteiro se tornará ps -o comm= ""
inválido e causará um erro.
Isso pressupõe que você conhece o PID certo. Por exemplo, você pode iterar sobre a saída de pidof bash
:
for pid in $(pidof bash); do ps -o comm= "$(ps -o ppid= "$pid")" 2>/dev/null; done
Dentro do próprio shell o PID direito é $$
, então o acima simplifica para
ps -o comm= "$(ps -o ppid= "$$")" # non-optimal though, see below
Mas também existe $PPID
. Ele é configurado pelo shell para o valor de seu ID do processo pai durante a inicialização do shell. Portanto, isso deve ser quase equivalente:
ps -o comm= "$PPID"
Quase, porque em geral, se o processo pai morre e o shell sobrevive (isso é possível), o shell órfão receberá um novo pai. Isso será refletido, ps -o ppid= "$$"
mas não por echo "$PPID"
, eu acho. No seu caso, a discrepância não deve importar, porque:
vim
, então a conclusão final será "não um terminal vim" de qualquer maneira.vim
matar os shells iniciados :terminal
quando sai (não posso confirmar isso no momento), então o ponto acima é irrelevante.vim
seja morta com força (por isso não pode enviar sinais para os seus filhos), a shell irá sair de qualquer forma. Portanto, os pontos acima são irrelevantes.Portanto, acho que é seguro assumir que as abordagens com e sem $PPID
são equivalentes na prática.
Note, dependendo da sua configuração e de como você começou vim
, ps -o comm= ...
pode não retornar a vim
string literal . Por exemplo, pode ser vim.basic
, vim.gtk3
ou qualquer outra coisa.