Como diferenciar o terminal vim do terminal regular no bash?

1

Uma versão recente do vim introduziu o :terminalcomando, 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?

Stack Tracer
fonte

Respostas:

3

Desde o patch do Vim 8.1.049 , o Vim exporta a VIM_TERMINALvariá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 $VIMe de $VIMRUNTIMEambiente.

Christian Brabandt
fonte
2

Abordagem geral com 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

De dentro da própria casca

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:

  1. Se a casca sobreviver, apesar das duas abordagens produzirem resultados diferentes, nenhum dos resultados será vim, então a conclusão final será "não um terminal vim" de qualquer maneira.
  2. Espero vimmatar os shells iniciados :terminalquando sai (não posso confirmar isso no momento), então o ponto acima é irrelevante.
  3. Espero que qualquer shell interativo saia sozinho quando perder seu terminal de controle; por isso, mesmo que a expectativa anterior esteja errada ou apenas vimseja 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 $PPIDsã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 vimstring literal . Por exemplo, pode ser vim.basic, vim.gtk3ou qualquer outra coisa.

Kamil Maciorowski
fonte