O que: open do no vim?

18

A documentação do Vim tem a dizer sobre o :opencomando:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

Não comenta a natureza da "simulação" e por que isso é considerado uma simulação, e não um comando real com comportamento diferente. Quando executado no modo ex (Q), ele realmente se comporta como descrito.

No entanto, também parece haver um comando aberto diferente. Quando executado a partir da linha de comando normal ou do modo ex com argumentos diferentes, parece ser um sinônimo :edit. Quando executado a partir do modo de comando com a /pattern/, ele posiciona o cursor e, aparentemente, é executado :edit(com a posição do cursor sendo evidente apenas se: a edição falhar.) Também pode ser executado como :open /pattern/ file, que posiciona o cursor e é executado:edit file

Minha pergunta é: Por que isso não está documentado? Há alguma diferença :editdisso que eu não estou percebendo? Era :openuma vez um sinônimo :edite somente foi alterado posteriormente, na tentativa de cumprir parcialmente com o POSIX?

Random832
fonte

Respostas:

13

O "modo aberto" do vi foi útil para terminais que tinham uma única linha, como terminais de cópia impressa. No modo aberto, o vi tinha uma "visualização de linha única" do arquivo. Mover o cursor para redesenhar toda a linha e os caracteres excluídos são impressos de maneira diferente.

A "simulação" que o vim faz é simplesmente dar suporte ao comando, fazendo-o agir (como a documentação diz) :visuale como :visualé "de outra forma o mesmo que :edit", provavelmente é por isso que você o vê agindo assim :edit.

Do ponto de vista do código fonte, :opené implementado em ex_docmd.c( ex_open()). Ele faz algumas coisas para lidar com o caso em que é fornecida uma expressão regular, mas sempre termina com uma chamada para do_exedit().

A implementação de :edit, :badde :visualestá contida na ex_edit()função no mesmo arquivo, e essa função é uma chamada direta para do_exedit()(nada mais). Portanto, além de manipular o parâmetro de expressão regular, o mesmo código é chamado. do_exedit()é um pouco cabeludo e seu comportamento é fortemente modificado com base no comando real que foi emitido, mas nunca verifica explicitamente os tokens de comando para abrir / editar / visual. Assim, os três comandos resultam em mais ou menos o mesmo código sendo executado do_exedit().


fonte
8

De uma introdução à edição de exibição com o Vi :

Se você estiver em um terminal de cópia impressa ou em um terminal que não possua um cursor que possa sair da linha inferior, ainda será possível usar o conjunto de comandos vi, mas em um modo diferente. Quando você dá um comando vi, o editor diz que ele está usando o modo aberto. Esse nome vem do comando open no ex, que é usado para entrar no mesmo modo.

A única diferença entre o modo visual e o modo aberto é a maneira como o texto é exibido.

No modo aberto, o editor usa uma única janela de linha no arquivo e mover para trás e para frente no arquivo faz com que novas linhas sejam exibidas, sempre abaixo da linha atual. Dois comandos do vi funcionam de maneira diferente em aberto: z e ^ R. O comando z não aceita parâmetros, mas desenha uma janela de contexto em torno da linha atual e, em seguida, retorna à linha atual.

Se você estiver em um terminal de cópia impressa, o comando ^ R redigitará a linha atual. Nesses terminais, o editor normalmente usa duas linhas para representar a linha atual. A primeira linha é uma cópia da linha quando você começou a editá-la e trabalha na linha abaixo dessa linha. Quando você exclui caracteres, o editor digita um número de \ 's para mostrar os caracteres que foram excluídos. O editor também reimprime a linha atual logo após essas alterações, para que você possa ver como é a linha novamente.

Às vezes, é útil usar esse modo em terminais muito lentos, que podem suportar o vi no modo de tela cheia. Você pode fazer isso digitando ex e usando um comando aberto.

:opené um artefato de origem de Vim como um clone do Vi que é completamente inútil hoje. Só posso assumir que ele permanece lá para compatibilidade com POSIX.

Apesar de semelhanças vagas, não:open é uma alternativa para qualquer extensão da imaginação.:edit

romainl
fonte