Digamos que eu tenho um servidor X11 pendurado, impedindo-me de salvar o trabalho da sessão do XTerm Vim que o servidor X11 controla. (Não GVim, apenas Vim-in-XTerm regular.)
Existe uma maneira que eu poderia (de um terminal diferente) dizer ao processo Vim em execução para "salvar tudo e sair" na linha de comando? Enviando um sinal ou através de outros meios?
Eu sei sobre os arquivos de troca do Vim, e que eu poderia simplesmente matar o Vim e me recuperar da troca. Estou perguntando se existe uma maneira "mais limpa".
Respostas:
Tendo recentemente encontrado esse problema (de outra maneira: o Vim rodando em um servidor remoto e esqueci a tela), decidi procurar uma maneira.
A primeira idéia foi procurar os descritores de arquivo usados pelo Vim e tentar escrever nele. Os fds de Vim apontam para o psedoterminal aberto pelo emulador de terminal, naturalmente:
No entanto, minhas primeiras tentativas falharam:
O
^[
e^M
foram obtidos por CtrlVEsce CtrlVEnter, respectivamente.Todos eles resultaram nos caracteres aparecendo no terminal (eu estava testando isso localmente, antes de aplicá-lo à sessão remota). Pesquisando, encontrei este post do SO , usando Python para escrever no dispositivo pseudoterminal:
E testá-lo em um shell python interativo funcionou:
Feito!
fonte
Você pode enviar comandos para o vim externamente se estiver executando ...
Servidores Vim
Por exemplo, fazendo:
fará com que o vim inicie um servidor com o nome "vim". Chame duas vezes e o novo servidor será chamado "vim1", três vezes e "vim2" etc. Você pode querer criar um apelido para esse comando.
Você pode saber em qual servidor uma instância específica é nomeada olhando o título da janela. Quando você vê:
o nome do servidor não diferencia maiúsculas de minúsculas "VIM3" ("vim3" se refere à mesma instância.). Observe que se você vir:
isso não significa necessariamente que ele tenha um servidor chamado "VIM". Você pode garantir que o servidor exista listando os nomes dos servidores com:
Ainda assim, a questão surge apenas para o "VIM", especificamente. Se você vir "GVIM" ou algum outro nome com um número anexado, significa que é um servidor.
Como usar o cliente
Agora, na sua pergunta, você pode salvar tudo e sair de uma determinada instância do vim fazendo, por exemplo:
Usamos o escape para retornar ao modo normal, caso você esteja no modo de inserção ou comando. Você pode fazer algo diferente
:wqa
, mas isso parece o mais apropriado para mim, porque deixará os arquivos de troca de buffers que não puderam ser salvos (porque são novos e não têm um nome de arquivo etc.).Se você quiser fazer isso para todas as instâncias como no seu caso aqui, basta percorrer a lista de servidores da seguinte maneira:
Se, por algum motivo, você não gostar
--remote-send
, poderá usar a--remote-expr
que tem a vantagem de fazer com que o cliente produza o resultado ou o erro que ele possa ter causado, da seguinte forma:Observe que o uso da funcionalidade do servidor do Vim requer que o Vim tenha sido construído com a
+clientserver
opçãofonte
Instale o
reptyr
comando usando o gerenciador de pacotes do sistema, como:Em seguida, use o
reptyr
comando para alternar o tty remoto para o local (novo) tty, da seguinte maneira:Onde
PID
está o ID do processo naps
saída do comando.Após o erro:
Altere o "escopo ptrace" para 0:
Depois que a sessão do vim tiver sido trocada da sessão antiga para a nova, salve e saia como de costume. Observe que você pode ter que pressionar Enterpara atualizar o console.
fonte
E se você graciosamente matar o Vim?
kill -s 15 -p [PID for Vim]
O kill -s (sinal) 15 é chamado SIGTERM, que informa esse processo para se desligar normalmente.
Para obter o PID (Process ID) do Vim, use:
ps ax | grep vim
fonte