Estou tentando mudar para um fluxo de trabalho usando principalmente less
quando quero apenas ler o código e, em seguida, usando v
para alternar para um editor quando quero editar o documento. Isso é menos GNU no OS X, mas acho que generaliza para outros sistemas.
Se eu definir VISUAL
para vim -u NONE
que o vim não leia nenhum de seus arquivos de inicialização ou use outro editor que inicie instantaneamente como nano
ou joe
ou ne
, não haverá pausa perceptível entre pressionar v
e fazer com que o arquivo apareça no editor.
Por exemplo, isso funciona bem:
$ previous-command > foo.txt
$ VISUAL='vim -u NONE' less foo.txt
veja o arquivo em less
, role até a linha interessante e pressione v
, o arquivo é instantaneamente visível dentro vim
.
Apenas para ilustrar o ponto, aqui está o que acontece se definirmos VISUAL
como sleep 1; vim
.
$ another-previous-command > foo.txt
$ VISUAL='sleep 1; vim -u NONE' less foo.txt
agora estamos visualizando o arquivo, então pressionamos v
para editá-lo.
A sessão do shell agora está visível novamente por um segundo e então vemos:
$ another-previous-command > foo.txt
$ VISUAL='sleep 1; vim -u NONE' less foo.txt
Depois que o segundo passou, vemos o conteúdo de foo.txt
dentro do vim.
Apenas usando vim
por si só, sem argumentos de linha de comando adicionais, lê arquivos e faz algum trabalho de inicialização. Isso leva uma fração de segundo, mas o tempo suficiente para que a sessão de shell subjacente fique visível, como no caso de sleep 1; <VIM COMMAND>
.
Existe uma maneira de transferir o controle de less
para vim
de forma que a sessão do shell subjacente não seja visível, mesmo que parcialmente?
A opção de Less
-X
desativa a inicialização e a desinicialização do terminal, então é isso que está causando o flash. Muito provavelmenteless
está usando o recurso de tela alternativa do seu emulador de terminal. Se for o Terminal.app do Mac OS X, aparentemente você pode alternar manualmente entre a tela alternativa . (XTerm permite que você alterne manualmente também).Agora, o que é a tela alternativa e por que menos a usa? Razões históricas, na verdade. Os emuladores de terminal fingem ser terminais - dispositivos de exibição de hardware reais que foram usados desde os primeiros dias da computação (mas agora bastante raros). Um programa se comunica com um emulador de terminal quase que inteiramente emitindo caracteres; certos caracteres especiais são designados como caracteres de controle e fazem coisas como mover o cursor, limpar a tela, alterar as cores, etc. Ao contrário de um framebuffer moderno, é difícil ou impossível para um programa descobrir o que o terminal está exibindo no momento. (Na verdade, se fosse possível, teria que ser feito enviando uma seqüência de controle que faria o terminal enviar a resposta de volta como se o usuário a tivesse digitado; realmente não há outra maneira de os dados irem do terminal ao programa).
Então, se você quiser restaurar a tela (por exemplo, veja os comandos que você digitou) depois de exibir outra coisa, você precisa do terminal para fazer isso. A maioria dos emuladores de terminal permite que você salve pelo menos uma tela alternando para a tela alternativa. Você notará quando (por exemplo) executar
echo hello | less
que, depois de fechar menos, você voltará à tela do bash, inalterado. Isso porque less mudou para a tela alternativa e exibiu "hello" lá; então quando você desligou, ele voltou. Se você executarecho hello | less -X
, o comportamento será muito diferente (ele também pula a parte de limpar a tela do init, então você acaba com seu arquivo iniciando após o prompt - tente control-L para forçar uma tela limpa e redesenhar). E quando você sair menos, seu histórico de shell não será mais exibido.Nota lateral aleatória,
less -FX
é uma combinação útil.De qualquer forma, o flash que você está vendo é o seguinte: quando o less inicia o editor, ele primeiro precisa retornar o terminal ao estado "normal" - parte disso é sair da tela alternativa. Isso é o que você está vendo. (Uma vez que o vim é iniciado, é claro que ele volta para a tela alternativa - mas menos não tem como saber isso.)
Veja também: Como configurar a restauração de tela em um terminal?