Terminal e Vim

7

Eu abro um terminal e abro o Vim. Então eu trabalho no meu código-fonte, mas infelizmente eu clico no botão fechar da barra de título do terminal e meu trabalho está perdido. É possível configurar o Vim de tal forma que ele me diga quando estou tentando fechar o terminal sem salvar meu trabalho?

Obrigado!

    
por Benjamin 23.02.2012 / 21:33

6 respostas

15

Não há como vim saber antecipadamente que o processo dos avós (o terminal) é eliminado, de modo que normalmente ele é eliminado como resultado da eliminação dos processos pai.

No entanto, na maioria das configurações padrão vim criará um arquivo .swp com o nome do arquivo atual sendo editado; por exemplo MyPrecious.java.swp . Este arquivo deve conter um instantâneo do arquivo MyPrecious.java antes do processo vim ser eliminado. A menos que você tenha configurado vim para colocar especificamente esses arquivos .swp em algum outro diretório, eles devem residir no mesmo diretório que o arquivo editado e você pode facilmente restaurar seu trabalho de edição.

Observe que alguns desses arquivos começam com um ponto . , portanto, eles ficam invisíveis, a menos que você use ls -a para listar os arquivos em um diretório.

    
por 23.02.2012 / 21:46
11

Olhando para o problema de um ângulo diferente, screen ou tmux permitirá que você mantenha seu shell independente de seu terminal. Quando você fecha o terminal, você pode abrir um novo e reconectar ao shell original. O Vim ainda estará funcionando.

    
por 24.02.2012 / 00:46
7

vim não tem controle sobre como a GUI do seu terminal manipula WM_DELETE_WINDOW . Em vez disso, procure uma configuração em seu terminal que controle como o terminal age quando solicitado a fechar quando tiver um shell com crianças.

    
por 23.02.2012 / 21:37
4

Existe uma maneira para o Vim saber que o terminal foi fechado: o sinal SIGHUP .

Quando você fecha um terminal, o SIGHUP sinal é enviado para o processo de controle , que geralmente é o seu shell. Seu shell deve então sair, fazendo com que o Vim receba o sinal SIGHUP . Por padrão, os processos simplesmente terminam quando recebem o sinal SIGHUP .

Eu não estou familiarizado com o Vim, mas talvez ele possa ser configurado para salvar todo o trabalho antes de sair quando um sinal SIGHUP for recebido. Se não, talvez você possa definir um shell trap em SIGHUP , talvez em combinação com a execução do Vim com nohup , para executar um comando especial que de alguma forma faz com que o Vim saia mais graciosamente quando o terminal estiver fechado.

    
por 29.02.2012 / 01:09
1

Como outros afirmaram, o vim não pode reagir a tal evento. Mas você pode considerar uma dessas soluções:

  • Usando gvim em vez de vim , que também pode ser invocado na linha de comando. Um alias pode ajudar a ajustar o switch (assumindo o shell compatível com o bash): alias vim=gvim . Declarar o gvim como seu editor preferido também pode ajudar: export EDITOR=gvim . Isso funciona apenas em uma máquina local.
  • O uso de um muxer de terminal (como tmux ou screen ) já foi mencionado.
  • Configurando seu terminal (o que for) para confirmar que você deseja fechá-lo. Isso vai surpreender você nas primeiras vezes, o que deve forçá-lo a pensar antes de fechar seu terminal a longo prazo.
por 24.02.2012 / 12:07
1

Isso veio a mim depois que eu fiz a pergunta em outro fórum AskUbuntu: vim .desktop - alterações perdidas quando o terminal sai e muitos arquivos *.desktop experimentais demonstrando que gnome-terminal permitiria que vim fosse eliminado sem aviso, mesmo se estivesse sendo executado em um shell & mesmo que houvesse outros comandos antes ou depois dele para bash ou gnome-terminal serem executados.

Um shell "interativo" ( bash -i ) soou certo para invocar o aviso do GNOME ao fechar a janela, com base na mensagem de aviso literal:

Close this terminal? There is still a process running in this terminal. Closing the terminal will kill it.

mas adicionando a opção -i ao bash, como executado a partir do arquivo *.desktop , parou o GNOME de abrir uma janela no meu teste (com o Ubuntu 16.04 - gnome-terminal 3.18.3). Então, em vez disso, tentei invocar o shell interativo de um script de wrapper, e essa foi uma solução completa:

/usr/local/bin/vim-gnome-wrap

#!/bin/bash -f
bash -ic 'vim "$@"' vim "$@"

... edite /usr/share/applications/vim.desktop ou copie-o para um novo arquivo *.desktop , com estas alterações:

TryExec=vim-gnome-wrap
# It doesn't open window for interactive shell when GNOME arranges the terminal:
# Terminal=true
# Exec=vim-gnome-wrap %F
# ... yet it does so when gnome-terminal is run explicitly:
Terminal=false
Exec=gnome-terminal -e "vim-gnome-wrap %F"

Isso fornece um aviso ao fechar a janela se o buffer vim tiver alterações não salvas ou não, e funciona em vários arquivos. Agradecimentos especiais a @muru abaixo por sugerir a sintaxe $@ , que preserva os argumentos exatamente (espaços e metacaracteres).

    
por 24.04.2016 / 16:00

Tags